Python_生成器(generator)
2018-01-20 本文已影响0人
射手再见蓝天575
generator与list比较
- generator:算法实现下一个数据的输出,不调用下一个,就不执行下一个数据的运算
- list:直接存储于内存,所有数据都同时存在
- generator相较于list占用内存小
创建一个简单的generator
- 简单的generator的创建:在列表生成式的基础上将[]改为()
例如:
g=(x*x for x in range(10))
- generator的调用
- next调用:(直到报错结束)
>>> g=(x*x for x in range(10)) >>> g <generator object <genexpr> at 0x0610BC00> >>> 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 "<pyshell#14>", line 1, in <module> next(g) StopIteration
- for循环调用:
>>> def g_get(): for n in g: print(n) >>> g=(x*x for x in range(10)) >>> g_get() 0 1 4 9 16 25 36 49 64 81
创建一个函数形式的generator
- 函数型的generator的创建:
与普通函数不同的是含有关键字yield,即含有yield的函数就是generator
>>> def yhsj():
L=[1]
while True:
yield L
L=[1]+[L[i]+L[i+1] for i in range(len(L)-1)]+[1]
>>> def get_yhsj():
for n in yhsj():
print(n)
>>> get_yhsj()
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
...
函数型的generator与普通函数的不同
- 除了含有yield关键字外,还有就是执行顺序不同,普通函数的执行是按顺序的,而generator是执行到yield语句就停止,知道下一次调用,执行接下来的语句