一,什么是生成器
直接生成列表会占用太多内存。
python中一边循环,一边计算的机制,称为生成器(generator)
二,创建生成器方法
1.只要把列表生成式的【】改为()
a = [d for d in range(10)]
a = (d for d in range(10))
生成器使用 next(a)获取下一个值,当取到最后没有元素会报错。for循环不会报错
2.只要函数中含有yield
可以使用 next()取值
In [30]: def fib(times):
....: n = 0
....: a,b = 0,1
....: while n<times:
....: yield b
....: a,b = b,a+b
....: n+=1
....: return 'done'
....:
In [31]: F = fib(5)
In [32]: next(F)
Out[32]: 1
捕获StopIteration错误,返回值包含在StopIteration的value中
g = fib(5)
In [40]: while True:
....: try:
....: x = next(g)
....: print("value:%d"%x)
....: except StopIteration as e:
....: print("生成器返回值:%s"%e.value)
....: break
....:
value:1
value:1
value:2
value:3
value:5
生成器返回值:done
三,函数
1.send 函数
执行到yield时,可以赋值给变量
c.next() 等价 c.send(None)
In [10]: def gen():
....: i = 0
....: while i<5:
....: temp = yield i
....: print(temp)
....: i+=1
In [43]: f = gen()
In [44]: f.__next__()
Out[44]: 0
In [45]: f.send('haha')
haha
Out[45]: 1
In [46]: f.__next__()
None
Out[46]: 2
In [47]: f.send('haha')
haha
Out[47]: 3
2. __next__() 方法, next() 方法
In [18]: f = gen()
In [19]: f.__next__()
Out[19]: 0
In [18]: f = gen()
In [19]: f.__next__()
Out[19]: 0
总结:
生成器可以记住上一次返回时函数体中的位置。
特点:
节约内存
所调用的参数都是上一次调用所保留的,而不是新创建的