python(九)

一 生成器初探

什么是生成器?

可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

为何使用生成器之生成器的优点

Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

生成器小结:

1.是可迭代对象

2.实现了延迟计算,省内存啊

3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处!

二 生成器表达式和列表解析

#三元表达式
name=‘alex‘
name=‘linhaifeng‘
res=‘SB‘ if name == ‘alex‘ else ‘shuai‘
print(res)

总结:

1.把列表解析的[]换成()得到的就是生成器表达式

2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

1 sum(x ** 2 for x in xrange(4))

而不用多此一举的先构造一个列表:

1 sum([x ** 2 for x in xrange(4)]

三 生成器总结


综上已经对生成器有了一定的认识,下面我们以生成器函数为例进行总结



  • 语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
  • 自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常
  • 状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行

优点一:生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

1 #列表解析
2 sum([i for i in range(100000000)])#内存占用大,机器容易卡死
3
4 #生成器表达式
5 sum(i for i in range(100000000))#几乎不占内存

优点二:生成器还能有效提高代码可读性

 1 #求一段文字中,每个单词出现的位置
 2 def index_words(text):
 3     result = []
 4     if text:
 5         result.append(0)
 6     for index, letter in enumerate(text, 1):
 7         if letter == ‘ ‘:
 8             result.append(index)
 9     return result
10
11 print(index_words(‘hello alex da sb‘))
#求一段文字中每个单词出现的位置
def index_words(text):
    if text:
        yield 0
    for index, letter in enumerate(text, 1):
        if letter == ‘ ‘:
            yield index

g=index_words(‘hello alex da sb‘)
print(g)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())#报错

这里,至少有两个充分的理由说明 ,使用生成器比不使用生成器代码更加清晰:

  1. 使用生成器以后,代码行数更少。大家要记住,如果想把代码写的Pythonic,在保证代码可读性的前提下,代码行数越少越好
  2. 不使用生成器的时候,对于每次结果,我们首先看到的是result.append(index),其次,才是index。也就是说,我们每次看到的是一个列表的append操作,只是append的是我们想要的结果。使用生成器的时候,直接yield index,少了列表append操作的干扰,我们一眼就能够看出,代码是要返回index。

这个例子充分说明了,合理使用生成器,能够有效提高代码可读性。只要大家完全接受了生成器的概念,理解了yield语句和return语句一样,也是返回一个值。那么,就能够理解为什么使用生成器比不使用生成器要好,能够理解使用生成器真的可以让代码变得清晰易懂。

注意事项:生成器只能遍历一次(母鸡一生只能下一定数量的蛋,下完了就死掉了)

 1 人口信息.txt文件内容
 2 {‘name‘:‘北京‘,‘population‘:10}
 3 {‘name‘:‘南京‘,‘population‘:100000}
 4 {‘name‘:‘山东‘,‘population‘:10000}
 5 {‘name‘:‘山西‘,‘population‘:19999}
 6
 7 def get_provice_population(filename):
 8     with open(filename) as f:
 9         for line in f:
10             p=eval(line)
11             yield p[‘population‘]
12 gen=get_provice_population(‘人口信息.txt‘)
13
14 all_population=sum(gen)
15 for p in gen:
16     print(p/all_population)
17 执行上面这段代码,将不会有任何输出,这是因为,生成器只能遍历一次。在我们执行sum语句的时候,就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。所以,上面的代码不会有任何输出。
18
19 因此,生成器的唯一注意事项就是:生成器只能遍历一次。
				
时间: 2024-11-05 20:43:00

python(九)的相关文章

python(九)re模块

python中re模块提供了正则表达式相关操作. 1. 字符串匹配: .    匹配除换行符以外的任意字符 \w 匹配字符或数字或下划线或汉字 \s  匹配任意空白字符 \d 匹配数字 \b 匹配单词的开始或结束 ^  匹配字符串的开始 $   匹配字符串的结束 2.字符串次数匹配: * 重复0次或多次 + 重复1次或多次 ?  重复0次或1次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 3.re模块的方法 方法一:match match:从起始位置开始匹配,匹配成功

Python 九、Python异常

一.python异常 1.Python异常 python运行时发生错误称作异常 语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译 逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成.计算或者输出结果需要的过程无法执行等 Python异常是一个对象,表示错误或意外情况 在Python检测到一个错误时,将触发一个异常 Python可以通过异常传导机制传递一个异常对象,发出一个异常情况出现的信号 程序员也可以在代码中手动触发异常 Python异常也可以理解为:程序出现了错

轻松自动化---selenium-webdriver(python) (九)

https://www.cnblogs.com/fnng/p/3238685.html 本节重点: 上传文件 文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路. 上传过程一般要打开一个本地窗口,从窗口选择本地文件添加.所以,一般会卡在如何操作本地窗口添加上传文件. 其实,在selenium  webdriver 没我们想的那么复杂:只要定位上传按钮,通send_keys添加本地文件路径就可以了.绝对路径和相对路径都可以,关键是上传的文件存在.下面通地例子演示. uplo

python爬虫积累(一)--------selenium+python+PhantomJS的使用

最近按公司要求,爬取相关网站时,发现没有找到js包的地址,我就采用selenium来爬取信息,相关实战链接:python爬虫实战(一)--------中国作物种质信息网 一.Selenium介绍 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试.换句话说叫 Selenium 支持这些浏览器驱动.Selenium支持

「UI 测试自动化selenium」汇总

<selenium 基础之java实现> selenium RC 环境配置 菜鸟学自动化测试(一)----selenium IDE 菜鸟学自动化测试(二)----selenium IDE 功能扩展 菜鸟学自动化测试(三)----selenium 命令 菜鸟学自动化测试(四)----selenium 命令之验证页面元素 菜鸟学自动化测试(五)-----selenium命令之定位页面元素 菜鸟学自动化测试(六)----selenium 命令之文字范本匹配 菜鸟学自动化测试(七)----seleni

234234

<div id="article_details" class="details"> <div class="article_title"> <span class="ico ico_type_Original"></span> <h1> <span class="link_title"><a href="/fgf00/

自定义OpenStack Horizon(Mitaka)

一.写在前面 这篇文章主要介绍了OpenStack Horizon官方介绍自定义配置,从而进行简单的翻译学习,这里主要基于目前最新的Mitaka来说明,提高自己在horizon组件开发方面的理解.因为时间仓促以及个人理解有限,固有错误的地方请指出,后续将会不定期的完善,近期将专门写一篇博文详细介绍自定义开发主题模版,谢谢! 如果转载,请保留作者信息. 邮箱地址:[email protected] 二.主题(Themes) Openstack Kilo 版本以来,OpenStack Dashboa

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

初学Python(九)——函数

初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x): if x>0: return x elif x<0: return -x else: pass #函数的调用 a = my_function(-1) b = my_function(2) c = my_function(0) print a,b,c #空函数,pass为占位符 def empt

python学习笔记九——文件与目录

1.python进行文件读写的函数是open或file类 mode:r  只读 r+   读写 w  写入,先删除原文件,再重新写入,如果文件没有则创建 w+  读写,先删除原文件,再重新写入,如果文件没有则创建(可写入和输出) a  写入,在文件末尾追加新的内容,文件不存在则创建 a+  读写,在文件末尾追加新的内容,文件不存在则创建 b  打开二进制文件,可与r,w,a,+结合使用 U  支持所有的换行符号,"\r","\n","\r\n"