關於我對可迭代物件,迭代器,生成器的一些理解

SilenceHL發表於2021-04-27

可迭代物件(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 協議》,轉載必須註明作者和本文連結

相關文章