BOO入門/Generators
外觀
< BOO入門
BOO入門 > Generators (上一章:將函數當作物件與多執行緒 下一章:巨集)
Generator運算式
[編輯]Generator運算式很類似我們之前提過的 for 迴圈,也具有相似的作用。 學習如何使用 Generator運算式的方法就是從例子裏來學,所以請開啟 booish:
$ booish >>> List(x for x in range(5)) // 最簡單的 Generator 運算式 [0, 1, 2, 3, 4] >>> List(x * 2 for x in range(5)) // 取得數值的兩倍 [0, 2, 4, 6, 8] >>> List(x**2 for x in range(5)) // 取得數值的平方 [0, 1, 4, 9, 16] >>> List(x for x in range(5) if x % 2 == 0) // 將所有偶數取出來 [0, 2, 4] >>> List(x for x in range(10) if x % 2 == 0) // 將所有偶數取出來 [0, 2, 4] >>> List(y for y in (x**2 for x in range(10)) if y % 3 != 0) // Generator運算式裡的Generator運算式 [1, 4, 16, 25, 49, 64] >>> List(cat.Weight for cat in myKitties if cat.Age >= 1.0).Sort() // 譯註,你會在這行遇到錯誤,請參考後面的說明。 [6.0, 6.5, 8.0, 8.5, 10.5] >>> genex = x ** 2 for x in range(5) generator(System.Int32) >>> for i in genex: ... print i ... 0 1 4 9 16
貓體重的範例(cat-weight),如你所見,很容易就能找到符合條件的小貓。(譯註:這行無法運作,因為你沒有 myKitties,如果要讓這行能運行,請自己宣告一個類別,並加入 Weight、Age 屬性,接着製作一個串列,放入數個這個類別的實體(object)。)
你不需要額外建立新串列,然後再一個一個去比對、放到新串列裏。
generators 繼承自 IEnumerable,所以你可以很容易地用迴圈去尋訪。
Generator方法
[編輯]Generator方法是一個能讓你回傳多次的正規作法。
這裏有個 Generator方法能傳回 2 的指數。
// Generator方法的範例
def TestGenerator():
i = 1
yield i
for x in range(10):
i *= 2
yield i
print List(TestGenerator())
輸出結果
[1, 2, 4, 8, 16, 32, 64, 128, 512, 1024]
Generator方法很有威力,因為能在 yield 之後在記憶體裏保存所有的區域變數。這在其他語言也能見到(C# 裏稱為 Iterator,python 裏也稱為 Generator)。
總而言之,很有用。
練習
[編輯]- 試着用Generator方法來作 fibonacci 數列。