Python 如何在没有赋值和组合的情况下更改lambda表达式的功能?
给定表达式Python 如何在没有赋值和组合的情况下更改lambda表达式的功能?,python,lambda,Python,Lambda,给定表达式f=lambda x:x+x,是否可以通过使用单行表达式编辑f的功能,从而获得以下结果: f(7) = 14 `the expression subtracts one from the return value of f` f(7) = 13 您只需重新指定f,但是,只在一行中执行此操作将非常棘手,因为您需要保留对旧lambda的引用: old_f = f f = lambda x: old_f(x) - 1 您可以为此使用闭包: f = (lambda old_f: (lamb
f=lambda x:x+x
,是否可以通过使用单行表达式编辑f
的功能,从而获得以下结果:
f(7) = 14
`the expression subtracts one from the return value of f`
f(7) = 13
您只需重新指定
f
,但是,只在一行中执行此操作将非常棘手,因为您需要保留对旧lambda的引用:
old_f = f
f = lambda x: old_f(x) - 1
您可以为此使用闭包:
f = (lambda old_f: (lambda x: old_f(x) - 1))(f)
您可以使用默认参数值通过闭包保留以前的函数,而无需引入任何新变量:
f = lambda x: x*2
print f(7) # --> 14
f = (lambda prev_f=f: (lambda x: prev_f(x) - 1))(f)
print f(7) # --> 13
不错,但是与lamba x:x+x-1相比,您所付出的代价可能只是性能上的一点小小的损失。这不是一个要求;)。性能损失最有可能达到100%,因为函数调用是这里最主要的操作,对于修改后的f
,您正在调用两个函数(f
和old\u f
).你能解释一下使用这个解决方案时在范围级别发生了什么吗?@Medvednic他正在构建一个新的lambda,它内部保存着旧的lambda。因此,您无法再访问旧lambda,但新lambda可以。两者都还在记忆中,都被使用过。你以前看到过Filmer的答案吗?看起来很相似。@Trilarion:是的,我看到了filmor的答案,答案很相似,但并不完全相同。区别在于它不需要事先单独的prev_f=f
语句,因此它实际上是一个单行解决方案。