python生成器讲解1
什么是生成器
我们可以用列表生成式很方便地创立一个列表,如以下代码:
In [1]: l = [ x*2 for x in range(5) ]In [2]: lOut[2]: [0, 2, 4, 6, 8]
假如要创立的是一个1000万个元素的列表呢?不可能用以上的方式,即便你的电脑性能强劲,内存足够使用,也不是这么使用来白费的。好比,你不可能使用一个大桶来装一茶杯的水。
怎么才能满足既能实现我们的需求,又不占使用大量的内存?假如储存的只是生成列表的算法,而不是具体的值,即可以实现了。
这种存储算法的数据结构就称为生成器。
创立生成器有以下几种方法
将列表生成式的[]改成()
In [3]: l = ( x*2 for x in range(5) )In [4]: lOut[4]: <generator object <genexpr> at 0x103ca38b8> # 生成器
打印生成器看到的只是数据类型,而不是具体的值。需要用next()函数取得生成器的下一个返回值
In [5]: next(l)Out[5]: 0In [6]: next(l)Out[6]: 2In [7]: l.__next__()Out[7]: 4
next() 与 生成器的 next() 方法作使用相同
假如 next() 超出了生成器的数据范畴,会怎么?
In [9]: next(l)Out[9]: 6In [10]: next(l)Out[10]: 8In [11]: next(l)---------------------------------------------------------------------------StopIteration Traceback (most recent call last)<ipython-input-11-cdc8a39da60d> in <module>()----> 1 next(l)StopIteration:
当超出生成器的计算范畴,会抛出 StopIteration 异常
假如生成器的数据是使用 next() 一个个调使用,那会让人无比烦躁,而且还得谨防 StopIteration 异常。实际开发中,我们是使用 for 去循环调使用生成器
In [15]: l = ( x*2 for x in range(5) )In [16]: for x in l: ...: print(x) ...:02468
使用 yield 创立生成器
生成斐波拉契函数
In [18]: def fib(times): ...: n = 0 ...: a, b = 0, 1 ...: while n < times: ...: print(b) ...: a, b = b, a+b ...: n += 1 ...: return 'done' ...: ...:In [19]: fib(5)11235Out[19]: 'done'In [20]: def fib(times): ...: n = 0 ...: a, b = 0, 1 ...: while n < times: ...: yield(b) # 将print改为yield, 函数就成为了生成器 ...: a, b = b, a+b ...: n += 1 ...: return 'done' ...: ...:In [21]: F = fib(5)In [22]: next(F)Out[22]: 1In [23]: next(F)Out[23]: 1In [24]: next(F)Out[24]: 2In [25]: next(F)Out[25]: 3In [26]: next(F)Out[26]: 5In [27]: next(F)---------------------------------------------------------------------------StopIteration Traceback (most recent call last)<ipython-input-27-372178f5f53b> in <module>()----> 1 next(F)StopIteration: doneIn [28]: FOut[28]: <generator object fib at 0x103ca3570> # 生成器
用for循环迭代生成器
In [7]: for x in fib(5): ...: print(x) ...:11235
for循环调使用能将结果输出,可是并没有捕获到fib()的return值。返回值其实是包含在StopIteration的value中,因而必需捕获StopIteration异常
In [8]: F = fib(5)In [9]: while True: ...: try: ...: x = next(F) ...: print(x) ...: except StopIteration as e: ...: print('返回值是:%s' %e.value) ...: break ...:11235返回值是:done
yield的执行流程
In [20]: def fib(times): ...: n = 0 ...: a, b = 0, 1 ...: while n < times: ...: print('%s_before_yield' %n) ...: yield(b) # 将print改为yield, 函数就成为了生成器 ...: print('%s_after_yield' %n) ...: a, b = b, a+b ...: n += 1 ...: return 'done' ...: ...:In [21]: F = fib(5)In [22]: next(F)0_before_yield Out[22]: 1 # 执行到yield, 程序停住,不再往下执行,并记住当前的执行位置In [23]: next(F)0_after_yield1_before_yieldOut[23]: 1 # 从上一处的停顿往下继续执行,同样到yield处继续停住In [24]: next(F)1_after_yield2_before_yieldOut[24]: 2In [25]: next(F)2_after_yield3_before_yieldOut[25]: 3In [26]: next(F)3_after_yield4_before_yieldOut[26]: 5In [27]: next(F) # 超出生成器的范围报错4_after_yield---------------------------------------------------------------------------StopIteration Traceback (most recent call last)<ipython-input-27-372178f5f53b> in <module>()----> 1 next(F)StopIteration: done
python
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » python生成器讲解1
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » python生成器讲解1