これらの簡単な例をいくつかの場所で見つけました。
# 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
最初の例では、ジェネレーターはそれ自体を使い果たしますが、2 番目の例ではそうではありませんが、for ループが無限生成の停止を担当しています。典型的な説明では、yield
は値を「返し」、関数の状態を凍結し、呼び出されたときに関数はその状態から続行しnext()
ます。この説明は少し誤解を招きませんか?どちらの例でも、ジェネレーター関数を複数回呼び出すものを「視覚化」することはできません ( next()
)。ジェネレーターを返すと言った方が適切ではないyield
でしょうか。ジェネレーターは、1 回だけ反復できる反復可能なオブジェクトです。
編集: ジェネレーターも反復可能なオブジェクトではありません: 反復可能なオブジェクトをオンザフライで生成し、「返す」ものではなく「生成する」ものは 1 回だけ反復できます。これは、他の多くの概念と同様に、適切に把握できるようになるまで少し気が遠くなります:) ありがとうございます。