python

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

2月 5, 2020

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

この記事で分かること

  • pythonのyield文とは何かが分かる
  • pythonのyield文の使い方が分かる

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

  1. 「test_yield」を宣言する
  2. 変数「a」を8で初期化する
  3. 変数「b」を2で初期化する
  4. 変数「a」と変数「b」を足した結果をyieldで返す
  5. 変数「a」と変数「b」を引いた結果をyieldで返す
  6. 変数「a」と変数「b」を掛けた結果をyieldで返す
  7. 変数「a」と変数「b」を割った結果をyieldで返す

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)

  1. 関数「test_yield」の戻りの型を表示する。
  2. 関数「test_yield」で得た値を変数「ele」に代入しながら、for文で「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())

  1. 関数「test_yield」の戻りの型を表示する。
  2. 関数「test_yield」で得たgenerator変数「gen」に代入する
  3. next()関数を使って変数「gen」の次の項目を表示する
  4. next()関数を使って変数「gen」の次の項目を表示する
  5. next()関数を使って変数「gen」の次の項目を表示する

次の結果のように「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())

  1. 関数「test_yield」の戻りの型を表示する。
  2. 関数「test_yield」で得たgenerator変数「gen」に代入する
  3. next()関数を使って変数「gen」の次の項目を表示する
  4. next()関数を使って変数「gen」の次の項目を表示する
  5. next()関数を使って変数「gen」の次の項目を表示する

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
-

© 2021 Tommy's blog Powered by AFFINGER5