0Pricing
Python Academy · レッスン

yield キーワード

yield を使ってジェネレーター関数とカスタムイテレーターを作成します。

「yield キーワード」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

はじめに

ジェネレーター関数は yield を使って値のシーケンスを遅延生成し、各 yield の間で実行を一時停止します。

yield とは

yield を含む関数はジェネレーター関数です。next() を呼び出すたびに、直前の yield の位置から実行を再開します。
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

ジェネレーター関数と通常の関数

ジェネレーター関数を呼び出すと、ジェネレーターオブジェクトが返されます。この時点ではコードは実行されません。反復処理を行うとコードが実行されます。
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

無限ジェネレーター

def naturals(n=0): while True: yield n; n+=1 は無限シーケンスです。islice または break と組み合わせて使用します。
def naturals(n=0):
    while True:
        yield n
        n += 1
import itertools
print(list(itertools.islice(naturals(), 5)))

yield from

yield from sub_gen() はサブジェネレーターに処理を委譲し、すべての値を転送します。for x in sub: yield x と同等です。
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

send() による値の送信

gen.send(value) はジェネレーターを再開し、yield 式の結果となる値も渡します。
def accumulator():
    total = 0
    while True:
        n = yield total
        if n is None: break
        total += n
g = accumulator()
next(g)  # prime
print(g.send(10))
print(g.send(5))

ジェネレーターの状態

ジェネレーターは各 yield で一時停止し、呼び出し間でローカル変数を保持します。自然なコルーチンとして機能します。
def stateful():
    seen = set()
    while True:
        item = yield
        seen.add(item)
        yield len(seen)
g = stateful()
next(g); g.send('a'); print(next(g)); g.send('b'); print(next(g))

ジェネレーターを閉じる

gen.close() はジェネレーター内で GeneratorExit を送出します。後処理には、ジェネレーター内で try/finally を使用します。
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration と return

ジェネレーター内の return value は、StopIteration 例外の value 属性に値を設定します。yield from がその値を取得するために使用します。
def gen_with_return():
    yield 1
    yield 2
    return 'done'
g = gen_with_return()
try:
    while True: print(next(g))
except StopIteration as e:
    print('returned:', e.value)

フィボナッチジェネレーター

ジェネレーターは、無限の数学的シーケンスに適しています。yield a; a, b = b, a+b のように記述します。
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
import itertools
print(list(itertools.islice(fibonacci(), 10)))

__iter__ を持つクラスとジェネレーター

ジェネレーターは、__iter__ と __next__ を持つクラスを記述するよりも簡単です。単純なシーケンスにはジェネレーターを使用します。
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

理解度チェック

ジェネレーター関数内の yield from sub() は何を行いますか。

復習

yield はジェネレーター関数を一時停止します。ジェネレーター関数はジェネレーターオブジェクトを返します。yield from はサブジェネレーターに処理を委譲します。send() は値を渡し、close() はクリーンアップを開始します。

続けましょう

すばらしいです!次のレッスンに進んで、スキルをさらに伸ばしましょう。

よくある質問

「yield キーワード」レッスンは無料ですか?

はい。「yield キーワード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「yield キーワード」で何を学びますか?

yield を使ってジェネレーター関数とカスタムイテレーターを作成します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「yield キーワード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. リスト内包表記
  2. 集合内包表記と辞書内包表記
  3. ジェネレーター式
  4. yield キーワード
← Python Academyに戻る