1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ジェネレーター

Posted at
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 でエラーが返ってくる。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?