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)]