我正在玩迭代,更具体地说是Python中的yield
运算符。在使用测试驱动的开发来开始编写新的可迭代时,我想知道什么是最短的代码可以使迭代的这个简单测试通过:
def test():
for x in my_iterable():
pass
我能想到的最短版本是:
def my_iterable():
for i in []:
yield i
是否可以编写更简单,更短或更漂亮(pythonic)的版本?
答案 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
这是一种使用以下属性的替代方法: