33

私はイテラブル、より具体的にyieldは Python の演算子をいじっていました。テスト駆動開発を使用して新しいイテラブルの作成を開始しているときに、イテラブルが合格するためのこの単純なテストを作成できる最短のコードは何か疑問に思いました。

def test():
    for x in my_iterable():
        pass

私が考えることができる最短のバージョンは次のとおりです。

def my_iterable():
    for i in []:
        yield i

よりシンプルで、より短く、より美しい (Pythonic) バージョンを作成することは可能ですか?

4

6 に答える 6

21

Python 3 での別の解決策は、新しいyield from構文を使用することです。

def empty_gen():
    yield from ()

これは読み取り可能でempty_gen、ジェネレーターとして保持します。

于 2016-04-16T00:32:57.710 に答える
14

lambda および iter 関数を使用して、Python で空の iterable を作成できます。

my_iterable = lambda: iter(())
于 2012-05-16T15:22:12.533 に答える
2
def do_yield():
    return
    yield None

の使用yieldが重要な場合は、他の回答のいずれかがそうでない場合。

于 2012-05-16T15:26:15.397 に答える
0

別のアプローチでまったく新しいソリューションを提供するので、別の答えです。

ライブラリの1つに、次のEmptyIteratorようなものがあります

class EmptyIter(object):
    __name__ = 'EmptyIter'
    """Iterable which is False and empty"""
    def __len__(self): return 0
    def next(self): raise StopIteration # even that is redundant
    def __getitem__(self, index): raise IndexError

これは、次のプロパティを使用する代替アプローチです。

  • シーケンス プロトコルによる代替反復 (こちらを参照)
  • ここで説明されている代替の「虚偽」プロトコル。
于 2012-05-18T07:10:21.393 に答える