python

【python】yieldの使い方【→プログラミング初心者向け】

2月 5, 2020

how to use yield in python
プログラム女子
ネットで見るpythonの「yield」って何なんですか?
関数を途中で止めて戻す処理だね。ここでは、「yield」がどんな使われ方をするのか説明するよ。
Tommy

pythonのyieldの使い方の概要

summary of yield usage

この記事では、pythonのyield文の使い方を解説します。

yieldを使う場合にはfor文を使うことが多いですが、そのようなオーソドックスなfor文を使った例を説明します。

その後、yieldがどのように動作するのかを把握する為に、yieldを含む関数の戻りのタイプと、そのタイプの使い方をサンプルプログラムを見ながら説明します。

pythonのyieldの使い方の前提の環境

environment of yield usage

pythonのyieldの使い方の前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。

オススメ
how to check version in python
【python】バージョン確認の方法【→プログラミング初心者向け】

続きを見る

また、レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。

もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。

オススメ
how to programming on rental server
レンタルサーバでプログラミングする方法【→ブログのサーバでできる!】

続きを見る

pythonのyieldの使い方サンプルプログラム

sample program of yield usage

サンプルプログラムでは、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

-python
-

© 2020 Tommy's blog Powered by AFFINGER5