Ответ 1
Да, есть:
return iter([])
Я играл с помощью итераций и, более конкретно, оператора yield
в Python. При использовании разработки, основанной на тестах, чтобы начать писать новый итеративный, я задавался вопросом, что является самым коротким кодом, который мог бы сделать этот простой тест для итеративного прохождения:
def test():
for x in my_iterable():
pass
Самая короткая версия, о которой я мог подумать, была:
def my_iterable():
for i in []:
yield i
Можно ли написать более простую, более короткую или более красивую (питоническую) версию?
Да, есть:
return iter([])
Вы можете использовать функции лямбда и итера, чтобы создать пустую итерабельность в Python.
my_iterable = lambda: iter(())
Как насчет
my_iterable = str
это проходит ваш тест.
Говоря серьезно, Iterable
в сборнике предоставляет:
def __iter__(self):
while False:
yield None
Это можно считать "наиболее pythonic", потому что это то, что сам питон использует.
Обратите внимание, что технически все ответы до сих пор предоставляют итераторы (__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
Это альтернативный подход, который использует следующие свойства: