符合子发电机的发电机

red*_*ish 8 python

我喜欢让发电机顺从其他发电机,例如

def gx():
    for i in [1, 2, 3]:
        yield i

def gy():
    for i in [11, 12, 13]:
        yield i

def gz():
    """this should defer to gx and gy to
       generate [1, 2, 3, 11, 12, 13]"""
    for i in gx(): yield i
    for i in gy(): yield i
Run Code Online (Sandbox Code Playgroud)

gz()中的显式循环是实现此目的的唯一方法,还是有更好的替代方案?

Sve*_*ach 18

在当前发布的Python版本中,显式循环是调用子生成器的唯一方法.(我认为你的例子只是一个例子 - 不是你要解决的确切问题.)

Python 3.3将yield from为此目的添加特殊语法:

def gz():
    """this should defer to gx and gy to
       generate [1, 2, 3, 11, 12, 13]"""
    yield from gx()
    yield from gy()
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅PEP 380.

  • 为什么投票失败?我的直觉是,从问题的标题来看,这是OP实际上的答案. (2认同)

Mag*_*off 11

使用itertools.chain:

import itertools

gz = itertools.chain(gx(), gy())
Run Code Online (Sandbox Code Playgroud)

chain他们的文档中,他们通过实现来描述它:

def chain(*iterables):
    for it in iterables:
        for element in it:
            yield element
Run Code Online (Sandbox Code Playgroud)

你也可以从中汲取灵感:)