Подтвердить что ты не робот

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

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

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

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

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

Можно ли написать более простую, более короткую или более красивую (питоническую) версию?

4b9b3361

Ответ 1

Да, есть:

return iter([])

Ответ 2

Вы можете использовать функции лямбда и итера, чтобы создать пустую итерабельность в Python.

my_iterable = lambda: iter(())

Ответ 3

Как насчет

my_iterable = str

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

Говоря серьезно, Iterable в сборнике предоставляет:

def __iter__(self):
    while False:
        yield None

Это можно считать "наиболее pythonic", потому что это то, что сам питон использует.

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

Ответ 4

Другим решением в Python 3 является использование нового синтаксиса yield from:

def empty_gen():
    yield from ()

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

Ответ 5

def do_yield():
    return
    yield None

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

Ответ 6

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

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

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

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