首先很多人一定不明白生成器yield是什么意思。其實和它最像的就是return。舉個簡單的例子吧。
return:的用法
def fib(n): a=1 b=1 for i in range(0,n+1): a,b=b,a+b return aPRint fib(10)打印結果:
1Process finished with exit code 0看見了嗎,只打印的第一個就直接返回了。也就是說循環才剛開始就直接退出該函數了。
yield:的用法
def fib(n): a=1 b=1 for i in range(0,n+1): a,b=b,a+b yield afor i in fib(10): print i打印結果:
123581321345589144Process finished with exit code 0通過一個循環將fib的值返回值,反復打印。該函數每次產生一個值,函數就會被凍結,函數停在原地等待被重新被喚醒。函數被喚醒后就從定制的那點開始執行。(通過迭代來使用所有的值)遞歸生成器。
def flatten(list): try: for i in list: for j in flatten(i): yield j except TypeError: yield listprint list(flatten([[1,[2,3],[[4,5],6]],7,8,[9,10]]))打印結果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]Process finished with exit code 0分析一下:[1,[2,3],[[4,5],6]] 被變量 i 讀取,而第二重循環導致 j 讀取 剛那個列表里的第一個元素 1。1不是列表,引發類型錯誤。因為一個數字是不能被for 循環的。所以引發TypeError異常。此時的list是 那個 1. 則第一個元素 1 被迭代出來。
yield還是很好用的。比如輸出一個楊輝三角。
楊輝三角長什么樣子呢?
他有一個規律,每一行的 0+該行 加 該行+0 等于下一行的半邊。
舉個例子。第四行 1331 。01331 + 13310 = 14641 也就是下一行。
last 是上個列表的最后一行。
[sum(_) for _ in zip([0]+last,last+[0])] # 這就是上面的實現。
最后的生成結果。
[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]
新聞熱點
疑難解答