生成器实际上允许函数返回多次。每次执行yield
语句时,该值将被返回给调用者,并且调用者可以继续执行函数。
通常,它们在for
循环中用作可迭代对象。
以下函数会逐个元素地增加可迭代对象中的所有元素:
def inc_each(nums, inc):
for i in nums:
yield i + inc
以下是使用示例:
gen = inc_each([1, 2, 3, 4], 100)
print(list(gen)) # [101, 102, 103, 104]
list
在此处用于将任意可迭代对象(在本例中为生成器)转换为列表。
您所描述的函数执行了两个 yield 语句:
def make_iterables_to_chain():
yield [1, 2, 3]
yield ['a', 'b', 'c']
如果您调用它,它会返回一个生成器,如果迭代它,将会产生列表[1, 2, 3]
和['a', 'b', 'c']
。
gen = make_iterables_to_chain()
print(list(gen)) # [[1, 2, 3], ['a', 'b', 'c']]
itertools.chain.from_iterable
函数接受一个(可能是无限的)可迭代对象,将其“展平”,返回一个(可能是无限的)可迭代对象作为结果。
下面是一种实现方式:
def from_iterable(iterables):
for iterable in iterables:
for i in iterable:
yield i
yield
语句,因此这不能成为反对的理由(即使逻辑应用也很简单)。令我感到困惑的是,在那个时候没有人注意到这样一个明显的重复关闭,更不用说让它闲置五年了。 - Karl Knechtel