生成器和迭代器

2022-08-20 16:39:14 字數 1926 閱讀 7535

物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼返回乙個異常來終止本次迭代。(只能往前走,不能往後退!)

遵循了(實現了)迭代器協議的物件。(物件內部實現了乙個__next__方法,以實現迭代器協議)稱為乙個迭代器物件。他們的作用是逐個遍歷容器中的物件。迭代器物件一定是可迭代物件

>>> from collections import iterable, iterator

>>> l = list([1,2,3]) # 定義列表

>>> l_iter = l.__iter__() # 呼叫列表的 __iter__ 方法

>>> isinstance(l, iterable) # 列表可迭代物件

true

>>> isinstance(l, iterator) # 列表不是迭代器

false

>>> isinstance(l_iter, iterable) # 列表的__iter__ 方法返回 是可迭代物件

true

>>> isinstance(l_iter, iterator) # 列表的__iter__ 方法返回 也是是迭代器物件

true

可迭代物件有很多種形式,只要滿足可以每次取到容器物件中下乙個物件的,都稱為可迭代物件。

實現了__iter__方法的物件稱為可迭代物件。

range()物件也是可迭代物件。

生成器物件也是可迭代物件。

>>> from collections import iterable, iterator

>>> isinstance(range(10), iterator)

false

>>> isinstance(range(10), iterable)

true

# 生成器物件一定是迭代器物件, 那麼他也必然是可迭代物件

>>> isinstance((i for i in range(10)), iterator)

true

>>> isinstance((i for i in range(10)), iterable)

true

列表、元組、集合、字串、字典都是可迭代物件。

for 迴圈的本質:使用迭代器協議訪問可迭代物件中的每乙個物件。

生成器類似於一種資料型別,這種資料型別自動實現了迭代器協議,所以生成器也是迭代器。

生成器分類及在python中的表現形式:(python有兩種不同的方式提供生成器)

常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行

>>> def generator(n):

... for i in range(n):

... yield i

...

>>> gener_obj = generator(10)

>>> gener_obj.__next__()

0>>> gener_obj.__next__()

1>>> gener_obj.__next__()

2>>> type(gener_obj)

類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表,按需取出物件

注意生成器 用()包裹起來

>>> generator = (i for i in range(10))

>>> generator.__next__()

0>>> generator.__next__()

1>>> type(generator)

生成器和迭代器

可以直接作用於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...