Ответ 1
Вы можете использовать return
один раз в генераторе; он останавливает итерацию, не принося ничего, и, таким образом, предоставляет явную альтернативу тому, чтобы функция выходила из области видимости. Поэтому используйте yield
, чтобы превратить функцию в генератор, но перед ней return
завершать генератор, прежде чем приносить что-либо.
>>> def f():
... return
... yield
...
>>> list(f())
[]
Я не уверен, что это намного лучше, чем у вас - он просто заменяет оператор no-op if
оператором no-op yield
. Но это более идиоматично. Обратите внимание, что просто использование yield
не работает.
>>> def f():
... yield
...
>>> list(f())
[None]
Почему бы просто не использовать iter(())
?
В этом вопросе конкретно задается пустая функция генератора. По этой причине я беру на себя вопрос о внутренней согласованности синтаксиса Python, а не о том, как лучше всего создать пустой итератор вообще.
Если вопрос о самом лучшем способе создания пустого итератора, вы можете согласиться с Zectbumo об использовании iter(())
. Однако важно заметить, что 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
более читабельны и поддерживаются.