Каков самый простой способ создать пустую итерацию с использованием yield в Python?

я играл с iterables и более конкретно yield оператор в Python. При использовании тестовой разработки для начала написания новой итерации я задавался вопросом, Какой самый короткий код может сделать этот простой тест для итерации:

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

самая короткая версия, которую я мог придумать, была:

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

можно ли написать проще, короче и более красивые (обновления) версия?

6 ответов


Да, есть такое:

return iter([])

вы можете использовать функции lambda и iter для создания пустой итерации в Python.

my_iterable = lambda: iter(())

как о

my_iterable = str

это проходит ваш тест.

говорить серьезно, то Iterable на модуль коллекции обеспечивает:

def __iter__(self):
    while False:
        yield None

это можно считать "наиболее подходящие для Python", потому что это то, что Python использует.

обратите внимание, что технически все ответы до сих пор обеспечивают итераторы (__iter__ + next), а не iterables (всего __iter__).


другое решение в Python 3-использовать новый yield from синтаксис:

def empty_gen():
    yield from ()

который читается, и сохранить empty_gen как генератор.


def do_yield():
    return
    yield None

при использовании yield - это важно для вас, один из других ответов иначе.


другой ответ, так как я предоставляю совершенно новое решение с другим подходом.

в одной из библиотек, у меня есть 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

Это альтернативный подход, который использует следующие свойства:

  • альтернативная итерация по протоколу последовательности (см. здесь)
  • альтернативный протокол "ложности", как описано здесь.