

この記事で分かること
- pythonのyield文とは何かが分かる
- pythonのyield文の使い方が分かる
pythonのyieldの使い方の概要
この記事では、pythonのyield文の使い方を解説します。yieldを使う場合にはfor文を使うことが多いですが、そのようなオーソドックスなfor文を使った例を説明します。
その後、yieldがどのように動作するのかを把握する為に、yieldを含む関数の戻りのタイプと、そのタイプの使い方をサンプルプログラムを見ながら説明します。
pythonのyieldの使い方の前提の環境
pythonのyieldの使い方の前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。
-
-
【python】バージョン確認の方法【→プログラミング初心者向け】
続きを見る
また、レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。
-
-
レンタルサーバでプログラミングする方法【→ブログのサーバでできる!】
続きを見る
pythonのyieldの使い方サンプルプログラム
サンプルプログラムでは、yieldの動作を確認するために、「For文を使った例」とF「or文を使わない例」の2つのプログラムを説明します。
yieldの使い方のサンプルコード(for文を使った例)
ここでは、yieldの動作を確認する為に、8と2の四則演算の結果をyieldで返す関数 test_yieldを定義します。
def test_yield():
a = 8
b = 2
yield a+b
yield a-b
yield a*b
yield a/b
yield をで書かれた関数を呼び出すと generator(ジェネレータ)という種類の戻りが返却されます。For文では、次の yield までの処理を繰り返し実行し、値を返してくれます。
これを確認する為に、下のMainの処理では、関数test_yieldの戻りのタイプの表示と、関数test_yieldの戻りをFor文で要素を1つずつ表示しています。
if __name__ == '__main__':
print(type(test_yield()))
for ele in test_yield():
print(ele)
結果は、下のようになり、関数 __test_yield__ の戻りのタイプは「generator」となっており、8と2の足し算、引き算、掛け算、割り算の結果がそれぞれ表示されています。
$ python test.py
<type 'generator'>
10
6
16
4
yieldの使い方のサンプルコード(for文を使わない例)
For文を使わない例を考えてみましょう。
次のように、関数test_yieldの戻りを一旦 genという変数に入れます。その後、generator変数の関数next()を呼び出して、中断していたtest_yieldの処理を再開します。逐次yieldされた値をprint文で表示します。
if __name__ == '__main__':
print(type(test_yield()))
gen = test_yield()
print(gen.next())
print(gen.next())
print(gen.next())
print(gen.next())
次の結果のようにtest_yield()の戻りのジェネレータのメンバ関数のnext()を呼ぶと、yield までの処理を実行し、値を返します。next()をもう一度呼ぶと、yield の次の行から再開され、値を返してくれることがわかります。
$ python test.py
<type 'generator'>
10
6
16
4
下のコードのように、yieldの数以上にnextを呼び出してみましょう。
if __name__ == '__main__':
print(type(test_yield()))
gen = test_yield()
print(gen.next())
print(gen.next())
print(gen.next())
print(gen.next())
print(gen.next())
yieldの数以上にnextを呼び出すと、次の結果のようにエラーになってしまいます。
$ python test.py
<type 'generator'>
10
6
16
4
Traceback (most recent call last):
File "test.py", line 23, in <module>
print(gen.next())
StopIteration