2017-01-15 61 views
-1
def fib(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
     yield b 
     a, b = b, a + b 
     n = n + 1  
    return 'done' 

print(next(fib(6))) 
print(next(fib(6))) 
print(next(fib(6))) 

結果爲1,1,1。 但是,如果我改變print()如下內容:關於Python中的生成器

f = fib(6) 
print(next(f)) 
print(next(f)) 
print(next(f)) 

結果將是1, 1, 2。爲什麼會發生?

+0

請修復壓痕。 –

+0

是否需要發佈實際縮進? – schwobaseggl

+0

您每次都創建新的生成器。你確實看到了這種差異,不是嗎? –

回答

4

電話print(next(fib(6)))總是創建一個fib生成器的新實例,並從中產生一個值,然後丟棄它。

在另一方面:

f = fib(6) 
print(next(f)) 
print(next(f)) 
print(next(f)) 

創建發生器fib的實例f並從它產生三個值。

此外,使用max作爲參數名稱是因爲在本地範圍內至少隱藏了一個具有相同名稱的內置函數。