2016-09-27 116 views
0

我知道您可以使用.send(value)將值發送給生成器。我也知道你可以在for循環中遍歷一個生成器。在for循環中迭代它時,是否可以將值傳遞給生成器?如何將值傳遞給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

你有沒有試過(tldr不要在同一個函數混合發電機和協同程序)是什麼結果是......你不能在'for'語句中發送一個值。但是你可以使用'while'。 – AChampion

+0

如果我使用while循環,我需要捕獲一個'StopIteration',它增加了很多樣板。 – mklauber

+1

你覺得嵌套的生成器是更易於理解的代碼? – AChampion

回答

0

好了,所以我想它了。訣竅是創建一個額外的生成器,將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 

戴夫·比茲利寫了一篇關於協同程序的amazing article;

相關問題