0

これらの簡単な例をいくつかの場所で見つけました。

# 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 回だけ反復できます。これは、他の多くの概念と同様に、適切に把握できるようになるまで少し気が遠くなります:) ありがとうございます。

4

0 に答える 0