PEP572中的海象操作员示例



pep572中给出的示例之一是

# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]

目前在Python,您必须做以下操作之一:

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

# option 2 
[f(x), f(x)**2, f(x)**3]

示例意味着这里的选项2可以改进,但是我从未见过在第一个选项上推荐的。是否有一个原因2(以及Walrus操作员(比选项1更好的原因?

只是为了使事情变得清晰:

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

等效于:

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

(f(x)仅称为一次(

,但通常不是这样:

[f(x), f(x)**2, f(x)**3]

(f(x)称为三次(

由于潜在的f() side-effects (或潜在的不必要的计算负担,如果f() pure 函数(。

因此,通常应仔细检查用[f(x), f(x)**2, f(x)**3]替换CC_5。


例如:

def f(x):
    print('Brooks was here.')
    return 2 * x

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

打印一次Brooks was here.

l2 = [f(x), f(x)**2, f(x)**3]

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


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

[f(x), f(x)**2, f(x)**3]

而不是这个

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

当您对副作用特别感兴趣时,无论是什么。

带有动态编程的海象,它可能更快地取决于 f(x)

e = 1
[e := e * f(x) for i in range(1, 4)]

相关内容

  • 没有找到相关文章

最新更新