Python 生成器generator


列表的問題
列表生成器可以直接創建一個表,
但是,如果一個表中有100萬個元素,那么這個表太占空間,
而且往往我們僅僅需要訪問前面幾個元素,后面絕大多數元素占用的空間都白白浪費了。

生成器
如果列表元素可以按照某種算法推算出來,那我們可以在循環的過程中不斷的推算出后續的元素。而不用一開始就創建整個list.
這樣,節省了大量的空間。
這種一遍循環一遍計算的機制,稱為生成器:generator.


創建生成器generator.
第一種方法:只要報一個列表生成式的[]改成(),就穿件了一個generator.
創建列表

L = [x*x for x in range(10)]
print L
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

創建生成器

g =(x*x for x in range(10))
for n in g:
  print n

 

第二種方法:用函數來實現。裂變生成式的for循環無法實現的時候,還可以用函數來實現。
如果一個函數定義中包含yield關鍵字,那么這個函數就不再是一個普通函數,而是一個generator

def fib(m):
n, a, b = 0, 0, 1
while n < m:
    yield b
    a, b = b, a + b
    n = n + 1
    return

在生成器中,不允許return后面帶任何參數。否則:SyntaxError: 'return' with argument inside generator
因為在生成器中,return會引起StopIterationError。 一般生成器也不通過這種return的方式返回值。


函數生成器的工作原理:
函數定義中包含yield關鍵字那么函數就變成了生成器。在生成器執行過程中,遇到yield就中斷,下次又繼續從中斷點后執行。
函數形式定義的生成器一般不會用next()來獲取下一個返回值。而是直接用for循環來迭代。


免責聲明!

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



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