加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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 — iter.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读