Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのyieldキーワード完全ガイド:使い方とreturnとの違いを解説

Pythonのyieldキーワードの使い方

Pythonのジェネレータは、直感的に理解しづらい概念の一つです。さらに厄介なことに、ジェネレータ自体は関数であるにもかかわらず、「yield」という特別なキーワードを使用します。yieldキーワードとは何なのでしょうか?また、return文とはどう違うのでしょうか?

どちらも良い質問です。このガイドでは、yieldステートメントの概要と、コードでの具体的な活用方法を解説します。実際にyieldキーワードを動かす例も紹介するので、ぜひ最後まで読んでみてください。

本題に入る前に、Pythonのイテレータとジェネレータに関する記事を読んでおくことをおすすめします。yieldキーワードへの理解を深めるための有益な背景知識が得られます。

基礎のおさらい:イテレータとジェネレータ

リストは「反復可能(イテラブル)なオブジェクト」です。これは「for」ループを使って中身を順番に取り出せるという意味です。ループが1回実行されるたびに、Pythonはリスト内の要素に1つずつアクセスします。辞書(dict)、タプル、文字列も同様に反復可能なオブジェクトです。

反復可能なオブジェクトから要素を1つずつ取り出してアクセスする仕組みを持つものをイテレータと呼びます。リストを作成し、forループで反復処理してみましょう。

peppers = ["Scotch Bonnet", "Piri Piri", "Cayenne"]

for p in peppers:
    print(p)

for p in peppers:
    print(p)

このコードを実行すると、「peppers」リスト内のすべての唐辛子がコンソールに出力されます。

Scotch Bonnet
Piri Piri
Cayenne
Scotch Bonnet
Piri Piri
Cayenne

イテレータは何度でも使えます。上の例では「peppers」オブジェクトを2回反復処理しましたが、毎回同じ結果が得られます。

一方、Pythonのジェネレータは、オブジェクトを反復処理するためのイテレータのようなものですが、大きな違いが1つあります。それは、ジェネレータは1回しか反復できないという点です。「peppers」リストは何度でも繰り返し処理できますが、ジェネレータには一度しかアクセスできません。

では、唐辛子のリストに対するジェネレータを定義してみましょう。

def print_peppers(peppers):
    for p in peppers:
        yield p

peppers = ["Scotch Bonnet", "Piri Piri", "Cayenne"]
pepper_generator = print_peppers(peppers)

for p in pepper_generator:
    print(p)

ここでは print_peppers() という関数を定義しています。これがジェネレータ関数です。引数として、コンソールに出力したい唐辛子のリストを1つ受け取ります。

メインプログラムでは、print_peppers() 関数を呼び出し、その結果を変数 pepper_generator に代入します。次に、forループを使ってジェネレータを反復処理します。forループがジェネレータオブジェクトを呼び出し、その要素を1つずつ取り出していきます。

コードを実行すると、次の出力が得られます。

Scotch Bonnet
Piri Piri
Cayenne

出力は最初の例と同じですが、決定的な違いがあります。ジェネレータは一度しか反復できないのです。試しにもう一度反復してみましょう。

for p in pepper_generator:
    print(p)

print("--- 2回目の反復 ---")

for p in pepper_generator:
    print(p)

このコードの出力は次のようになります。

Scotch Bonnet
Piri Piri
Cayenne
--- 2回目の反復 ---

最初のforループでジェネレータを1回反復した時点で、要素はすべて消費されています。そのため、2回目のforループでは何も出力されません。これが「ジェネレータは1回しか反復できない」ことの意味です。

Pythonのyieldキーワードとは

先ほどの例に出てきた「yield」というキーワードに注目しましょう。おさらいです。

def print_peppers(peppers):
    for p in peppers:
        yield p

yieldキーワードは関数の中に記述され、ジェネレータ関数から値を1つずつ返します。その役割はreturnキーワードに似ています。

yieldは、反復処理できるジェネレータを作成したいときに使います。先ほどの例では、yieldを使って唐辛子リストのジェネレータを作成しました。

yieldを含む関数は、必ずジェネレータを返します。これは type() メソッドで pepper_generator 変数の型を確認すればわかります。

print(type(pepper_generator))

出力:

<class 'generator'>

この結果から、print_peppers関数の戻り値が代入された pepper_generator がジェネレータ型であることが確認できます。

yieldとreturnの違い

あわせて、yieldとreturnの主な違いを整理しておきましょう。

  • return:関数の実行を終了し、単一の値を返す。再度呼び出せば、処理は最初からやり直しになる。
  • yield:関数の実行状態を保持したまま値を返し、次に呼び出されたときは中断した続きから再開する。戻り値はジェネレータになる。

まとめ

yieldキーワードは、ジェネレータの中で値を1つずつ返すために使われます。ジェネレータとは、値を1回しか反復できない特殊なイテレータのことです。yieldはreturn文に似ていますが、return文は関数を終了させてしまうため、ジェネレータのように途中で値を返しながら処理を続けることはできません。

これであなたも、yieldキーワードをPythonistaらしく使いこなせるはずです!

  1. Pythonのキーワード完全ガイド:予約語の一覧と使い方

    他のプログラミング言語と同様に、Pythonにも予約語(キーワード)が存在します。これらの単語は特別な意味を持ち、命令やパラメータとして機能します。キーワードは変数名や関数名、クラス名などの識別子として使用することはできません。 Pythonのキーワード一覧 TrueFalseclassdefreturn ifelifelsetryexcept raisefinallyforinis notfromimportgloballambda nonlocalpasswhilebreakcontinue andwithasyielddel orassertNone

  2. Pythonの「yield」キーワードとは?ジェネレータの仕組みと使い方を徹底解説

    Pythonのyieldキーワードは、ジェネレータ(generator)を作成するために使用されます。その動作を理解するには、まず「イテラブル(iterable)」と「イテレータ(iterator)」について知っておく必要があります。 イテラブルとイテレータとは リスト、文字列、ファイルなどのPythonオブジェクトは「イテラブル」と呼ばれます。for ... in構文で走査(反復処理)できるオブジェクトが、すべてイテラブルです。 イテレータオブジェクトもイテラブルの一種ですが、一度しか反復処理できないという特徴があります。任意のイテラブルからはiter()関数を使ってイテレータを取得でき、イ