Ada*_*erg 23 python iterator yield
我正在玩迭代,更具体地说是yieldPython中的运算符.在使用测试驱动开发来开始编写新的可迭代时,我想知道什么是最短的代码可以使迭代的这个简单测试通过:
def test():
for x in my_iterable():
pass
Run Code Online (Sandbox Code Playgroud)
我能想到的最短版本是:
def my_iterable():
for i in []:
yield i
Run Code Online (Sandbox Code Playgroud)
是否可以编写更简单,更短或更漂亮(pythonic)的版本?
Jam*_*man 25
就在这里:
return iter([])
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 11
您可以使用lambda和iter函数在Python中创建一个空的iterable.
my_iterable = lambda: iter(())
Run Code Online (Sandbox Code Playgroud)
Python 3中的另一个解决方案是使用新yield from语法:
def empty_gen():
yield from ()
Run Code Online (Sandbox Code Playgroud)
哪个是可读的,并empty_gen作为生成器保留.
怎么样
my_iterable = str
Run Code Online (Sandbox Code Playgroud)
这通过了你的测试.
要认真地说,Iterable在集合模块中提供:
def __iter__(self):
while False:
yield None
Run Code Online (Sandbox Code Playgroud)
这可以被认为是"最pythonic",因为这是python本身使用的.
请注意,从技术上讲,到目前为止所有答案都提供了迭代器(__iter__+ next),而不是迭代(只是__iter__).