如何在 Python 的 lambda 表达式中使用 with 语句

How to use with statement in lambda expression for Python

我正在使用 Python 3.5.2(用于 MS SQL 服务器机器学习服务的版本)。我想要一个使用 with 的 lambda 表达式,这样就不会在元组中重复昂贵的计算。一个最小的例子是

lambda x : 
  with x**2 as x2, x**3 as x3 :
    [ (x2**3)*x3-x3 , x2, (x3-5)**x2 ]

但是,这returns一个语法错误。 with 语句如何用在 lambda 表达式中?

我来自可以完成此操作的 Wolfram 语言。例如

With[{x2 = #^2, x3 = #^3},
  { (x2^3)*x3-x3 , x2, (x3-5)^x2 }
]&

我收集了这些微小的计算,这些计算只在一小部分代码(在另一个函数中)中需要。我想将这些作为 lambda 函数保存到 select 和 apply/map 基于该函数中的特定条件。

在python中拼写为:

def fun1(x):
    x2 = x**2
    x3 = x**3 
    return [(x2**3) * x3 - x3 , x2, (x3 - 5) ** x2]

编辑:

还有几点...

首先:有人在评论中提到您可以缓存计算结果以提高性能。这确实是一种常见的模式,通常称为记忆,which is rather easy to implement in Python. Just note that this only works properly with pure functions,当然只有在使用相同参数重复调用记忆函数时才有用。

第二点,你提到:

I have taken this route and defined the mini functions within the function.

你要知道在Python中,def是一个创建新function对象的可执行语句(是的,Python函数是对象——实际上一切in Python 是一个对象)执行时。

这意味着 "top-level" 函数(在模块的顶层定义的函数)在当前进程中首次导入模块时创建一次,但内部(嵌套)函数会重新创建每次调用外部(封闭)函数时。

此外,Python functions are closures,因此嵌套函数可以捕获外部函数的环境(这是主要的 - 并且仅就我而言 - 在 [=42 中使用嵌套函数的原因=]).

这意味着您可以使用内部函数作为另一种方式来缓存一些预先计算的值并使它们可用于一组函数,即:

def outer(x, y):
    x2 = x ** 2
    x3 = x ** 3

    def func1():
        return [(x2**3) * x3 - x3 , x2, (x3 - 5) ** x2]

    def func2(z):
        # dummy example
        return (x2**y) + (y - x3 ** z)

    # etc

    results = [func2(i) for i in func1()]
    return results

另一方面,如果您的 "helper" 函数不依赖于它们的封闭范围,那么在外部函数中定义它们的唯一好处就是一次又一次创建相同函数的开销每次调用外部函数时都会再次调用。如果每个进程只调用一次或两次外部函数当然不是问题,但如果在紧密循环中调用它,开销很快就会成为问题。

在Python3.8中,可以这样写

lambda x: [ (x2 := x**2) * (x3:=x**3) - x3, x2, (x3 - 5) ** x2 ]

但是,这不是很可读。我仍然会使用 def 语句来定义命名函数,如 .

所示

(也许 Python 的某些未来版本会找到一种方法来支持函数式风格的 let 表达式,例如

let x2 := x**2, x3 := x**3 in (x2*x3 - x3, x2, (x3-5) ** x2)

但我不会屏住呼吸。这确实需要关键字来提高可读性,并且存在强烈的阻力——我承认这是有充分理由的——引入新关键字或重载现有关键字。)