2016-08-05 5 views
2

これは、ジェネレータがどのように動作するのか私の知らなかった結果ですが、私は完全に失われています。なぜこのPythonジェネレータ関数が正しく1回だけ実行されていますか?

私は対話的に次の発電機を作成した場合:

def neighborhood(iterable): 
    iterator = iter(iterable) 
    prev = None 
    item = next(iterator) 
    for post in iterator: 
     yield (prev,item,post) 
     prev = item 
     item = post 
    yield (prev,item,None) 

をして、テストし、それが好き:

for prev,item,next in neighborhood([1,2,3,4,5]): 
print(prev, item, next) 

それが生成する:予想通り

None 1 2 
1 2 3 
2 3 4 
3 4 5 
4 5 None 

。私は再びそれを実行、またはいずれかの方法でそれを再定義しようとすると、私は

を得る「NoneType」オブジェクトは、」

エラー呼び出すことはできません。

答えて

7

あなたは

をしたとき
for prev,item,next in ... 
#    ^^^^ 

組み込みのnext関数をシャドーしました。次回にジェネレータを使用しようとすると、あなたのnextバリアブル必要な機能の代わりにleを使用します。

+0

はい。だから馬鹿だ。 – WildGunman

3

これは、テストコードでnextという名前の変数を使用しているためです。組み込み関数nextをシャドーしない名前を使用してください。

関連する問題