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

Python関数の戻り値を徹底解説!return・yield・ジェネレータの違いとは

Pythonにおけるreturn文は、関数の実行を終了し、呼び出し元へ値を返すための構文です。関数は本来「入力を受け取り、何らかの結果を返す」ことを目的としています。return文が実行されると、それが関数内の最後の文でなくても、その時点で即座に関数の処理は終了します。

なお、値を返す関数は「実りある関数(fruitful functions)」と呼ばれることもあります。

return文の基本例

次のコードは、2つの引数の合計を返す関数の例です。

def sum(a, b):
    return a + b

print(sum(5, 16))

出力結果

21

ジェネレータとは?

ジェネレータは、リストやタプルと同じくイテレータ(反復可能オブジェクト)の一種ですが、一度しか反復処理できません。これは、すべての値をメモリ上に保持せず、必要になった時点でその都度値を生成するためです。

mygenerator = (x * x for x in range(4))
for i in mygenerator:
    print(i)

出力結果

0
1
4
9

ジェネレータは1回しか使用できないため、同じmygeneratorに対して再度forループを実行しても、何も出力されません。0を計算した直後にその値を破棄し、続けて1、4、9と順番に計算していく仕組みになっているからです。

yieldキーワード

yieldはreturnと同じように使えるキーワードですが、関数は値そのものではなくジェネレータオブジェクトを返します。

ジェネレータから値を取り出すには、next()関数を使用します。

def createGenerator():
    for i in range(4):
        yield i * i  # この関数はジェネレータを生成する

mygenerator = createGenerator()
print(mygenerator)  # mygeneratorはオブジェクト!

print(next(mygenerator))
print(next(mygenerator))
print(next(mygenerator))
print(next(mygenerator))
print(next(mygenerator))

出力結果

<generator object createGenerator at 0x7f8b2c3d4e50>
0
1
4
9
Traceback (most recent call last):
  File "yieldgen1.py", line 12, in <module>
    print(next(mygenerator))
StopIteration

解説

上記の例では、yield文によってmygeneratorというジェネレータが作成されます。このジェネレータは1回しか使用できません。next(mygenerator)を呼び出すたびに、最初は0を計算し、その値を破棄してから1、4、9と順番に値を算出していきます。そして5回目の呼び出し時には、すべての要素を使い果たしているため、StopIterationエラーが発生します。

このようにyieldを活用すると、大量のデータを扱う際にもすべての値をメモリに保持する必要がなく、必要になった瞬間にだけ値を計算する「遅延評価」が実現できます。メモリ効率を重視したい処理において、ジェネレータは非常に有効な手段です。

  1. Pythonで辞書(dict)を印刷・出力する方法を徹底解説

    Pythonの辞書(dict)は、データを「キー」と「値」のペアで格納するデータ構造です。つまり、辞書内の各値には必ずキーが関連付けられており、そのキーが値を参照するための目印となります。 辞書の内容をコンソールで確認したい場合、いくつかのアプローチがあります。辞書をそのまま直接出力することもできますし、キーと値のペアを1つずつ個別に出力することも可能です。 このガイドでは、Pythonで辞書を印刷する方法を解説します。実際のコード例を通じて、自分のコードで辞書を出力する方法をわかりやすく紹介していきます。 forループを使って辞書を印刷する方法 まず、パン職人が読めるように辞書の内容を出力す

  2. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実