比如,斐波那契數列:1,1,2,3,5,8,13,21,34....
用列表生成式寫不出來,但是我們可以用函數把它打印出來:
def fib(number):
n, a, b = 0, 0, 1
while n < number:
print(b)
a, b = b, a + b
n = n + 1
return 'OK!'
print(fib(5))
結果:
1
1
2
3
5
OK!
我們可以看出從第一個元素開始,推算出后續任意的元素。很像generator。
要把fib函數變成generator,只需要把 print(b)改為 yield b就可以了:
def fib(number):
n, a, b = 0, 0, 1
while n < number:
yield b
a, b = b, a + b
n = n + 1
return 'OK!'
print(fib(5))#<generator object fib at 0x105606ca8>
注意:
這里難理解的就是generator和函數的執行流程是不一樣的。
函數是順序執行,遇到return語句或者最后一行函數語句就
返回。
注意:函數創建一次生成一個生成器,所以我們會將創建的生
成器賦值給一個變量。如果直接用函數本身這個生成器,
我們沒用一次生成一個新的生成器對象,所以,我們一
般都將創建的生成器賦給一個變量。
generetor的函數,在每次調用 next()的時候執行,遇到
yield語句返回,再次執行時從上次返回的yield語句處繼續
執行。