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