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()函数调用并不断返回下一个值的对象称为迭代器

最新文章

  1. 敏捷转型历程 - Sprint3 一团糟的演示会
  2. 用EXCEL内嵌的Visual Basic for Application 编程,通过 UGSimple USB-GPIB 控制器来驱动仪器34401A,并从34401A读取数据
  3. [Android Pro] 通过包名启动应用
  4. Mac系统安装jdk和maven
  5. Scrum Meeting 8-20151210
  6. 转 通过js获取cookie的实例及简单分析
  7. webBrowser1执行函数
  8. sv_target_output dx11
  9. 使用Spring时遇到的bug及解决
  10. 2016腾讯we大会的时间——2016年11月6日
  11. UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xef in position 99: invalid continuation byte
  12. Jenkins 使用Tfs 插件出现 MappingConflictException 错误问题解决
  13. Scala(三)
  14. sqlserver 脚本生成数据库文档
  15. selenium+python启动Firefox浏览器失败问题和点击登陆按钮无效问题
  16. &lt;context:annotation-config /&gt;和 &lt;context:component-scan
  17. AES 加密问题
  18. [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM
  19. TL-WDR4310 v1 救砖
  20. VC调用QT的UIDLL

热门文章

  1. Cordova各个插件使用介绍系列(八)—$cordovaCamera筛选手机图库图片并显示
  2. 视频SharePoint 2010 大局观 By 陈希章[zt]
  3. PostgresQL中的NUlls first/last功能
  4. Verilog三线 - 八线译码器
  5. C语言中的特殊变量
  6. POJ-3041 Asteroids---二分图&amp;最小覆盖点
  7. PHPmailer群发Gmail的常见问题
  8. Advanced Memory Allocation 内存分配进阶[转]
  9. apache以天为单位生成日志
  10. 不使用data-ng-app指令的表达式