return
ジェネレーターで1回使用できます。何も生成せずに反復を停止するため、関数をスコープ外に実行させるための明示的な代替手段を提供します。したがって、を使用yield
して関数をジェネレーターに変換しますが、その前にreturn
ジェネレーターを終了してから何かを生成します。
>>> def f():
... return
... yield
...
>>> list(f())
[]
あなたが持っているものよりもはるかに優れているかどうかはわかりません-それは単にno-opif
ステートメントをno-opステートメントに置き換えるだけyield
です。しかし、それはもっと慣用的です。yield
使用するだけでは機能しないことに注意してください。
>>> def f():
... yield
...
>>> list(f())
[None]
使ってみませんiter(())
か?
この質問は、特に空のジェネレーター関数について尋ねます。そのため、一般的に空のイテレータを作成するための最良の方法についての質問ではなく、Pythonの構文の内部整合性についての質問と見なします。
質問が実際に空のイテレータを作成するための最良の方法に関するものである場合は、代わりに使用することについてZectbumoiter(())
に同意するかもしれません。iter(())
ただし、関数を返さないことに注意することが重要です。空のイテラブルを直接返します。通常のジェネレーター関数のように、呼び出されるたびに反復可能オブジェクトを返す呼び出し可能オブジェクトを期待するAPIを使用しているとします。次のようなことをする必要があります。
def empty():
return iter(())
(クレジットは、この回答の最初の正しいバージョンを提供するためにUnutbuに行く必要があります。)
さて、あなたは上記をより明確に感じるかもしれませんが、私はそれがより明確でない状況を想像することができます。(考案された)ジェネレーター関数定義の長いリストのこの例を考えてみましょう。
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
その長いリストの最後にyield
、次のようなが含まれているものが表示されます。
def empty():
return
yield
または、Python 3.3以降(DSMで提案されている)では、次のようになります。
def empty():
yield from ()
キーワードの存在は、yield
これが他のすべてとまったく同じように、単なる別のジェネレーター関数であることを一目で明らかにします。iter(())
バージョンが同じことをしていることを確認するには、もう少し時間がかかります。
yield
微妙な違いですが、正直なところ、ベースの関数の方が読みやすく、保守しやすいと思います。
このアプローチが望ましい別の理由を示すために使用するuser3840170からのこのすばらしい回答も参照してください。コンパイル時に、発行される命令が最も少なくなります。dis