首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PEP572中的Walrus运算符示例

PEP572中的Walrus运算符示例
EN

Stack Overflow用户
提问于 2019-08-01 20:30:02
回答 2查看 434关注 0票数 2

PEP572中给出的一个示例是

代码语言:javascript
复制
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]

目前在python中,您必须执行以下操作之一:

代码语言:javascript
复制
# option 1
y = f(x)
[y, y**2, y**3]

代码语言:javascript
复制
# option 2 
[f(x), f(x)**2, f(x)**3]

这个例子暗示,这里的选项2可以改进,但我从来没有看到过比第一个选项更好的建议。为什么选项2(因此海象运算符)会比选项1更好,有什么原因吗?

EN

回答 2

Stack Overflow用户

发布于 2019-08-01 20:42:43

我只想说清楚:

代码语言:javascript
复制
[y := f(x), y**2, y**3]

等同于:

代码语言:javascript
复制
y = f(x)
[y, y**2, y**3]

(f(x)只调用一次)

但是,一般来说,不是这样的:

代码语言:javascript
复制
[f(x), f(x)**2, f(x)**3]

(f(x)被调用三次)

由于潜在的f() 副作用(或者潜在的不必要的计算负担,如果f()是一个纯函数)。

因此,一般来说,应该仔细检查用[y := f(x), y**2, y**3]替换[f(x), f(x)**2, f(x)**3]

例如:

代码语言:javascript
复制
def f(x):
    print('Brooks was here.')
    return 2 * x


x = 1
y = f(x)
l1 = [y, y**2, y**3]

打印Brooks was here.一次,同时:

代码语言:javascript
复制
l2 = [f(x), f(x)**2, f(x)**3]

将打印Brooks was here.三次。当然,l1 == l2

因此,要更直接地回答您的问题,您可能需要使用:

代码语言:javascript
复制
[f(x), f(x)**2, f(x)**3]

而不是这个

代码语言:javascript
复制
y = f(x)
[y, y**2, y**3]

当你对副作用特别感兴趣的时候,不管是什么。

票数 7
EN

Stack Overflow用户

发布于 2020-02-17 06:04:02

一个动态编程的海象,依赖于f(x)可能会更快。

代码语言:javascript
复制
e = 1
[e := e * f(x) for i in range(1, 4)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57309129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档