可迭代物件(iterable)
可以返回一個迭代器的物件可以稱之為可迭代物件。本質上,具備了__iter__方法的物件是可迭代物件。在python中我們可以通過isinstance()判斷一個物件是否是可迭代物件,常見的可迭代物件有:list,set,dict,tuple,str。
例項
In [1]: from collections import Iterable
In [2]: isinstance([],Iterable)
Out[2]: True
In [3]: isinstance(set(),Iterable)
Out[3]: True
In [4]: isinstance(dict(),Iterable)
Out[4]: True
In [5]: isinstance((1,),Iterable)
Out[5]: True
In [6]: isinstance('hello world',Iterable)
Out[6]: True
__iter__方法
可以返回一個迭代器
自定義簡單的可迭代物件
In [7]: class A(object):
...: def __iter__(self):
...: """返回一個迭代器"""
...: pass
In [8]: a = A()
In [9]: isinstance(a,Iterable)
Out[9]: True
迭代器(Iterator):
在呼叫next()方法的時候返回可迭代物件中的下一個值的物件可稱為迭代器。本質上,實現 _iter__方法和__next_(python2中next())方法的物件就是迭代器(從這裡可以看出迭代器本身也是可迭代物件)
例項
In [10]: from collections import Iterator
In [11]: isinstance([], Iterator)
Out[11]: False
In [12]: isinstance(iter([]), Iterator)
Out[12]: True
In [13]: isinstance(iter("abc"), Iterator)
Out[13]: True
\iter__方法
可以返回迭代器本身
__next__方法
可以返回可迭代物件中的下一個值,如果可迭代物件中沒有下一個值了,則會丟擲StopIteration異常。
在python中我們可以使用isinstance()方法判斷一個物件是否為迭代器物件。
自定義簡單的迭代器
In [14]: class B(object):
...:
...: def __next__(self):
...: “”“記錄當前迭代位置”“”
...: pass
...:
...: def __iter__(self):
...: “”“返回迭代器本身”“”
...: pass
...:
In [15]: b = B()
In [16]: from collections import Iterator
In [17]: isinstance(b,Iterable)
Out[17]: True
生成器(generator)
一次生成一個值的特殊型別函式可稱為生成器。簡單的說就是在函式的執行過程中,yield語句會把你需要的值返回給呼叫生成器的地方,然後退出函式,下一次呼叫生成器函式的時候又從上次中斷的地方開始執行,而生成器內的所有變數引數都會被儲存下來供下一次使用。
當我們自己實現一個迭代器的時候,當前迭代到的狀態需要自己記錄,進而才能根據當前狀態生成下一個資料,而生成器可以通過yield語句記錄當前狀態,即生成器是一類特殊的迭代器。
由於生成器是特殊的迭代器所以生成器可以通過next()函式,for迴圈,list()等方法使用
tips:在python3在中range()方法返回的物件是一個生成器物件,python2中則是返回遍歷結果
使用生成器寫斐波那契數列
In [18]: def fib(n):
....: current = 0
....: num1, num2 = 0, 1
....: while current < n:
....: num = num1
....: num1, num2 = num2, num1+num2
....: current += 1
....: yield num
....: return 'None'
yield語句
python直譯器執行到yield這一行時會停下,將yield後面的變數返回,再次呼叫啟用yield(呼叫next()方法等)的時候,會繼續執行yield後面的程式碼(python3中return後面可以新增返回值,python2中return只能退出生成器,後面不能新增返回值)
總結
1.可迭代物件是可以進行迭代操作的物件,具有iter方法,呼叫iter方法可以返回一個迭代器
2.迭代器是特殊的可迭代物件,可以記錄當前訪問位置的物件,具有next方法,當通過next()呼叫next(python2中為next)方法時,會返回下一個位置的值。迭代器是一個特殊的可迭代物件,當呼叫iter方法時,會將自己返回。
3.生成器是特殊的迭代器,他自動記錄當前迭代的狀態,當我們呼叫呼叫next()方法的時候會幫我們從上一次停下來的地方繼續執行
本作品採用《CC 協議》,轉載必須註明作者和本文連結