1ヶ月でWebデザイン・プログラミングスキルをオーダーメイドのカリキュラムで学べるスクール、それがWebCamp。

子供の想像力を伸ばしアイデアを形にする小学生向けプログラミング教室「プロスタキッズ」

Python超入門その16〜ジェネレーターを作ってみよう〜

Pocket

はじめに

任意の要素を持つシーケンスを作ってみたいと思ったことはありませんか?

リスト内包表記を使えば、非常に柔軟にシーケンスを生成できますが、あらかじめすべての要素を生成する必要がないこともあります。また、リストなどでは無限個の要素を持つシーケンスを生成することはできません。
たとえば、素数のシーケンスなどです。そのため、Pythonには「ジェネレーター」という仕組みが用意されています。

この記事では、Python初心者の方向けに、Pythonのジェネレーターの作り方・使い方について説明していきます。
便利な機能なので、ぜひとも覚えておきましょう。

イテレーターのおさらい

ジェネレーターはイテレーターの一種とも考えることができ、使い方もよく似ています。
そのため、ジェネレーターを学ぶ前にイテレーターについてしっかり理解しておかなければいけません。

ここでは、リストを例に基本的なイテレーターの使い方をみてみましょう。

例:

リストはシーケンスの一種で、イテレーション可能です。
for文に渡すと、自動的にイテレーターが取得され、ループ中で各要素が取り出されます。ジェネレーターもこれと似たような動作をしますが、シーケンスとはひとつ重要な違いがあります。

シーケンスとジェネレーターの違い

リストなどのシーケンスは、作成時点からすべての要素が存在しています。一方、ジェネレーターは作成時には、まだ要素が存在していません。
これがジェネレーター(生成器)と呼ばれるゆえんで、必要になったときに適宜要素が生成されます。

このため、シーケンスのようにインデックスでアクセスすることができません。
たとえば、リストならX番目の要素を直接取り出すことができますが、ジェネレーターではX個要素を生成する必要があります。

このように、ジェネレーターは「遅延実行」であり、シーケンスとは特性が異なっています。

基本的なジェネレーターの作り方・使い方

それでは、基本的なジェネレーターの作り方・使い方をみていきましょう。
次の例をみて下さい。

例:

ジェネレーターは、関数として定義します。通常の関数と違うのは、値を返すときにreturnではなくyieldを使うことです。
例では、引数で渡されたstartからendまでの整数を生成するジェネレーターを作っています。
yieldキーワードに注目して下さい。

ジェネレーターはイテレーション可能なので、直接for文に渡すことができます。
ジェネレーター関数を実行すると、ジェネレーターが返されます。ジェネレーターは通常の関数とは違い、yieldキーワードで値を返して一時停止します。
そして、次の値を生成するときには、yieldの次の行から再開します。

また、yieldキーワードを複数記述することも可能で、次のような例も実行できます。

例:

ジェネレーターは、yieldキーワードで一時停止するということをしっかり覚えておきましょう。

ジェネレーターで無限個の要素を生成する

ジェネレーターは遅延実行という特性を持っているため、無限個の要素を生成するジェネレーターを作ることができます。

たとえば、次のような例です。

例:

例では、無限に整数を生成するジェネレーターを定義しています。
そのままでは無限ループしてしまうため、if文を使ってfor文から明示的に抜けるようにしています。
このように、ジェネレーターは使い方次第でいろいろと活用できます。

まとめ

シーケンスとジェネレーターの違いがお分かりになりましたか?

ジェネレーターは、遅延実行であることに注意しましょう。その特性を活かせば、無限個の要素を生成するジェネレーターを作ることもできます。必要な要素のみを適宜生成できるため、うまく使えばパフォーマンスの向上も図れるでしょう。
対象に応じて、適切に使い分けて下さい。

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

初心者がプログラミングで挫折しない学習方法を無料動画で公開中。オンラインに特化したプログラミングスクール「TechAcademy(テックアカデミー)」が解説。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

ページ上部へ戻る