python 生成器


生成器是一次生成一個值的特殊類型函數。可以將其視為可恢復函數。調用該函數將返回一個可用於生成連續 x 值的生成器【Generator】

簡單的說就是在函數的執行過程中,yield語句會把你需要的值返回給調用生成器的地方,然后退出函數,下一次調用生成器函數的時候又從上次中斷的地方開始執行,而生成器內的所有變量參數都會被保存下來供下一次使用。

示例代碼

>>> def fib(max):
    a, b = 0, 1          
    while a < max:
        yield a          
        a, b = b, a + b

    
>>> for i in fib(1000):
	print(i)

    
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987

>>>f = fib(1000)
>>>f.next()            #python 3.0 要寫成f.__next__()  否則出錯
0
>>>f.next()
1
>>>f.next()
1
>>>f.next()
2

#python 3.0 要寫成f.__next__()  否則出錯  AttributeError: 'generator' object has no attribute 'next'

在函數fib(max)內定義了一個生成器,但是對fib(max)的調用永遠只能獲得一個單獨的生成器對象,而不是執行函數里面的語句,這個對象(generator object)包含了函數的原始代碼和函數調用的狀態,這狀態包括函數中變量值以及當前的執行點——函數在yield語句處暫停(suspended),返回當前的值並儲存函數的調用狀態,當需要下一個條目(item)時,可以再次調用next,從函數上次停止的狀態繼續執行,知道下一個yield語句。

生成器和函數的主要區別在於函數 return a value,生成器 yield a value同時標記或記憶 point of the yield 以便於在下次調用時從標記點恢復執行。 yield 使函數轉換成生成器,而生成器反過來又返回迭代器。

有三種方式告訴循環生成器中沒有更多的內容:

  1. 執行到函數的末尾("fall off the end")
  2. 用一個return語句(它可能不會返回任何值)
  3. 拋出StopIteration異常

總的來說生成器是一類特殊 迭代器。 一個產生值的函數 yield 是一種產生一個迭代器卻不需要構建迭代器的精密小巧的方法

內容參考 http://www.cnblogs.com/moinmoin/archive/2011/11/15/1990840.html


免責聲明!

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



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