ジェネレータ関数を呼び出しただけでは、ジェネレータ関数内のコードは実行されない
3.6.6 で誤りと思われる箇所を発見
たとえば以下のサンプルコードのようにジェネレーターを変数に代入した時点では、処理は一度しか実行されていません。(Kindle の位置No.2097-2098)
ジェネレータ関数を呼び出すと、ジェネレータオブジェクトが返る(だけ)
ジェネレータ関数内のコードは実行されない
ジェネレータオブジェクトに対して、組み込み関数nextやsendメソッドを呼び出すと、そこで初めてジェネレータ関数内のコードが実行される
yieldで止まる
以下のコードはPython 3.9.4 で実行
code: python
>> def multiplier():
... for i in range(10):
... print(f"call db_update({i} ** 2)")
... yield i ** 2
...
>> gen = multiplier() # ジェネレータ関数内のコードは実行されていない
>> next(gen) # ジェネレータ関数内のコードが実行される
call db_update(0 ** 2)
0
>> gen.send(None)
call db_update(1 ** 2)
1
より単純な例
code: python
>> def sample_generator(): # ジェネレータ関数
... print("Hello")
... yield "🐯"
... yield "🐟"
...
>> gen = sample_generator() # sample_generator内のコードは実行されない(printされていないことで確認)
>> next(gen)
Hello
'🐯'