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を活用すると、大量のデータを扱う際にもすべての値をメモリに保持する必要がなく、必要になった瞬間にだけ値を計算する「遅延評価」が実現できます。メモリ効率を重視したい処理において、ジェネレータは非常に有効な手段です。
-
Pythonで辞書(dict)を印刷・出力する方法を徹底解説
Pythonの辞書(dict)は、データを「キー」と「値」のペアで格納するデータ構造です。つまり、辞書内の各値には必ずキーが関連付けられており、そのキーが値を参照するための目印となります。 辞書の内容をコンソールで確認したい場合、いくつかのアプローチがあります。辞書をそのまま直接出力することもできますし、キーと値のペアを1つずつ個別に出力することも可能です。 このガイドでは、Pythonで辞書を印刷する方法を解説します。実際のコード例を通じて、自分のコードで辞書を出力する方法をわかりやすく紹介していきます。 forループを使って辞書を印刷する方法 まず、パン職人が読めるように辞書の内容を出力す
-
Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例
Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実