生成器(generator)
通过列表生成式,我们可以直接创建一个列表。但是,受到内存的限制,列表的容量肯定是有限的。
在python中,有种一边循环一边计算的机制,称为生成器,generator,从而节省大量的空间。
创建一个generator,第一种方法很简单,把列表生成式的[]改成()就可以了。
L = [x*x for x in range(1,11)] 改为
g = (x*x for x in range(1,11))
得到的g为一个generator,如果需要获得generator的值我们可以用过next()函数。
generator保存的是算法,每次调用next(g)就会出现下一个元素的值,直到抛出StopIteration的错误。
什么情况下需要使用 yield?
一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。
eg : 杨辉三角函数
def triangles():
N = [1]
while True:
yeild N
a=[sum(i) for i in zip([0]+a,a+[0])] (这里是借用zip()函数的错位相加,最后利用sum()函数相加)
n = 0
for t in triangles():
print(t)
n = n+1
if n == 10:
break