迭代器和生成器

2021-08-25 05:47:00 字數 1802 閱讀 1407

迭代器

迭代(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...