一、生成器定义

通过列表生成表达式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

 >>> l = [x * x for x in range(10)]
>>> l
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1013e0780>

二、表达式生成器

创建l和g的区别仅在于最外层的[]和(),l是一个list,而g是一个generator。可以直接打印出l的每一个元素,打印出g的每一个元素需要使用next()函数。

 >>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1013e0780>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

 >>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81

首先generator是可迭代对象,所以可以使用for in循环遍历。该遍历的本质是for in循环内部调用next()函数获取每一个元素,并且捕获StopIteration异常,结束遍历。

三、函数生成器

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易。

 >>> def fib(max):
... n, a, b = 0, 0, 1
... while n < max:
... yield b
... a, b = b, a + b
... n += 1
... raise StopIteration('done')
...
>>> fib(6)
<generator object fib at 0x1013e0780>
>>> for i in fib(6):
... print(i)
...
1
1
2
3
5
8
>>> g = fib(6)
>>> while True:
... try:
... next(g)
... except StopIteration as e:
... print(e.value)
... break
...
1
1
2
3
5
8
done

最新文章

  1. 我的MYSQL学习心得(五) 运算符
  2. nginx简易教程
  3. php 月初,月末时间大统计
  4. 每天一个 Linux 命令(17):whereis 命令
  5. ---Java 678
  6. UTF8-GBK WideCharToMultiByte MultiByteToWideChar
  7. OSG绘制几何图形
  8. 网页优化URI(http URI scheme与data URI scheme)
  9. Linux下使用dnf包管理器安装异常后导致的clear不可用
  10. 为什么使用Redis
  11. PowerShell 中的目录文件管理
  12. PLAN :昔日未来
  13. js.map error
  14. iOS开发 Android开发 移动Web开发
  15. FreeMarker template error: The following has evaluated to null or missing: ==&gt; blogger.md [in template &quot;admin/about.ftl&quot; at line 44, column 84]
  16. [再寄小读者之数学篇](2014-06-20 求极限---Jordan 不等式的应用)
  17. 微信小程序wx.previewImage实用案例(交流QQ群:604788754)
  18. applium安装过程中遇到的问题及解决方法。
  19. uva12307(旋转卡壳)
  20. 第十五节,卷积神经网络之AlexNet网络详解(五)

热门文章

  1. EBS OAF开发中怎样实现功能页签(Global Tab)
  2. push代码到github时,每次都要输入用户名和密码的问题
  3. 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
  4. 在OpenStack中绕过或停用security group (iptables)
  5. ajax的异步操作及页面重定向跳转
  6. Tomcat 安装与配置规范
  7. 网页 H5“线条” 特效实现方式(canvas-nest)
  8. 李雅普诺夫函数 LyapunovFunction 李雅普诺夫意义下的稳定性
  9. iOS的基本框架
  10. redis07-----Redis持久化配置