单对象迭代器
Single object iterator
为了与 API 保持一致,我必须 返回 一个迭代器,它只产生一个值然后停止(它必须是 .__iter__()
返回的正确值).到目前为止,我有:
return (myobject for _ in [0])
有没有更好的(更多 "Pythonic")方法来做到这一点?
您可以使用 yield
statement:
yield myobject
调用该函数将return生成一个生成器。
我会用
return (myobject for _ in (0,))
或
return (myobject for _ in ".")
因为元组或字符串文字是静态分配的,而 [0]
每次都分配一个新的新列表。
你可以试试
def single_value(x): yield x
return single_value(myobject)
获得发电机。或者与 single_value = lambda x: (i for i in (x,))
.
相同
作为可迭代对象也可以,其他选项是
return iter([myobject])
return iter((myobject,))
而且即使是可迭代的也很好,
return [myobject]
return (myobject,)
更容易。
用你现有的,效果很好:
(o for o in [myobject])
Returns 生成一个对象的生成器。
编辑:6502 的回答更好!不使用列表会更有效率。
编辑:由于问题已更改,此答案不再适用。
我认为这个答案涵盖了迄今为止给出的答案的所有优点
>>> def f():
yield from (x[0] for x in iter(itertools.repeat([myobject], 1)) if True)
>>> type(f())
<class 'generator'>
为了与 API 保持一致,我必须 返回 一个迭代器,它只产生一个值然后停止(它必须是 .__iter__()
返回的正确值).到目前为止,我有:
return (myobject for _ in [0])
有没有更好的(更多 "Pythonic")方法来做到这一点?
您可以使用 yield
statement:
yield myobject
调用该函数将return生成一个生成器。
我会用
return (myobject for _ in (0,))
或
return (myobject for _ in ".")
因为元组或字符串文字是静态分配的,而 [0]
每次都分配一个新的新列表。
你可以试试
def single_value(x): yield x
return single_value(myobject)
获得发电机。或者与 single_value = lambda x: (i for i in (x,))
.
作为可迭代对象也可以,其他选项是
return iter([myobject])
return iter((myobject,))
而且即使是可迭代的也很好,
return [myobject]
return (myobject,)
更容易。
用你现有的,效果很好:
(o for o in [myobject])
Returns 生成一个对象的生成器。
编辑:6502 的回答更好!不使用列表会更有效率。
编辑:由于问题已更改,此答案不再适用。
我认为这个答案涵盖了迄今为止给出的答案的所有优点
>>> def f():
yield from (x[0] for x in iter(itertools.repeat([myobject], 1)) if True)
>>> type(f())
<class 'generator'>