一,什么是生成器
直接生成列表会占用太多内存。
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]: 32. __next__() 方法, next() 方法
In [18]: f = gen() In [19]: f.__next__() Out[19]: 0
In [18]: f = gen() In [19]: f.__next__() Out[19]: 0
总结:
生成器可以记住上一次返回时函数体中的位置。
特点:
节约内存
所调用的参数都是上一次调用所保留的,而不是新创建的