python的列表生成式和生成器
1.列表生成式是Python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理,语法格式为:
[exp for val in collection if condition]
相当于
resul = []
for val in collection:
if(condition):
result.appen(exp)
例子:求1到10的偶数的平方,代码如下:
li = [x*x for x in xrange(1,11) if x%2==0]
print (li)
结果:[4, 16, 36, 64, 100]
解释:
- 依次取出xrange(1,11)从1到10的数字
- 判断x*x是偶数,就保留,存在新的列表里
- 把所有符合x*x是偶数的元素都放到新的列表中返回
2.生成器
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。
要创建一个generator,有很多种方法,第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
lt = (x*x for x in xrange(1,10) if x%2 == 0)
print (lt)
print (type(lt))
for i in lt:
print (i)
可以通过调用next()函数打印出来。但正确的方法是使用for循环。结果:
第二种方法就是使用yield关键字来定义,例子:
def funb(n):
sum = 0
i = 0
while(i<n):
sum = sum +i
i+=1
yield(sum)
print (type(funb(10)))
for x in funb(10):
print (x)
结果:
解释:函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
小结:generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
3.生成式和生成器的区别
生成式:一次性生成所有的数据,然后保存在内存中,适合小量的数据
生成器:返回一个可迭代对象及generator对象,必须通过循环才可以一一取出所有的结果
可迭代对象:可以通过循环调用出来的,就是可迭代的对象,比如list,tuple,dict,生成式,生成器
迭代器:被next()函数调用并不断返回下一个值的对象称为迭代器
最新文章
- 敏捷转型历程 - Sprint3 一团糟的演示会
- 用EXCEL内嵌的Visual Basic for Application 编程,通过 UGSimple USB-GPIB 控制器来驱动仪器34401A,并从34401A读取数据
- [Android Pro] 通过包名启动应用
- Mac系统安装jdk和maven
- Scrum Meeting 8-20151210
- 转 通过js获取cookie的实例及简单分析
- webBrowser1执行函数
- sv_target_output dx11
- 使用Spring时遇到的bug及解决
- 2016腾讯we大会的时间——2016年11月6日
- UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xef in position 99: invalid continuation byte
- Jenkins 使用Tfs 插件出现 MappingConflictException 错误问题解决
- Scala(三)
- sqlserver 脚本生成数据库文档
- selenium+python启动Firefox浏览器失败问题和点击登陆按钮无效问题
- <;context:annotation-config />;和 <;context:component-scan
- AES 加密问题
- [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM
- TL-WDR4310 v1 救砖
- VC调用QT的UIDLL