32

主にこの質問のおかげで、値を返すためにyieldに精通しています

しかし、yield が代入の右側にある場合、yield は何をするのでしょうか?

@coroutine
def protocol(target=None):
   while True:
       c = (yield)

def coroutine(func):
    def start(*args,**kwargs):
        cr = func(*args,**kwargs)
        cr.next()
        return cr 
    return start

ステート マシンとコルーチンを調査しているときに、このブログのコード サンプルでこれに出会いました。

4

3 に答える 3

39

関数で使用されるステートメントは、そのyield関数を「ジェネレーター」(イテレーターを作成する関数) に変えます。結果の反復子は通常、 を呼び出すことによって再開されnext()ます。ただし、メソッドを再開するsend()代わりに、メソッドを呼び出して関数に値を送信することは可能です。next()

cr.send(1)

あなたの例では、これは毎回に値1を割り当てます。c

cr.next()実質的に同等ですcr.send(None)

于 2010-01-07T17:38:57.797 に答える
12

関数を使用してジェネレーターに値を送信できますsend

実行すると:

p = protocol()
p.next() # advance to the yield statement, otherwise I can't call send
p.send(5)

thenyieldは 5 を返すので、ジェネレーターの内部は5 にcなります。

また、 を呼び出すとp.next()yieldが返されNoneます。

詳細については、こちらをご覧ください。

于 2010-01-07T17:38:22.327 に答える