Вы можете использовать return
один раз в генераторе; он останавливает итерацию, ничего не возвращая, и, таким образом, предоставляет явную альтернативу выходу функции за пределы области видимости. Поэтому используйте, yield
чтобы превратить функцию в генератор, но предшествуйте ей, return
чтобы завершить работу генератора, прежде чем что-либо даст.
>>> def f():
... return
... yield
...
>>> list(f())
[]
Я не уверен, что это намного лучше, чем то, что у вас есть - он просто заменяет оператор без операции на if
оператор без операции 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
функции, основанные на -основе, более удобочитаемы и удобнее.
См. Также этот отличный ответ от user3840170, который dis
показывает еще одну причину, почему этот подход предпочтительнее: он выдает наименьшее количество инструкций при компиляции.
if False: yield
но все же немного сбивает с толку людей, которые не знают эту закономерность