python3迭代器和生成器

迭代對象:在我看來就是可以用for循環依次取值的一個序列就叫可迭代對象

迭代器:就是可以用next()來進行取值的對象

生成器:我的理解就是在迭代器的基礎上給了與暫停功能的函數

生成器其實就是一種特殊的迭代器。它使一種更爲高級、更爲優雅的迭代器。

使用生成器讓我們可以以一種更加簡潔的語法來定義迭代器。



這三者的關係如下:

可迭代對象包含了迭代器,迭代器又包含了生成器

可迭代對象>>>迭代器>>>生成器

網上找了張圖很明顯

迭代器.png

下面進行舉例:

In [78]: isinstance((),Iterable)#說明了元組是可迭代對象
Out[78]: True

In [79]: isinstance([],Iterable)#說明了列表是可迭代對象
Out[79]: True

In [80]: isinstance({},Iterable)#說明了字典是可迭代對象
Out[80]: True

In [81]: isinstance("abc",Iterable)#說明了字符串是可迭代對象
Out[81]: True

In [82]: aa = (x for x in range(5))#定義一個生成器

In [83]: type(aa)
Out[83]: generator

In [84]: isinstance(aa,Iterable)#說明了生成器是可迭代對象
Out[84]: True


而下面的例子則是證明了字典/元組/列表/字符串不是迭代器:

In [86]: isinstance((1,23,4),Iterator)
Out[86]: False

In [87]: isinstance([],Iterator)
Out[87]: False

In [88]: isinstance({},Iterator)
Out[88]: False

In [89]: isinstance("abc",Iterator)
Out[89]: False


下面的例子則說明生成器不都是迭代器:

In [90]: bb = [x for x in range(5)]

In [91]: type(bb)
Out[91]: list

In [92]: bb
Out[92]: [0, 1, 2, 3, 4]

In [93]: cc = inter(bb)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-93-fd07bb1f753d> in <module>()
----> 1 cc = inter(bb)

NameError: name 'inter' is not defined

In [94]: cc = iter(bb)

In [95]: type(cc)
Out[95]: list_iterator

In [96]: cc
Out[96]: <list_iterator at 0x7fa4d6e53390>

In [97]: isinstance(bb,Iterator)
Out[97]: False

In [98]: isinstance(bb,Iterable)
Out[98]: True

In [99]: isinstance(cc,Iterator)
Out[99]: True

In [100]: isinstance(cc,Generator)
Out[100]: False


生成器和迭代器的區別:

 生成器是next的,next的操作,按照序列順序一次只能返回一個元素
 迭代器是一次性讀取了可迭代對象的所有元素到內存。 


生成器函數的一個例子:


比如你欠了銀行180W塊錢,

但是你沒有能力一次性的還完,

或者說你不想和親戚朋友借錢來還,

所以你在銀行辦了18個月分期還款來緩解自己的壓力(生成器),

就這樣銀行每次給你發這個月的賬單你就還一次10W,

直到18個月後你就把錢還完了

這就是生成器,每個月來了賬單就還一次,知道把錢還完

這樣就不會在一次性還錢的時候把自己給急瘋了,銀行也能夠收到它的錢的!

這就是生成器的作用,如果我們產生的數據很多,

數據量很大的話,很容易把進程跑死或者把服務器跑崩潰,

這個生成器就很好的解決了這個問題


如果有錯誤的地方歡迎各位大佬幫忙指正,謝謝!

這篇文章個人感覺還挺好:

https://www.cnblogs.com/vuedev/p/7349476.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章