2016-09-27 65 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;

相关问题