博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python generator用法
阅读量:7123 次
发布时间:2019-06-28

本文共 1928 字,大约阅读时间需要 6 分钟。

转自:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681965108490cb4c13182e472f8d87830f13be6e88000

生成器


通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的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
at 0x104feab40>

创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

如果要一个一个打印出来,可以通过generator的next()方法:

>>> g.next()0>>> g.next()1>>> g.next()4>>> g.next()9>>> g.next()16>>> g.next()25>>> g.next()36>>> g.next()49>>> g.next()64>>> g.next()81>>> g.next()Traceback (most recent call last):  File "
", line 1, in
StopIteration

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

当然,上面这种不断调用next()方法实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象:

>>> g = (x * x for x in range(10))>>> for n in g:...     print n...0149162536496481

所以,我们创建了一个generator后,基本上永远不会调用next()方法,而是通过for循环来迭代它。

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

def fib(max):    n, a, b = 0, 0, 1    while n < max:        yield b        a, b = b, a + b        n = n + 1

定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

>>> def odd():...     print 'step 1'...     yield 1...     print 'step 2'...     yield 3...     print 'step 3'...     yield 5...>>> o = odd()>>> o.next()step 11>>> o.next()step 23>>> o.next()step 35>>> o.next()Traceback (most recent call last):  File "
", line 1, in
StopIteration

 

 

转载于:https://www.cnblogs.com/lucky466/p/10252252.html

你可能感兴趣的文章
DEV报表注意事项(二)
查看>>
超实用的Linux/Unix快捷键大汇总
查看>>
流编辑器sed命令详解
查看>>
wps for linux 不能使用搜狗输入法
查看>>
PHP与MySQL学习笔记9:创建Web数据库
查看>>
useradd、adduser和userdel在使用时的注意事项
查看>>
替你写代码
查看>>
xmake v2.0.3 更新
查看>>
注释 005
查看>>
002 about print
查看>>
提高Web页面性能的技巧
查看>>
11月份中国服务器市场:IBM以36.8%领跑市场
查看>>
Java实现Zip压缩解压缩
查看>>
4月第2周全球域名商TOP15:中国占据2个席位
查看>>
在线扩容磁盘,添加磁盘无法识别的问题处理
查看>>
基于分布式、服务化的maven项目文件规划
查看>>
lync 2013 企业版部署 (三) 安装前端服务器
查看>>
MYSQL参数调优之见解分析,mysql主从(读写)分离来实现负载均衡
查看>>
刷blos
查看>>
centos升级新内核所遇问题。
查看>>