在Python中使用yield创建空iterable的最简单方法是什么?
我在玩iterables,更具体地说,是Python中的在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
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 ()