生成器
在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。
創(chuàng)建生成器方法1
要?jiǎng)?chuàng)建一個(gè)生成器,有很多種方法。第一種方法很簡(jiǎn)單,只要把一個(gè)列表生成式的 [ ] 改成 ( )
可以用next(list)打印出來(lái)
In [18]: l = [x for x in range(5)]
In [19]: l
Out[19]: [0, 1, 2, 3, 4]
In [20]: l = (x for x in range(5))
In [21]: l
Out[21]: <generator object <genexpr> at 0x7f92fadaed58>
In [22]: next(l)
Out[22]: 0
In [23]: next(l)
Out[23]: 1
In [24]: next(l)
Out[24]: 2
In [25]: next(l)
Out[25]: 3
In [26]: next(l)
Out[26]: 4
In [27]: next(l)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-27-101c36968c6d> in <module>()
----> 1 next(l)
創(chuàng)建生成器方法2
著名的斐波拉契數(shù)列(Fibonacci),除第一個(gè)和第二個(gè)數(shù)外,任意一個(gè)數(shù)都可由前兩個(gè)數(shù)相加得到:
In [28]: def fib(times):
....: n = 0
....: a,b = 0,1
....: while n<times:
....: print(b)
....: a,b = b,a+b
....: n+=1
....: return 'done'
....:
In [29]: fib(5)
1
1
2
3
5
Out[29]: 'done'
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
In [33]: next(F)
Out[33]: 1
In [34]: next(F)
Out[34]: 2
In [35]: next(F)
Out[35]: 3
In [36]: next(F)
Out[36]: 5
In [37]: next(F)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-37-8c2b02b4361a> in <module>()
----> 1 next(F)