2017-12-20 5 views
2

私はリストからジェネレータを作っていますが、リストの次の項目を返すだけで、すなわち、コード全体が、yield部分を返す代わりに再び実行されます。以下の例では、私はにリストを回していた理由があります。2."yield from"と "next"の動作についての質問

class demo: 
    @property 
    def mygen(self): 
     a = [1,2,3,4,5] 
     b = [6,7,8,9,10] 
     yield from a 
     yield from b 

if __name__=='__main__': 
    demo1 = demo() 
    print([_ for _ in demo1.mygen]) 
    demo2 = demo() 
    print(next(demo2.mygen)) 
    print(next(demo2.mygen)) 

返すために、次の2回目の呼び出しを希望に対し、次のリターン1回のリストをループしたときに予想される動作を示しているが、その後、ジェネレータはapi呼び出しからの応答であり、リストの次の項目を動的に返し、そのリストの最後になるとapi呼び出しを行います。

答えて

7

プロパティを呼び出すたびに、新しいジェネレータが作成されます。プロパティによって返されたジェネレータを変数に格納する必要があります。その後、nextに複数回電話することができます。

print(next(demo2.mygen)) 
print(next(demo2.mygen)) # calls next on a fresh generator 

他の人が指摘したように
gen = demo2.mygen 
print(next(gen)) 
print(next(gen)) # calls next on the SAME generator 

に、この動作は、あなたが最初の場所でこのプロパティを作る見直す必要があります変更します。

demo2.mygen 

が同じオブジェクトを毎回生成するより、静的属性の印象を与えながら

demo2.mygen() 

を見ることは、それははるかに起こっていくつかの動的なものがあることが明らかになります。あなたはそれについてのより精巧なものを見つけることができますhere

+0

だからこそ、これはプロパティではないはずです。なぜなら、関数であれば、それが何をするかを考えるようになるからです。 – warvariuc

+1

@warvariuc絶対に、これを指摘するために私の答えを編集しました。 – schwobaseggl