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