forループで
l = ['おはよう', 'こんにちは', 'こんばんは']
for i in l:
print(i)
forループでの実行結果
おはよう
こんにちは
こんばんは
これをジェネレーターを使って書くと、
ジェネレーター1
def greeting():
yield 'おはよう'
yield 'こんにちは'
yield 'こんばんは'
g = greeting()
print(next(g))
print(next(g))
print(next(g))
ジェネレーター1の実行結果
おはよう
こんにちは
こんばんは
ジェネレーターを2つにすると、
ジェネレーター2つ
def greeting():
yield 'おはよう'
yield 'こんにちは'
yield 'こんばんは'
g = greeting()
def counter(num=10):
for i in range(num):
yield 'ががががががー!!!'
c = counter()
print(next(g))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(g))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(g))
ジェネレーター2つの実行結果
おはよう
ががががががー!!!
ががががががー!!!
ががががががー!!!
ががががががー!!!
ががががががー!!!
こんにちは
ががががががー!!!
ががががががー!!!
ががががががー!!!
ががががががー!!!
ががががががー!!!
こんばんは
forループの様に一気に処理するのではなく、
要素の生成を保持したまま、
他の処理をする事ができる。
なので、
例えば下記のコードの様に、
重たい処理が途中に入っていた場合、
一気に全ての処理をするよりも、
小分けにして実装する事ができる。
ジェネレーター重い
def greeting():
yield 'おはよう'
for i in range(1000000):
print(i)
yield 'こんにちは'
for i in range(1000000):
print(i)
yield 'こんばんは'
yield 'おはよう' を処理。
for i in range(1000000):
print(i) を処理しなくもよい。
次に
for i in range(1000000):
print(i)
yield 'こんにちは' を処理。
という具合に小分けに処理できる。
ジェネレーターエラー
def greeting():
yield 'おはよう'
yield 'こんにちは'
yield 'こんばんは'
g = greeting()
for i in range(4):
print(next(g))
ジェネレーターエラーの実行時エラー
Traceback (most recent call last):
File "Main.py", line 9, in <module>
print(next(g))
StopIteration
おはよう、こんにちは、こんばんは の3つなのに、
4つprint(next(g))をしたので、
StopIteration でエラーが返ってくる。