有没有办法消除在 Python 表达式中多次出现的同一 lambda 表达式的多次计算?

Is there a way to eliminate multiple computations of same lambda expression occurring multiple times in a Python expression?

我试图用众所周知的三角形面积公式来举例说明 python lambda 表达式。给定三个边 abc 和半周长 s (a+b+c)/2,面积为(s * (s-a) * (s-b) * (s-c ))。所以,我写了 python 代码:

s = lambda a, b, c : (a + b + c)/2 #Line 1
area_tri = lambda a, b, c : (s(a,b,c) * (s(a,b,c)-a) * (s(a,b,c)-b) * \
   (s(a,b,c)*c)) ** 0.5
area_tri(1, 2, 3)

计算area_tri的语句要计算s(a, b, c)四次。所以,我想我是否可以这样写:

semi = s

在第 1 行之后,将 s(a,b,c) 中的每个 semi 替换为 area_tri计算语句。但是,它会产生 a、bc 是未知符号的错误。有无错误的替代方案吗?

python3.8后可以使用海象算子:=:

area_tri = lambda a, b, c: ((semi := s(a, b, c)) * (semi - a) * (semi - b) * (semi - c)) ** 0.5

对于早期版本,最好的方法是定义一个函数:

def area_tri(a, b, c):
    semi = s(a, b, c)
    return (semi * (semi - a) * (semi - b) * (semi - c)) ** 0.5