我在几个地方找到了这些简单的例子:
# a generator that yields items instead of returning a list
def firstn(n):
num = 0
while num < n:
yield num
num += 1
sum_of_first_n = sum(firstn(1000000))
def get_primes(number):
while True:
if is_prime(number):
yield number
number += 1
def solve_number_10():
total = 2
for next_prime in get_primes(3):
if next_prime < 1000:
total += next_prime
else:
print(total)
return
在第一个示例中,生成器会自行耗尽,在第二个示例中它不会耗尽,但 for 循环负责停止无限生成。一个典型的解释是yield
“返回”一个值,冻结函数状态,当被调用时,函数将从该状态继续next()
。这种解释是不是有点误导?在任一示例中,我都无法“可视化”多次调用生成器函数的任何内容 ( next()
)。返回一个生成器不是更好yield
吗,它是一个只能迭代一次的可迭代对象?
编辑:生成器也不是可迭代对象:它动态生成可迭代对象,并且它“产生”(而不是“返回”)只能迭代一次。在我能正确掌握它之前,这有点令人费解,就像许多其他概念一样:) 谢谢。