Python中生成器和迭代器的區別

2021-09-24 21:33:14 字數 2284 閱讀 2904

迭代器(iterator)是乙個實現了迭代器協議的物件,python的一些內建資料型別(列表,陣列,字串,字典等)都可以通過for語句進行迭代,我們也可以自己建立乙個容器,實現了迭代器協議,可以通過for,next方法進行迭代,在迭代的末尾,會引發stopiteration異常。

生成器(generator)是通過yield語句快速生成迭代器,可以不用iter和next方法 (指的是定義時

yield可以使乙個普通函式變成乙個生成器,並且相應的next()方法返回是yield後的值。一種更直觀的解釋是:程式執行到yield時會返回結果並暫停,再次呼叫next時會從上次暫停的地方繼續開始執行。 

顯然,生成器自身有構成乙個迭代器,每次迭代時使用乙個yield返回 的值,乙個生成器中可以有多個yield的值

in [21]: def test():

....: yield 1

....: yield 3

....: yield 22

....:

in [22]: a = test()

in [23]: type(a)

out[23]: generator

in [24]: a.next()

out[24]: 1

in [25]: a.next()

out[25]: 3

in [26]: a.next()

out[26]: 22

2,可迭代物件:實現了迭代器協議物件。list、tuple、dict都是iterable(可迭代物件),但不是iterator(迭代器物件)。但可以使用內建函式iter(),把這些都變成iterable(可迭代器物件)。

3,for item in iterable 迴圈的本質就是先通過iter()函式獲取可迭代物件iterable的迭代器,然後對獲取到的迭代器不斷呼叫next()方法來獲取下乙個值並將其賦值給item,當遇到stopiteration的異常後迴圈結束

python中乙個實現了_iter_方法和_next_方法的類物件,就是迭代器,如下案例是計算菲波那切數列的案例

class fib(object):

def __init__(self, max):

super(fib, self).__init__()

self.max = max

def __iter__(self):

self.a = 0

self.b = 1

return self

def __next__(self):

fib = self.a

if fib > self.max:

raise stopiteration

self.a, self.b = self.b, self.a + self.b

return fib

# 定義乙個main函式,迴圈遍歷每乙個菲波那切數

def main():

# 20以內的數

fib = fib(20)

for i in fib:

print(i)

# 測試

if __name__ == '__main__':

main()

說明:在本類的實現中,定義了乙個_iter_(self)方法,這個方法是在for迴圈遍歷時被iter()呼叫,返回乙個迭代器。因為在遍歷的時候,是直接呼叫的python內建函式iter(),由iter()通過呼叫_iter_(self)獲得物件的迭代器。有了迭代器,就可以逐個遍歷元素了。而逐個遍歷的時候,也是使用內建的next()函式通過呼叫物件的_next_(self)方法對迭代器物件進行遍歷。所以要實現_iter_(self)和_next_(self)這兩個方法。

而且因為實現了_next_(self)方法,所以在實現_iter_(self)的時候,直接返回self就可以。

總結一句話就是: 

在迴圈遍歷自定義容器物件時,會使用python內建函式iter()呼叫遍歷物件的_iter_(self)獲得乙個迭代器,之後再迴圈對這個迭代器使用next()呼叫迭代器物件的_next_(self)。

注意點:_iter_(self)只會被呼叫一次,而_next_(self)會被呼叫 n 次,直到出現stopiteration異常。

>延遲操作。也就是在需要的時候才產生結果,不是立即產生結果。
>生成器是只能遍歷一次的。

>生成器是一類特殊的迭代器。

python中生成器與迭代器

可迭代物件 乙個實現了iter方法的物件是可迭代的 迭代器 乙個實現了iter方法和next方法的物件就是迭代器 iter方法會返回乙個迭代器 生成器都是iterator物件,但list dict str雖然是iterable 可迭代物件 卻不是iterator 迭代器 from collectio...

python中生成器,迭代器和裝飾器

解析器在實時生成資料,資料不會駐留在記憶體中。因此,其執行效率很高!yield 是乙個類似 return 的關鍵字,只是這個函式返回的是個生成器 當你呼叫這個函式的時候,函式內部的 並不立即執行 這個函式只是返回乙個生成器物件 當你使用for進行迭代的時候,函式中的 才會執行 list1 i 2 f...

python中生成器

生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...