見出し画像

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

複数のジェネレータを接続して、使用する。無駄な処理を行わずに済む

以上でジェネレータについてとなります。


その他、過去記事も色々書いているのでぜひ、ご参考ください。



この記事が気に入ったらサポートをしてみませんか?