10

私はPythonで勉強していますが、それはジェネレーターが戻り値を出力する方法であるだけでなく、ジェネレーターに値を入れる方法でもあることがyieldわかりました。yieldたとえば、次のコード

def f():
    print (yield),
    print 0,
    print (yield),
    print 1

g = f()
g.send(None)
g.send('x')
g.send('y')

グローバルスコープでは、ジェネレータへsendの値'x'であり、したがって、出力されます。でも理解できない'y'fx 0 y 1

  • 2yield秒ですが3send秒です。Noneなぜ最初に送信する必要があるのですか?
  • StopIteration最後にをスローしsendます。この例外を回避する方法はありますか?

誰か説明してもらえますか?前もって感謝します。

4

1 に答える 1

10

ドキュメントから:

send()ジェネレーターを開始するために が呼び出される場合、値を受け取ることができる式がないため、引数として呼び出す必要がありますNoneyield

例外に関しては、本当に避けることはできません。ジェネレーターは、反復が完了するとこの例外をスローするため、回避するのではなく、キャッチするだけです。

g = f()

try:
    g.send(None)
    g.send('x')
    g.send('y')
except StopIteration:
    print 'Done'
于 2012-12-05T05:04:26.950 に答える