python:ジェネレータを使ってみる
ジェネレータとは
関数のreturnのようなイメージ。ただ、クラスのようなものでもあり、呼び出された処理を記憶している。
実際の処理例①
def name_list():
yield "tamura"
yield "Tam"
yield "pachi"
yield "PachiPachi"
name = name_list()
print(next(name))
print(next(name))
print(next(name))
print(next(name))
➡
tamura
Tam
pachi
PachiPachi
return のかわりにyieldを用いる。nextで出力すると1回目は1個目のtamuraを呼び出し、2回目のnextは2個目のTamを呼び出し、処理を記憶していることがわかる。
実際の処理例②
def name_list():
yield "tamura"
yield "Tam"
yield "pachi"
yield "PachiPachi"
def count(num=5):
for i in range(num):
yield i
name = name_list()
count_no = count()
print(next(count_no))
print(next(name))
print(next(count_no))
print(next(name))
print(next(count_no))
print(next(name))
print(next(count_no))
print(next(name))
➡
0
tamura
1
Tam
2
pachi
3
PachiPachi
これもまた記憶していることが分かる。
実際の処理例③
他記事からの引用
def even_filter(nums):
for num in nums:
if num % 2 == 0:
yield num
def multiply_by_three(nums):
for num in nums:
yield num * 3
def convert_to_string(nums):
for num in nums:
yield 'The Number: %s' % num
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pipeline = convert_to_string(multiply_by_three(even_filter(nums)))
for num in pipeline:
print num
複数のジェネレータを接続して、使用する。無駄な処理を行わずに済む
以上でジェネレータについてとなります。
その他、過去記事も色々書いているのでぜひ、ご参考ください。
この記事が気に入ったらサポートをしてみませんか?