gpt4 book ai didi

返回列表或作为生成器工作的 Python 函数?

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:58 27 4
gpt4 key购买 nike

我正在尝试创建一个返回对象或用作生成器的函数。

这是一个坏主意,因为作为最佳实践,您希望函数可靠地返回相同类型的值,但为了科学的利益...

我使用的是 Python 2,所以 range 返回一个列表,而 xrange 是一个可迭代对象(有趣的是,它还提供了一个 __len__ ).

def xr(start, stop=None, step=1, gen=True):
if stop is None:
start, stop = 0, start
if gen == True:
for i in xrange(start, stop, step):
yield i
else:
return range(start, stop, step)

我收到这个错误:

  File "<stdin>", line 8
SyntaxError: 'return' with argument inside generator

问题:

为什么(除了显而易见的“你不能在一个函数中同时拥有 yield 和 return”,假设这是正确的)它这样做了?查看我的代码,并不清楚为什么这样做会很糟糕。

我将如何尝试解决这个问题?我知道我可以返回 xrange 而不是从 xrange 中生成每个项目,因此我可以返回在另一个函数中创建的生成器,但有没有更好的方法?

最佳答案

如何使用 generator expression

>>> def xr(start, stop=None, step=1, gen=True):
... if stop is None:
... start, stop = 0, start
... if gen == True:
... return (i for i in xrange(start, stop, step)) # <----
... else:
... return range(start, stop, step)
...
>>> xr(2, gen=False)
[0, 1]
>>> xr(2, gen=True)
<generator object <genexpr> at 0x0000000002C1C828>
>>> list(xr(2, gen=True))
[0, 1]

顺便说一句,我宁愿只定义一个生成器函数。如果我需要一个列表,然后使用 list(xr(..))

更新 或者,您可以使用 iter(xrange(start, stop, step)) 而不是 @DSM 评论的生成器表达式。参见 Built-in functions -- iter .

关于返回列表或作为生成器工作的 Python 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com