物件必須提供乙個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...