深入了解 -- 从内部 yield 生成 yield
有没有一种简单的方法可以把一个生成器里的所有元素都取出来?比如说:
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_HEADER
和 YEARLY_FOOTER
变成可以循环的东西,这样它们就可以和每个月的循环结合在一起使用了。
3
这个情况没有特别的语法。
你想要的内容在 PEP 380 中有描述。这个提案已经存在很多年了,但我觉得它短时间内不会被加入到Python中。for .. yield
的用法很简单,而它提议的其他改动则比较复杂。