迭代器
迭代(iterate)意味著重複多次,就像迴圈那樣。本書前面只使用for迴圈迭代過序列和字典,但實際上也可迭代其他物件;實現了方法iter的物件。
方法iter返回乙個迭代器,它是包含next的物件,而呼叫這個方法時可不提供任何引數。當你呼叫方法next時,迭代器應返回其下乙個值。如果迭代器沒有可供返回的值,應引發stopiteration異常。你還可以使用內建函式的便利函式next,在這種情況下,next(it)與it.next()等效。
斐波那契數列,表示該數列的迭代器如下:
class
fibs:
def__init__
(self):
self.a = 0
self.b = 1
def__next__
(self):
self.a,self.b = self.b, self.a + self.b
return sefl.a
def__iter__
(self):
return self
首先,建立乙個物件。
fibs = fibs()
然後就在for迴圈中使用這個物件,如找出第乙個大於1000的斐波那契數列。
for f in fibs:
if f > 1000:
print(f)
break
...1597
這個迴圈之所以會停止,時因為其中包含break語句;否則,這個for迴圈將會沒玩沒了的執行。
提示通過對可迭代物件呼叫內建函式iter,可獲得乙個迭代器。
>>>it = iter([1,2,3])
>>>next(it)
1>>>next(it)
2
還可使用它從函式或其他可呼叫物件建立可迭代物件
生成器
生成器是一種使用普遍函式語法定義得迭代器。生成器得工作原理到底是什麼呢?通過示列來說明最合適。
建立生成器
nested = [[1,2],[3,4],[5]]
defflatten
(nested):
for sublist in sublist:
for element in sublist:
yield element
這個函式大部分**都很簡單。它首先迭代所提供巢狀列表中得所有子列表,然後按順序迭代每個子列表的元素。倘若最後一行為print(element),這個函式將容易理解得多,不是嗎?
在這裡,你沒有見過的是yield語句。包含yield語句的函式都被稱生成器。這可不僅僅是值,而是可以生成多個值,每次乙個。每次使用yield生成乙個值後,函式都將凍結,即在此停止執行,等待被重新喚醒。被重新喚醒後,函式將從停止的地方開始執行。
為使用所有值,可對生成器進行迭代。
>>>nested = [[1,2],[3,4],[5]]
>>>for num in flatten(nested):
... print(umu)
...123
45或》list(flatten(nested))
[1,2,3,4,5]
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...