2016-09-27 7 views
0

私は、.send(value)を使ってジェネレータに値を送ることができることを知っています。また、forループのジェネレータを反復処理できることも知っています。 forループでiteratingしながらジェネレータに値を渡すことは可能ですか?私がやろうとしている何forループのジェネレータに値を渡すにはどうすればよいですか?

def example(): 
    previous = yield 
    for i range(0,10): 
     previous = yield previous*i 

t = example() 
for value in example"...pass in a value?...": 
    "...do something with the result..." 
+0

あなたは何それを試してみましたその結果、あなたは 'for'ステートメントで値を送ることができません。しかし、あなたは 'while'を使うことができます。 – AChampion

+0

whileループを使用すると、多くの定型文を追加する 'StopIteration'をキャッチする必要があります。 – mklauber

+1

そして、入れ子にされたジェネレータがもっと分かりやすいコードだと感じていますか? – AChampion

答えて

0

OKですので、私はそれを考え出しました。このトリックは、t.send(value)をforループの(t.send(value) for value in [...])にラップする追加のジェネレータを作成することです。

def example(): 
    previous = yield 
    for i in range(0,10): 
     previous = yield previous * i 

t = examplr() 
t.send(None) 
for i in (t.send(i) for i in ["list of objects to pass in"]): 
    print i 
+1

明らかに、 'test()'は定義されておらず、 'for'文に余分な') 'があります。 – AChampion

+0

@AChampion:これらの問題が修正されても、何も生成されません。 – Gerrat

+0

'[" list ... "]'を分かりやすいリストに変更してください。 – AChampion

1

あなたは技術的には可能ですが、結果が混乱する可能性があります。例えば:

def example(): 
    previous = (yield) 
    for i in range(1,10): 
     received = (yield previous) 
     if received is not None: 
      previous = received*i 


t = example() 
for i, value in enumerate(t): 
    t.send(i) 
    print value 

出力:

None 
0 
2 
8 
18 

デイブ・ビーズリーは、コルーチンに(tldrを、同じ機能に発電機やコルーチンを混在させないでください)amazing articleを書いた

関連する問題