迭代器
迭代器協議
物件必須提供一個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
可迭代物件(iterable)
可迭代物件有很多種形式,只要滿足可以每次取到容器物件中下一個物件的,都稱為可迭代物件,
實作了 __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)
<class 'generator'>
生成器運算式
類似于串列推導,但是,生成器回傳按需產生結果的一個物件,而不是一次構建一個結果串列,按需取出物件
注意生成器 用()包裹起來
>>> generator = (i for i in range(10))
>>> generator.__next__()
0
>>> generator.__next__()
1
>>> type(generator)
<class 'generator'>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122698.html
標籤:Python
上一篇:python 命名空間和作用域
下一篇:Python 基礎資料型別
