我在几个地方找到了这些简单的例子:
# 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
返回一个生成器,这是一个只能迭代一次的可迭代对象?
编辑:生成器也不是可迭代对象:它动态生成可迭代对象,它“生成”(不是“返回”)只能迭代一次。这有点令人费解,直到我能够正确掌握它,就像许多其他概念一样:)谢谢。