我在玩迭代器,更具体地说是yield
Python 中的运算符。在使用测试驱动开发开始编写新的迭代时,我想知道最短的代码可以使这个简单的迭代测试通过:
def test():
for x in my_iterable():
pass
我能想到的最短版本是:
def my_iterable():
for i in []:
yield i
是否可以编写更简单、更短或更漂亮(pythonic)的版本?
就在这里:
return iter([])
Python 3 中的另一个解决方案是使用新yield from
语法:
def empty_gen():
yield from ()
这是可读的,并empty_gen
作为生成器保存。
您可以使用 lambda 和 iter 函数在 Python 中创建一个空的可迭代对象。
my_iterable = lambda: iter(())
怎么样
my_iterable = str
这通过了你的测试。
说真的,Iterable
在收藏模块中提供:
def __iter__(self):
while False:
yield None
这可以被认为是“最 Pythonic”,因为这是 Python 本身使用的。
请注意,到目前为止,从技术上讲,所有答案都提供了迭代器(__iter__
+ next
),而不是可迭代的(只是__iter__
)。
def do_yield():
return
yield None
如果使用 ofyield
对您很重要,则其他答案之一。
另一个答案,因为我用不同的方法提供了一个全新的解决方案。
在图书馆之一中,我有一个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
这是一种使用以下属性的替代方法: