python

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

how to use yield in python
プログラム女子
プログラム女子

ネットで見るpythonの「yield」って何なんですか?

関数を途中で止めて戻す処理だね。
ではここ「yield」がどんな使われ方をするのか説明するよ。

Tommy
Tommy

pythonのyieldの使い方の概要

summary of yield usage

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

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

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

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

environment of yield usage

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

【python】バージョン確認の方法【→プログラミング初心者向け】

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

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

レンタルサーバでプログラミングする方法【→レンタルサーバでできる!】

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 の処理を再開します。

逐次yiedされた値を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のその他「初心者向け」技術

other technique for python beginner

その他のpythonプログラムの「基礎知識」を下記の記事にまとめています。

どれもpythonの文法というべき、基本的なものばかりで、これから「pythonでプログラムを学びたい」という人は、「知っておいて方がよいもの」ばかりです。

私は、「プログラム」は「動いて」こそ価値ががあると考えています。 もともと、「プログラムを学ぶ」というのは、「自分が意図した動作をプログラムにさせるようになる」ということだと思います。 つまり、プログラムを自分の意図通りに動かして、初めて「学べた」と言えるということです。

しかし、実際に手で書いて動かしてみないと「学べない」ことがあります。 頭で理解したと思っても、いざプログラムを書こうとおもっても思い通りにいかない場合があるからです。 それには、プログラムを書く環境の問題だったり、pythonのバージョンが違ったり、ライブラリのバージョンが違ったり、いろいろな事情があります。

「頭で理解する」ことと「実際に動かす」ということは違うのです。 だから、プログラムを学ぶ時には実際にプログラムを書いて「動かしてみる」ことを強くおすすめします。

それぞれの記事には、実行可能なサンプルプログラムを掲載しています。 記事を読んで、実際に自分で書いてみてプログラムの動作をご自身で確認することができます。 是非、下記の記事を読んで、「知識」としてだけではなく、「手」でpythonを覚えていってください。

【python】初心者向けおすすめ記事まとめ【pythonの文法をマスターする!】

-python
-,

Copyright© Tommy's blog , 2020 All Rights Reserved Powered by AFFINGER5.