Python函数返回列表还是作为生成器工作?
发布时间:2020-12-20 12:30:29 所属栏目:Python 来源:网络整理
导读:我正在尝试创建一个返回对象或作为生成器的函数. 这是一个坏主意,因为作为一种最佳实践,您希望函数可靠地返回相同类型的值,但为了科学的利益…… 我正在使用Python 2,因此range返回一个列表,xrange是一个可迭代的(有趣的是它也提供了__len__). def xr(start,
我正在尝试创建一个返回对象或作为生成器的函数.
这是一个坏主意,因为作为一种最佳实践,您希望函数可靠地返回相同类型的值,但为了科学的利益…… 我正在使用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,step) 我收到此错误: File "<stdin>",line 8 SyntaxError: 'return' with argument inside generator 问题: 为什么(除了显而易见的“你不能同时在函数中产生和返回”,假设是正确的)它是否这样做?看看我的代码,不清楚为什么这样做会很糟糕. 我怎么试图绕过这个?我知道我可以返回xrange而不是从xrange中产生每个项目,所以我可以返回在另一个函数中创建的生成器,但是有更好的方法吗? 解决方法
使用
generator expression怎么样?
>>> def xr(start,gen=True): ... if stop is None: ... start,start ... if gen == True: ... return (i for i in xrange(start,step)) # <---- ... else: ... return range(start,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(开始,停止,步))而不是@DSM评论的生成器表达式.见Built-in functions — (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |