在Python中使用yield创建空迭代的最简单方法是什么?

时间:2012-05-16 15:20:36

标签: python iterator yield

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

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

我能想到的最短版本是:

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

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

6 个答案:

答案 0 :(得分:23)

是的,有:

return iter([])

答案 1 :(得分:11)

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

my_iterable = lambda: iter(())

答案 2 :(得分:6)

怎么样

my_iterable = str

这通过了你的测试。

要认真对待,collections module中的Iterable提供了:

def __iter__(self):
    while False:
        yield None

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

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

答案 3 :(得分:6)

Python 3中的另一个解决方案是使用新的 static void Main(string[] args) { string[] String = File.ReadAllLines("../Program/Files/Numbers.txt"); double[] Double = String; } 语法:

yield from

哪个是可读的,并将def empty_gen(): yield from () 保留为生成器。

答案 4 :(得分:1)

def do_yield():
    return
    yield None

如果yield的使用对您很重要,则另一个则另有答案。

答案 5 :(得分: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

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

  • 通过序列协议进行替代迭代(参见here
  • here所述的替代“虚假”协议。