迭代對象:在我看來就是可以用for循環依次取值的一個序列就叫可迭代對象
迭代器:就是可以用next()來進行取值的對象
生成器:我的理解就是在迭代器的基礎上給了與暫停功能的函數
生成器其實就是一種特殊的迭代器。它使一種更爲高級、更爲優雅的迭代器。
使用生成器讓我們可以以一種更加簡潔的語法來定義迭代器。
這三者的關係如下:
可迭代對象包含了迭代器,迭代器又包含了生成器
可迭代對象>>>迭代器>>>生成器
網上找了張圖很明顯
下面進行舉例:
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