2017-01-15 4 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

Plsは実際の字下げをポストしますか? – schwobaseggl

+0

毎回新しい発電機を作成します。あなたはその違いを見ますか? –

答えて

4

print(next(fib(6)))コールは、常にfibジェネレータの新しいインスタンスを作成し、そこから1つの値を生成します。その後、それを破棄します。一方

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

が発生fibのインスタンスfを作成し、それから3つの値が得られます。

また、パラメーター名としてmaxを使用すると、ローカルスコープでは少なくとも同じ名前の組み込み関数をマスクしているので、ぼやけてしまいます。

関連する問題