Python_生成器和迭代器的區別


迭代器和生成器的區別是什么?這個問題面試的時候經常作為靈魂拷問。今天一起從概念到代碼梳理一遍,作為總結和記錄。

區別是:

  • 生成器的好處是延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大數據量處理,將會非常有用。

基礎概念

  1. 迭代:當創建的對象可以被一個接一個讀取里面的值,叫迭代。
    列表、元組、字典、字符串都是可迭代對象。數字、布爾值是不可迭代的對象。
  2. 迭代器協議:對象需要提供next()方法,通過它返回迭代中的下一項,直到返回終止拋出StopIteration異常。
  3. 可迭代對象:實現了迭代器協議對象。list、tuple、dict都是可迭代對象(Iterable),但不是迭代器對象(Iterator)。
    需要使用內建函數iter(),把這些都變成可迭代器對象(Iterable)。
  4. for item in Iterable:循環的本質就是先通過iter()函數獲取可迭代對象Iterable的迭代器,然后對獲取到的迭代器不斷調用next()方法,
    來獲取下一個值並將其賦值給item,當遇到StopIteration的異常后循環結束。

操作一下

  • 迭代器:Python中一個實現_iter_方法和_next_方法的類對象,就是迭代器。
>>> list = [1,2,3]
>>> lt = iter(list)
>>> print(next(lt))
1
>>> print(next(lt))
2
>>> print(next(lt))
3
>>> print(next(lt))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

  • 生成器:本質上是動態生成迭代的值,使用完直接丟棄,可以有效節省內存空間,但這些值只能被迭代一次。
>>> def g():
...     for i in range(3):
...         yield i
... 
>>> g = g()
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

yield語句與return語句一樣,都起到返回的作用。但yield與return不同,如果執行return語句,直接返回return后面表達式的值。但執行yield語句,返回的是一個生成器對象,而且這個生成器對象的當前值,就是yield語句后面跟的表達式的值。調用yield語句后,當前函數就會返回一個迭代器,而且函數會暫停執行,直到對該函數進行下一次迭代。

生成器是一種惰性的序列,如果我們需要創建一個 0~xxxxxxxxx 的序列,這樣大的序列創建出來會占用內存,生成器就解決這樣的問題 。

參考鏈接:
http://dwz.date/daG5
http://dwz.date/daG6


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM