Developerサイトに移行します。見た目やトピックエリアなど更新されますが、開発者に必要とされるコンテンツを引き続き提供していきます。回https://www.ibm.com/developerworks/jp/library/?series_title_by=**auto**このシリーズの続きに乞うご期待。回このシリーズの続きに乞うご期待。能力の価格が以前からは考えられないほど低くなっている時代に生きている私たちは幸せ者です。それと同時に、ビッグデータ、AI、コグニティブ・コンピューティングなどのアプリケーションが急速に普及していることから、目のくらむような勢いでコンピューティング・リソースの要件が高くなっていることも事実です。皮肉なことに、計算リソースが有り余るほどある時代でありながら、競争力を維持する上では、開発者がリソースの消費量を抑える方法を理解することの重要性が増しています。これほどまでよく使われているプログラミング言語であり続けている主な理由は、簡単に習得できることにあります。時間足らずで、リストと辞書を操作するのがいかに簡単であるかがわかるはずです。アプリをスケーリングするとなると、手当たり次第にリストと辞書を使って問題を解決するという単純な手法では、たちまち問題に突き当たります。他のプログラミング言語よりもかなり多量のリソースを消費する傾向があるためです。処理の効率化を促す有用な機能がいくつかあります。イテレーター・プロトコルです。効率的に処理する方法を説明します。あることを前提としています。以降のバージョンが必要となります。ループは以下のようなコードだったでしょう。ステートメントは、イテレーターと呼ばれるものに対して作用します。イテレーターとは、何度も呼び出すことで一連の値を生成できるオブジェクトのことです。それをイテレーターに変換しようとします。組み込み関数は、イテレーターに変換できる関数の一例です。この関数がイテレーターに変換されると、一連の数値を生成します。イテレーターを詳しく見ていきます。インタープリターに、以下の式を入力してください。イテレーターは初期化されましたが、それだけです。イテレーターを実際に使用するために、最初の値を要求します。組み込み関数を使用します。iterator上記では例外が返されています。この例外は、オブジェクトをイテレーターとして使用するには、その前にイテレーターに変換しなければならないことを意味します。組み込み関数を使用します。出力されるといった具合です。この同じ行の入力を繰り返してください。キーを押すだけで、コマンドを再実行できます。キーを押す前に微調整することもできます。この例の場合、最終的には以下のようになります。出力された時点で範囲の終わりに達します。あらゆる例外の場合と同じく、この例外を処理する独自のコードを作成することもできます。使い尽くした後で、以下のコードを試してください。(これで終わりです!)」というメッセージが出力されます。例外を基準に、ループを終了するタイミングを判断するという仕組みです。他にも、イテレーターに変換できる類のオブジェクトがあります。以下のインタープリター・セッションは、標準的なさまざまなタイプがどのようにイテレーターとして解釈されるかを示します。print(next(it))xリストやタプルの場合は、かなり単純明快です。辞書では、キーだけを繰り返し処理します。その順序は保証されません。場合でも保証されません。この場合、イテレーターから返される最初のアイテムはセットを作成するために使用されるタプル内の最初のアイテムとなりますが、これが順序の保証を意味するわけではありません。文字列では、文字列に含まれる各文字を繰り返し処理します。このようなオブジェクトのすべてが「イテラブル」なオブジェクトと呼ばれます。オブジェクトをイテレーターに変換できるというわけではありません。iterableイテレーターの醍醐味は、当然、独自のイテレーター型を作成できることです。特別な名前を付けたメソッドを含めたクラスを定義するだけで、独自のイテレーター型を作成できます。その方法についての具体的な説明は、このチュートリアル・シリーズの範囲外ですが、ご心配なく。独自のカスタム・イテレーターを作成するのに最も簡単な方法は、特殊なクラスを定義することではなく、ジェネレーター関数と呼ばれる特殊な関数を使用することだからです。続いて、ジェネレーター関数について説明します。終了するというものです。ステートメントがある場合もあります。ジェネレーター関数は、それを呼び出したコードと、より複雑ながらも有用な方法でやり取りする特殊なタイプの関数です。以下に単純な例を示します。このコードをインタープリター・セッションに貼り付けてください。ステートメントを含めると、関数はジェネレーター関数になります。つの違いだけで、通常の関数がジェネレーター関数になるわけですが、通常の関数とジェネレーター関数との間には大きな違いがあるので注意が必要です。ジェネレーター関数は、他のあらゆる関数を呼び出すときと同じ方法で呼び出します。0x10ccccba0>ジェネレーター関数を呼び出すと、関数はすぐに呼び出し元に戻りますが、関数本文内で指定された値は返されません。ジェネレーター関数を呼び出す場合は常に、ジェネレーター・オブジェクトと呼ばれるものが返されます。ステートメントから値を生成するイテレーターのことです。標準的な言い方をすると、ジェネレーター・オブジェクトは一連の値になります。前のコード・スニペットに示したジェネレーター・オブジェクトを詳しく見ていきましょう。ループ内で使用できます。最初のジェネレーター・オブジェクトは使い尽くされているので、忘れずに新しいジェネレーター・オブジェクトを作成してください。123ジェネレーター関数の引数ジェネレーター関数が引数を受け入れると、その引数はジェネレーターの本文に渡されます。以下のジェネレーター関数を貼り付けてください。3関数に渡す引数を変えて、このジェネレーター関数を試してください。以下に一例を示します。111213ジェネレーター・オブジェクトを繰り返し処理する間、そのジェネレーター関数は中断され、処理が完了すると再開されるという状態になります。関数での新しい概念です。この概念では実質的に、複数の関数から重複する形でコードを実行できます。以下のセッションを見てください。つのジェネレーター・オブジェクトを作成しています。これで、いずれかのジェネレーター・オブジェクトから次のアイテムを取得できます。それぞれのオブジェクトが独立して中断、再開されていることに注目してください。つのジェネレーター・オブジェクトはあらゆる点で独立しています。状態になるかという点も含まれます。確実に理解するまで、このセッションでの動作を十分に調べてください。この動作を理解すれば、ジェネレーターの基本と、ジェネレーターが強力な機能であるのはなぜなのかを把握したことになります。通常の位置指定引数とキーワード引数のすべても使用できます。ジェネレーター関数内でのローカル状態ジェネレーター関数内では、条件、ループ、ローカル変数を使用した通常の処理をどれでも行うことができます。した処理を組み合わせることで、極めて高度な特化されたイテレーターを作成できます。次の例で面白いことを試してみましょう。誰もが天気に振り回されることに飽き飽きしています。それならば、自分自身の天気を作成しましょう。コメントを織り交ぜて、一連の晴れた日または雨の日を出力する気象シミュレーターです。天気について考えると、晴れの日の翌日は晴れて、雨の日の翌日は雨になることがよくあります。これをシミュレートするために、翌日の天気をランダムに、ただし同じ天気が続く確率が大きいほうを優先して選択します。