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

在Python中使用yield创建空iterable的最简单方法是什么?,python,iterator,yield,Python,Iterator,Yield,我在玩iterables,更具体地说,是Python中的yield操作符。在使用测试驱动开发开始编写新的iterable时,我想知道什么是最短的代码,可以让iterable通过这个简单的测试: def test(): 对于my_iterable()中的x: 通过 我能想到的最短版本是: def my_iterable(): 对于[]中的我: 产量一 是否可以编写一个更简单、更短或更漂亮的(pythonic)版本?您可以使用lambda和iter函数在Python中创建一个空的iterable

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

def test():
对于my_iterable()中的x:
通过
我能想到的最短版本是:

def my_iterable():
对于[]中的我:
产量一

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

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

my_iterable = lambda: iter(())
是的,有:

return iter([])
如果使用
yield
对您来说很重要,那么另一个答案是相反的。

如何

my_iterable = str
这通过了你的测试

严肃地说,
Iterable
中提供了:

def __iter__(self):
    while False:
        yield None
这可以被认为是“最具python风格的”,因为这是python本身所使用的


请注意,从技术上讲,到目前为止,所有答案都提供了迭代器(
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

在其中一个by库中,我有一个
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
这是一种使用以下特性的替代方法:

  • 通过序列协议的替代迭代(参见)
  • 如所述的替代“虚假”协议

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

def empty_gen():
    yield from ()

它是可读的,并将
保持为空\u gen
作为生成器。

注意,如果您的测试iterable是空的,并且没有产生任何结果——如图所示以及在大多数或所有答案中所示——您的测试将不会执行
for
循环中的任何代码。由于引用Python标准库而被接受。这让我感到好奇。为什么
str
iterable?就是这样。虽然像lambda:iter(())
这样的答案满足了人类对聪明的本能驱动力,但它们也是不可读的,无法产生真正的发电机。特别是,
isinstance(iter(()),types.GeneratorType)==False
。正如相对成功的研究所表明的那样,类型有时确实很重要。总是< <代码>收益> <代码>,Python 3人。这很好,但是我得到了:<代码> F99 9 < /代码>警告,你可能想考虑python。
def empty_gen():
    yield from ()