33

我在玩迭代器,更具体地说是yieldPython 中的运算符。在使用测试驱动开发开始编写新的迭代时,我想知道最短的代码可以使这个简单的迭代测试通过:

def test():
    for x in my_iterable():
        pass

我能想到的最短版本是:

def my_iterable():
    for i in []:
        yield i

是否可以编写更简单、更短或更漂亮(pythonic)的版本?

4

6 回答 6

33

就在这里:

return iter([])
于 2012-05-16T15:22:40.753 回答
21

Python 3 中的另一个解决方案是使用新yield from语法:

def empty_gen():
    yield from ()

这是可读的,并empty_gen作为生成器保存。

于 2016-04-16T00:32:57.710 回答
14

您可以使用 lambda 和 iter 函数在 Python 中创建一个空的可迭代对象。

my_iterable = lambda: iter(())
于 2012-05-16T15:22:12.533 回答
11

怎么样

my_iterable = str

这通过了你的测试。

说真的,Iterable收藏模块中提供:

def __iter__(self):
    while False:
        yield None

这可以被认为是“最 Pythonic”,因为这是 Python 本身使用的。

请注意,到目前为止,从技术上讲,所有答案都提供了迭代器__iter__+ next),而不是可迭代的(只是__iter__)。

于 2012-05-16T15:58:06.303 回答
2
def do_yield():
    return
    yield None

如果使用 ofyield对您很重要,则其他答案之一。

于 2012-05-16T15:26:15.397 回答
0

另一个答案,因为我用不同的方法提供了一个全新的解决方案。

在图书馆之一中,我有一个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

这是一种使用以下属性的替代方法:

  • 通过序列协议的替代迭代(见这里
  • 此处描述的替代“虚假”协议。
于 2012-05-18T07:10:21.393 回答