2015-05-24 43 views
-1

有人可以解釋這個過程中的每一步嗎?對於我在發電機()中的「什麼」:「做什麼?

我從來沒有見過「因爲我在X:」表示,其中X爲發電機,而我無法理解,如果它沒有被插入()之間的我與功能如何交互。

def fib(): 
    a, b = 0,1 
    while True: 
     yield b 
     a,b = b, a + b 
for i in fib(): 
    print(i) 
+0

這是鉑金:http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python?rq=1 – sobolevn

回答

1

for loop如果像上面那樣使用它,則會生成一次性變量。例如,list object在循環中一次又一次地使用,但一次性迭代器在使用後會自動刪除。

而且yield是像return其在功能使用的一個術語。它會給出結果並在循環中再次使用它。 你的代碼給你稱爲斐波那契的數字。

def fib(): 
    a, b = 0,1 #initially a=0 and b=1 
    while True: #infinite loop term. 
     yield b #generate b and use it again. 
     a,b = b, a + b #a and b are now own their new values. 

for i in fib(): #generate i using fib() function. i equals to b also thanks to yield term. 
    print(i) #i think you known this 
    if i>100: 
     break #we have to stop loop because of yield. 
2

for只是在表達式的值範圍內。如果表達式調用一個函數,那麼它的值就是函數返回的任何值,所以函數的結果範圍爲。

請注意,儘管fib不是函數,但它是一個生成器。它先後產生每一步的價值。

+0

我不知道的功能是不是發電機。有沒有一個鏈接可以指出我解釋它們之間的區別? – iNeedToMakeBetterQuestions

+0

快速谷歌搜索顯示[this](http://www.jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/)和[this](https:// wiki.python.org/moin/Generators)。儘管如此,這更像是一個次要的問題:如果'fib'是一個返回'[1,2,3,4]'的正常函數,那麼代碼就會工作得很好,for仍然會遍歷它。 –

+1

'fib'仍然是一個功能。 'type(fib)= '。 – sobolevn

3

包含yield將返回generator的任何功能。 for循環運行該生成器以一次返回一個值。

當你運行:

for i in fib(): 
    print(i) 

運行發電機的實際機制是:

_iterator = iter(fib()) 
while True: 
    try: 
     i = next(_iterator) 
    except StopIteration: 
     break 
    print(i) 

正如你所看到的,變量分配調用next 的結果( )上的發電機獲得下一個值。

希望這是明確其中來自:-)

0

要理解這一點,你必須明白什麼yield關鍵字一樣。請看看這個:What yield does?

現在你知道fib()不是一個函數,它是一個生成器。 這樣,代碼:

def fib(): 
    a, b = 0,1 
    while True: 
     yield b #from here value of b gets returned to the for statement 
     a,b = b, a + b 
for i in fib(): 
    print(i) 

由於While從來沒有得到一個錯誤的值。它繼續運行。