Developerサイトに移行します。見た目やトピックエリアなど更新されますが、開発者に必要とされるコンテンツを引き続き提供していきます。回https://www.ibm.com/developerworks/jp/library/?series_title_by=**auto**このシリーズの続きに乞うご期待。回このシリーズの続きに乞うご期待。イテレーターの基礎と、独自のイテレーターを作成する最も単純な方法、つまり、ジェネレーター関数またはジェネレーター式を作成する方法を説明しました。基礎を把握すれば、後は次々と、イテレーターを基礎としたあらゆる類のアイデアを思い付くでしょう。完成しているものを一から作り直さないようにすることが得策です。標準ライブラリーには、よく知られたものも、そうではないものも含め、貴重なサポートとツールが驚くほど包括的に揃っています。イテレーターを操作するのに役立つモジュールは複数ありますが、まずは組み込みでそのまま利用できる機能、つまりほとんどのところインポートしなくても使用できる機能を調べることをお勧めします。関数を使用すると、イテレーターから生成される各アイテムを処理して、それらの結果から新しいイテレーターを生成できます。渡す最初の引数はマッピング関数です。これが、各アイテムに適用されます。イテレーターに最初のアイテムを要求すると、文字列が返されます。使用してすべてのアイテムを順に抽出します。始まっていることに注目してください。最初のアイテムをすでに抽出しているためです。リストやタプルとは異なり、イテレーターはランダム・アクセスをサポートしません。独自のマッピング関数を作成することもできます。つの入力値を期待します。このコードをインタープリター・セッションに貼り付けてください。使用し、新しい文字コードを導出する引数を関数に追加しています。関数は、取得した数値コードを変換して文字列の文字に戻します。回で説明したジェネレーター式とよく似ています。実際、このコードを次のように作成することもできます。渡す引数として組み込んでいる方法に注目してください。式と同じように使用できることがわかるはずです。関数は単純なものなので、以下のようにジェネレーター式の中に組み込むことさえできます。使われてきた実績が長く、マッピングが引き続き重宝する特殊なケースはあります。大体のところは、こうした単純なイテレーターの操作にはジェネレーター式を使用することになるでしょう。つの値を計算する必要があることもあります。イテレーターを取り、イテレーターから生成されるすべてのアイテムの合計を返します。すべての数値の合計です。つの新しい値にする処理は、縮約と呼ばれています。縮約を目的とした汎用の関数もあります。以下の関数を貼り付けてください。モジュールが必要です。つの引数を取る関数です。この関数は、まず累積値を取り、その累積値に何らかの形で新しい値を適用して更新してから、更新後の値を返します。この例の場合、累積値はそれまでに取ったアイテムの合計です。対となる手法でもあります)。概念は、イテレーターを取り、そこから新しいイテレーターを派生させるというものです。概念は、イテレーターを取り、イテレーターのすべてのアイテムから単一の値を導出して返すというものです。つの概念の組み合わせは、膨大な量のデータを処理する際の有力な考え方となります。メソッド縮約として機能する特殊なメソッドについて説明します。メソッドは、イテレーターを取り、そのイテレーターのアイテムとなっている文字列の間を指定された文字列でつなぎ合わせて新しい文字列を作成します。j'最初の行による出力が再度強調している点は、イテレーターは一方向であり、いったん使い尽くされる何も出力が返されないことです。この点はイテレーターを使用するコードでのバグの原因となりがちなので、注意してください。次の行では、新しいジェネレーターを設定しています。実行すると、指定されたイテレーターから生成されるすべての文字列がそのまま連結されます。実行することもできます。フィルタリング入力のサブセットだけが含まれるイテレーターを作成するために使用できる組み込み関数は他にもあります。回で、以下の例を記載しました。回に戻って確認してください。関数を使用して、このジェネレーター式と同等のものを実装することができます。この点も覚えておくと役立ちます。19]ラムダ式というものを使用すると、このコードを数行短縮して作成できます。これについてはチュートリアル・シリーズの範囲外です。導入するイテレーターを使用すると最終的によく出現してくる細かいパターンはいくつもあります。モジュールには、こうしたパターンの多くに対応するハイパフォーマンス実装が用意されているため、学ぶ価値は大いにあります。つの長いイテレーターを作成するとします。関数に一連のイテレーターを引数として渡すと、この関数はそれらのイテレーターの出力をつなぎ合わせたチェーンを生成します。特殊な構文を使用できます。4]関数の変数引数には、どのイテレーターでも使用することができます。リストやタプルである必要はありません。以下のコードを貼り付けてください。引数を渡すことができます。組み合わせから、私はそこからさらに、戻る/進む/戻るという数値パターンを続けるとしたらどうなるだとうと考えました。以下のコードを貼り付けてください。-1)次に、このコードを試します。つの出力範囲の間を何度も循環することになります。無限ループを実装し、このループから抜け出すためのコードが含まれていないためです。終了するまで絶えず中断と再開を繰り返します。メソッドを使用すれば、ジェネレーターが実行中であっても中断と再開を繰り返す状態を終了させることができます。お気付きかもしれませんが、上記の例では、イテレーターの中身を示すリストは使用されていません。したがって、このコードを実行するということは、基本的に無限リストを作成することであり、当然、最終的にはメモリーが使い果たされます。注意する点として、このコードが返すのはイテレーターであり、アイテムではありません。よって一連のイテレーターからアイテムを取得することです。よって達成することはできません。アイテムを取得するだけなく、無限に生成されるアイテムの集合を作成しようとするからです。関数に渡すすべての引数は、それが変数引数であったとしても、関数が実行される前に既知になっていなければなりません。ランタイムは無限イテレーターからすべてのアイテムを取得しようとしますが、それは不可能なことです。実際のところ、ジェネレーターを使用するようになると、無限イテレーターは有用な概念になります。無限イテレーターから生成されるアイテムの集合を作成しようとするような処理には注意する必要があります。使用できないため、より直接的なバージョンを作成します。n上記のコードを貼り付けて、このイテレーターが果てしなく動作することを確認してください。以上のイテレーターが含まれているというパターンも一般的なものです。このパターンを対象とした標準的な構文が用意されています。このコードは機能的には上記のコードとまったく変わりません。使用を考えてください。この場合、指定されたイテレーターは完全に使い尽くされます。ステートメントを果てしなく実行し続けます。完全を期して最後に指摘しておきます。一緒には使用できません。無限イテレーターを処理するのに便利なルーチンがいくつか含まれています。このルーチンを使用すると、無限イテレーターを含むイテレーターからサブセット・シーケンスを抽出できます。2]この関数はイテレーターを取り、開始インデックスから終了インデックスまでのアイテムを抽出します。必要に応じて、ステップを指定することもできます。同じように使用できます。異なり、この関数では負のステップ数を使用できないことに注意してください。含まれる関数の中で、とりわけ有用であると同時に最も扱いが難しいのはグループ化関数です。いえ、これについて理解しておく価値は十分にあります。つの時間帯に時間をグループ化する例を示します。入力イテレーターとグループ化関数を指定し、イテレーターから生成される各アイテムに対し、この関数を実行します。あるアイテムから次のアイテムの間でグループ化関数の実行結果が変わると、新しいグループが作成されて、次にグループ化関数の値が変わるまで、すべてのアイテムがそのグループに振り分けられます。使用して、除算した値を次に最も小さい整数に切り捨てます。動作を理解しやすいように視覚化します。理解する上で重要な点は、グループ化関数の値の変化を基準に、出力されるアイテムがグループ化されることです。ある程度の練習を積めば、あらゆる類の使用ケースに応じて上手くグループ化関数を作成できるようになります。例をもう少し深く探りましょう。呼び出しますが、ループ内の各アイテムはタプルです。示されているようにイテレーターです。したがって、内側のループは各グループのイテレーターに対して動作します。つにまとめる方法として、無限イテレーターから生成されるアイテムをグループ化します。含まれる以下の関数を見てください。指定された有限イテレーターでのシーケンスを無限に繰り返します。シーケンスを何度も生成するだけです。