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

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)

  • 您可能需要考虑 pythonic [`yield from ()`](/sf/answers/2566120581/)。 (4认同)

Ign*_*ams 11

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

my_iterable = lambda: iter(())
Run Code Online (Sandbox Code Playgroud)


alu*_*iak 7

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

def empty_gen():
    yield from ()
Run Code Online (Sandbox Code Playgroud)

哪个是可读的,并empty_gen作为生成器保留.

  • **就这样。**虽然像“ lambda:iter(())`这样的答案满足了人类对聪明的本能驱动力,但它们也不可读,并且无法生成实际的* generator。*特别是,isinstance(iter( ()),types.GeneratorType)== False`。正如[`mypy`](http://mypy-lang.org/)的相对成功所表明的那样,类型有时* do *很重要。总是从Python 3人“产生”。 (2认同)

geo*_*org 6

怎么样

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__).