Python 打包/解包发电机
我有两台发电机。第一个生成器有时需要调用第二个生成器并返回从那里获得的值:Python 打包/解包发电机,python,Python,我有两台发电机。第一个生成器有时需要调用第二个生成器并返回从那里获得的值: def a(): for _b in b(): yield _b def b(): yield 1 yield 2 for _a in a(): print _a 有没有更优雅的方法可以做到这一点: for _b in b(): yield _b 我试过这个: yield *b() 但肯定不行。我有Python 2.6。在这个简单的例子中,您可以只编写a=
def a():
for _b in b():
yield _b
def b():
yield 1
yield 2
for _a in a():
print _a
有没有更优雅的方法可以做到这一点:
for _b in b():
yield _b
我试过这个:
yield *b()
但肯定不行。我有Python 2.6。在这个简单的例子中,您可以只编写
a=b
或a=lambda:b
。但是如果a
添加了自己的元素,则可以使用:
请记住,尽管这个变体可能较短,但for:yield是一个非常直观(因此很容易理解)的模式。是的。它看起来像:
yield from b()
Python2中没有专门的语法。您只需使用for循环
你问题中的
a
函数实际上是完全无用的。您可以在它的位置使用b
。您可以使用生成器表达式。它与循环一样简洁,而且它表明您的代码主要用于生成返回值,而不是产生副作用
def a():
return (_b for _b in b())
正如phihag所说,如果你的代码真的像这个例子一样,你可以简单地编写
a=b
,因为a和b返回相同的序列。你真的试图一次返回(产生)来自b()
的所有内容吗?是的,我试图在a()中产生我从b()得到的所有值。a()
是一个刮擦蜘蛛的回调函数()a
您编写的是一个名为iter
return(\u b for b in b())
更容易(更有效)编写为return b()
,如果a
本身是一个生成器函数,它就不起作用了(如问题所述)。是的,这不起作用,当它产生一个类型的值时,你能给我一个例子说明这个a
的行为与原来的不同吗?它们都在a()中为a工作::打印a
,并且都告诉我类型(a())
是“生成器”。在真实代码(刮擦蜘蛛法)中,a
产生它自己的一些值。我想如果有一个政治公众人物,这意味着问题是已知的,目前没有优雅的解决方案。
def a():
return (_b for _b in b())