Python 3のyieldジェネレーターにはnext()関数はありません


84

、この質問、私はPythonのジェネレータを使用して無限の配列を有します。しかし、next()関数がないように見えるため、同じコードはPython3では機能しません。next関数に相当するものは何ですか?

def updown(n):
    while True:
        for i in range(n):
            yield i
        for i in range(n - 2, 0, -1):
            yield i

uptofive = updown(6)
for i in range(20):
    print(uptofive.next())


このコードはどのように機能しますか?動作するように見えますが、私が読んだところによると、「yieldステートメントに到達するとコードの実行が停止します」。(python-course.eu/python3_generators.php)。では、最初にfor i in range(n)、なぜyield単に「1」を返さないのですか?代わりに、範囲の最初の値の後、コードは続行され、範囲全体が生成されます。これは、yieldが一度に複数回呼び出されるように思われます。ニュアンスを理解するのに少し苦労しています。
マイクS

for関数から作成されたジェネレーターオブジェクトを初めて呼び出すと、関数内のコードが最初からヒットするまで実行されyield、ループの最初の値が返されます。次に、他の呼び出しごとに、関数で記述したループをもう一度実行し、返す値がなくなるまで次の値を返します。(このチュートリアルから取得)
MattiaPaterna19年

回答:



44

Python 3では、構文の一貫性を高めるために、next()メソッドの名前がに変更されました__next__()。あなたはそれを使うことができます。これはPEP3114で説明されています。

グレッグの解決策に従い、組み込みnext()関数を呼び出す(オブジェクトの__next__()メソッドを見つけようとする)ことをお勧めします。


1
特に、関数はバージョン2と3の間で移植可能であるため、メソッド(名前が変更されているため)は移植できません。
holdenweb 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.