繁体   English   中英

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

[英]What is the simplest way to create an empty iterable using yield in Python?

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

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

我能想到的最短版本是:

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

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

就在这里:

return iter([])

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

my_iterable = lambda: iter(())

怎么样

my_iterable = str

这通过了你的测试。

要认真对待, 集合模块中的 Iterable提供:

def __iter__(self):
    while False:
        yield None

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

请注意,从技术上讲,到目前为止所有答案都提供了迭代器__iter__ + next ),而不是迭代 (只是__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

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

  • 通过序列协议的替代迭代(见这里
  • 这里描述的替代“虚假”协议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM