深入了解 -- 从内部 yield 生成 yield

2 投票
2 回答
1772 浏览
提问于 2025-04-16 11:09

有没有一种简单的方法可以把一个生成器里的所有元素都取出来?比如说:

def Yearly(year):
  yield YEARLY_HEADER
  for month in range(1, 13):
    # How can I rewrite the following two lines?
    for line in Monthly(month):
      yield line
  yield YEARLY_FOOTER

def Monthly(month):
  yield MONTHLY_HEADER
  for day in range(31):  # Yes, this is wrong
    yield 'Day %d' % day
  yield MONTHLY_FOOTER

也许还有更好的方法来重写整个这个方法呢?

2 个回答

5
import itertools

def Yearly(year):
  return itertools.chain(*[(YEARLY_HEADER,)] + 
                         [Monthly(m) for m in range(1, 13)] + 
                         [(YEARLY_FOOTER,)])

简单来说,把 YEARLY_HEADERYEARLY_FOOTER 变成可以循环的东西,这样它们就可以和每个月的循环结合在一起使用了。

3

这个情况没有特别的语法。

你想要的内容在 PEP 380 中有描述。这个提案已经存在很多年了,但我觉得它短时间内不会被加入到Python中。for .. yield 的用法很简单,而它提议的其他改动则比较复杂。

撰写回答