上級Python開発コース
チャプター
>
レベル
ジェネレーター
ジェネレーターの作成
値を一度だけではなく、継続的に生成したい場合もあります。関数が働く方法と同様に、ジェネレーターも同じように書かれ実行されます。ただし、出力を生成するときにreturn()の代わりにyield()を使用します。
この演習では、厩舎のタンクからボトルにミルクを詰める必要があります。ボトルにミルクを詰め、タンクから余分なミルクが集められるようにするため、ジェネレーターを使用して反復します。

目的
ジェネレーターを使用して牛乳タンクをポンプで吸い上げ、ボトルに牛乳を詰める。
牛のミルクを保管している機械はほぼ満杯です。ミルクが悪くなる前にボトル詰めして保管する必要があります。通常の方法ではこの作業は少し難しく、抽出できるミルクの量は多少変動する場合があります。幸いなことに、ジェネレーターを使用することでこのプロセスをシームレスかつ簡単にすることができます。
2つの牛乳タンクがあり、それらのミルクをポンプで吸い上げてボトル詰めする必要があります。それぞれの機械には牛乳を保管する区画があり、これは tank_a と tank_b という名前のリスト定数で表されています。その上、それぞれのタンクには余分なミルクが残っていることがあります。
ジェネレーターは関数と同じ構文に従いますが、出力には return の代わりに yield を使用します。fill() という名前のジェネレーターをセットアップし、引数 list を設定します。これは上記の段落で言及した定数を入力する場所です。
def fill(list):
for x in range(3):
yield list[x]
yield 5
ジェネレーターはリスト定数の3つのフィールドからデータを読み取り、機械の区画で表示されているもので、末尾に余分な5を追加します。
バスケットオブジェクトを収集フィールドで集め、必要なボトルにアクセスして、2つのXマークまで歩き、for ループを使用して牛乳を集めます。
yield 文のおかげで、ジェネレーターから生成された値は for ループから直接読み取ることができます。それを使って collect() 関数を用いて機械から "milk" を取得する for ループをセットアップします。その後、speak() を使用して各ボトルにどれだけのミルクが保管されているかを確認します。例としては以下のようになります:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
この for ループを用いて両方のXマークで作業を行います。ライトなXマークでは引数 tank_a を使用し、ダークなXマークでは引数 tank_b を使用してこのレベルを完了させます。