Python ジェネレータのサンプル(generator)

Pythonのジェネレータのサンプルです。(確認環境:Python 3)

目次

サンプル ジェネレータ
  while文を使用したサンプル
  sendメソッドを使用するサンプル

ジェネレータ

  • 関数内にキーワードのyieldを記述します。
  • yield文は値を返します。
  • それに加えて値を返したところを記憶していて次回は続きから行います。
  • 関数を呼ぶ側は、next関数で呼び出します。
  • send関数を使用すると関数に値をセットすることができます。
  • Pythonの公式ドキュメントのジェネレータのリンクです。
    https://docs.python.org/ja/3/tutorial/classes.html#generators

ジェネレータのサンプルです。

# coding: utf-8

def test1():
		yield "a"
		yield "b"
		yield "c"

t1 = test1()

print(next(t1)) #a
print(next(t1)) #b
print(next(t1)) #c

3~6行目は、関数です。
8行目は、定義した関数を変数に代入しています。
10行目は、next関数でtest1関数を実行しています。4行目の値が表示されます。
11行目も同じnext関数ですが、今度は5行目の値が表示されます。
12行目は、6行目の値が表示されます。

while文を使用したサンプル

# coding: utf-8

def test1(a):
	while a < 10:
		yield a
		a += 1

t1 = test1(0)

print(next(t1)) # 0
print(next(t1)) # 1
print(next(t1)) # 2

3~6行目は、関数です。
4~6行目は、while文です。値aが1づつ増加します。10より小さい間処理を繰り返します。
8行目は、定義した関数を変数に代入しています。
10行目は、next関数でt1関数を実行しています。0が表示されます。
11行目も同じnext関数ですが、今度は1が表示されます。
12行目は、2が表示されます。

sendメソッドを使用するサンプル

# coding: utf-8

def test1(x):
	for a in range(10):
		b = yield ('Hello',x)
		if b is not None:
			x = b

t1 = test1("おはよう")

print(next(t1)) # ('Hello','おはよう')

t1.send("こんにちは")

print(next(t1)) # ('Hello','こんにちは')
print(next(t1)) # ('Hello','こんにちは')

6行目は、send関数のときにtrueになり7行目が実行されます。
11行目は、9行目の引数の値がセットされて表示されます。
13行目は、send関数です。引数の値を関数に渡します。
15,16行目は、13行目のsend関数でセットした値が表示されます。

関連の記事

Python 関数のサンプル
Python ローカル変数とグローバル変数
Python 無名関数のサンプル(lambda)
Python リストで内包表記を使用する

△上に戻る