打包/解包生成器

4 投票
3 回答
4003 浏览
提问于 2025-04-16 19:25

我有两个生成器。第一个生成器有时候需要调用第二个生成器,并把从那里得到的值返回:

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。

3 个回答

2

在这个简单的例子中,你可以直接写 a = b 或者 a = lambda: b。但是如果 a 还要添加自己的一些元素,那你可以使用 itertools.chain

import itertools
def a():
  return itertools.chain(['a-value'], b())

需要注意的是,虽然这个变体可能更简短,但 for: yield 这种写法是比较直观的(所以也容易理解)。

3

你可以使用生成器表达式。这种写法和循环差不多简洁,而且它表明你的代码主要是为了产生一个返回值,而不是产生其他的副作用。

def a():
    return (_b for _b in b())

正如phihag所说,如果你的代码真的像这个例子那样,你可能只需要写 a = b,因为a和b返回的是同样的序列。

6

我想你指的是PEP380。这个功能从Python 3.3开始就有了。它的样子是:

 yield from b()

在Python2中没有特别的语法来实现这个功能。你只需要用一个for循环就可以了。

你提到的a函数其实是完全没用的。你可以直接用b来代替它。

撰写回答