4.3使用生成器建立新的迭代模式
阿新 • • 發佈:2022-03-17
問題:
你想實現一個自定義迭代模式,跟普通的內建函式比如range(),reverse的()不一樣。
解決方案:
如果你想實現一種新的迭代模式,使用一個生成函式來定義它。下面是 一個生產某個範圍內浮點數的生成器。
def frange(start, stop, increment): x = start while x < stop: yield x x += increment for n in frange(1, 10, 3): print(n) print(list(frange(1, 10, 3)))#->[1, 4, 7]
討論:
一個函式中需要有一個yeild語句即可將其轉換為一個生成器。跟普通函式不同的是,生成器只能用於迭代操作。下面是一個實驗,向你展示這樣的函式底層工作機制。
def countdown(n): print('Staring to count from', n) while n > 0: yield n n-=1 print('Done!') c=countdown(3) print(c) print(next(c))# ->3 print(next(c))# ->2 print(next(c))# ->1 print(next(c)) ''' line 25, in <module> StopIteration '''
一個生成器函式主要特徵是它只會迴應在迭代中使用到的next操作,一旦生成器函式返回退出,迭代終止,我們在迭代中通常使用的for語句會自動處理這些細節,所以你無需擔心。