列表生成式
In [1]: [i*i for i in range(10) if i%2 == 0 ]
Out[1]: [0, 4, 16, 36, 64]
生成器
第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator
In [20]: g = (i*i for i in range(10) if i%2 == 0)
In [21]: g
Out[21]: <generator object <genexpr> at 0x8cf4fa4>
如果要一个一个打印出来,可以通过generator的next()方法
generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
使用for:
In [32]: for i in g:
....: print i
....:
0
4
16
36
64
第二种:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
>>> def odd(): ... print 'step 1' ... yield 1 ... print 'step 2' ... yield 3 ... print 'step 3' ... yield 5 ... >>> o = odd() >>> o.next() step 1 1 >>> o.next() step 2 3 >>> o.next() step 3 5 >>> o.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
可以看到,odd不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。执行3次yield后,已经没有yield可以执行了,所以,第4次调用next()就报错。
生成式:一次性生成所有的数据,然后保存在内存中,适合小量的数据
生成器:返回一个可迭代的对象,可通过next调用返回下一个值 ,通过循环列出所有的结果
参考:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681965108490cb4c13182e472f8d87830f13be6e88000