セクション 4. 章 4
single
ジェネレーター関数
メニューを表示するにはスワイプしてください
定義
ジェネレーター関数は、yieldの代わりにreturnキーワードを使用して値のシーケンスを生成する特別な種類の関数。ジェネレーター関数が呼び出されると、イテレーターオブジェクトを返し、このオブジェクトを反復処理することで値を一度に一つずつ取得可能。
定義
イテレーターオブジェクトは、__iter__()および__next__()メソッドを定義することでイテレーター・プロトコルを実装するオブジェクト。これにより、next()で要素を一つずつ取得でき、シーケンスやジェネレーター関数内の項目をループ処理することが可能。
ジェネレーター関数の主な利点は、メモリ効率の高さ。シーケンス全体を事前に生成してメモリに保存するのではなく、必要に応じてオンデマンドで値を生成。
yield の仕組み
関数を完全に終了させる return とは異なり、yield は関数の実行を一時停止し、その状態を保存します。次に next() が呼び出されると、ジェネレーターは中断した場所から正確に再開されます:
12345678910def count_up(start, stop): while start <= stop: yield start # Pause and return the current value start += 1 # Resume from here on the next call counter = count_up(1, 3) print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3
ジェネレーターは for ループでも反復処理できます。for ループは自動的に next() を呼び出し、ジェネレーターが尽きるまで繰り返します:
1234567def count_up(start, stop): while start <= stop: yield start start += 1 for value in count_up(1, 5): print(value) # 1, 2, 3, 4, 5
注意
ジェネレーターが使い尽くされる(yieldする値がなくなる)と、next()を呼び出すとStopIteration例外が発生します。forループはこれを自動的に処理します。
タスク
スワイプしてコーディングを開始
even_numbers ジェネレーター関数を実装し、指定された範囲内の偶数を生成します。
- 2つのパラメータ
even_numbersとstartを受け取るジェネレーター関数stopを定義します。 whileがstart以下である間、stopループを使用して繰り返します。yieldが偶数(2で割り切れる)である場合にstartで返します。- 各イテレーションの後に
startを1増やします。 - 生成されたすべての値を出力するために
forループを使用します。
解答
すべて明確でしたか?
フィードバックありがとうございます!
セクション 4. 章 4
single
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください