2016年2月1日

yield from

Python 3.3 で追加された yield from 構文を紹介します。


yield from は、ジェネレータの中でサブイテレータを作る構文です。
最も簡単な例は以下のようなもので、g1() と g2() は同じ動作をします。

# yieldを使用
def g1():
    for i in range(10):
        yield i

# yield fromを使用
def g2():
    yield from range(10)

yield from *** の *** には iterable なオブジェクトを指定します。そして、そのオブジェクトは順に yield されていくことになります。
ジェネレータも iterable なオブジェクトですから、以下のような書き方が可能です。
# 2つのジェネレータを繋げる
def g3():
    yield from g1()
    yield from g2()
このように、ジェネレータを繋げていく時に yield from を使うと、ソースコードの記述が簡単で済みます。


と、ここまでであれば、yield from は「ジェネレータが強化されたのだなぁ」という程度の新機能です。
ところが、Python 3.4 で目玉として追加された asyncio では、ビックリするほどに yield を使いまくります。そして、その中では Python 3.3 で追加された yield from も当たり前のように使われます。
asyncio がどの程度広まっていくかは不明ですが(習得はかなり難しそう)、asyncio に取り掛かる前には、本項で取り上げた yield from を理解しておくべきと思います。

0 件のコメント:

コメントを投稿