我正在寻找一种在列表理解中完成作业的方法。我想将下面的代码重写为列表理解。
我有这个“昂贵”的功能:
import time
def f(x):
time.sleep(1)
return x + 1
这个循环:
l = []
for value in [1, 2, 3]:
x = f(value)
l.append(x + x)
我想将其重写为列表理解:
l = [
f(value) + f(fvalue)
for value in [1, 2, 3]
]
但是由于调用
f(value)
的成本很高,我想尽量减少调用次数(以下代码片段不会运行):
l = [
(x = f(value))
x + x
for value in [1, 2, 3]
]
我已经阅读了有关赋值表达式(
:=
)(https://www.python.org/dev/peps/pep-0572/#changing-the-scope-rules-for-compressives)但我似乎无法弄清楚。
我的方法是嵌套多个列表理解,例如
l_new = [x * x * y for x, y in [f(value) for value in [1, 2, 3]]]
因此
f()
对于每个值只能调用一次。
这是另一种伪造方法:
[x+x for value in [1, 2, 3] for x in [f(value)]]
这是我最近一直在使用的方法。它不是最漂亮的,但对我来说,它最接近匿名函数的映射(如 Scala 或 TypeScript):
l = [
(
x := f(value),
x + x
)[-1] for value in [1, 2, 3]
]
基本上,我们只是创建一个元组并返回最后一个元素。
这可以由海象操作员来完成。请注意,您需要 Python 3.8 或更高版本。
l = [x:=10 * value for value in [1, 2, 3]]
具有一快一慢功能。
import time
def slow_function(a):
time.sleep(1)
return a + 1
def fast_function(b):
return b + b
l = [
fast_function(x := slow_function(value))
for value in [1, 2, 3]
]
在这两个示例中都可以跳过海象运算符,但也许真正的问题需要它。