Ви можете використовувати 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
основані функції є більш читабельними та ремонтопридатними.
if False: yield
але все ще трохи заплутано для людей, які не знають цієї моделі