将应用于另一个变量的Python函数
例如:将应用于另一个变量的Python函数,python,function,python-3.x,Python,Function,Python 3.x,例如: def some_function(a): if a == 1: return x ** 2 else: return x - 1000 some_function(a)(b) 结果当我们有a==1时,得到b**2,在所有其他情况下得到b-1000 在python中,是否有可能获取作为返回的某个未知变量,该变量将被另一个变量替换 问题恰恰是关于不触摸b,它将无法直接用于函数 应该起作用的代码是一些函数(a)(b)这通常被称为
def some_function(a):
if a == 1:
return x ** 2
else:
return x - 1000
some_function(a)(b)
结果当我们有a==1
时,得到b**2
,在所有其他情况下得到b-1000
在python中,是否有可能获取作为返回的某个未知变量,该变量将被另一个变量替换
问题恰恰是关于不触摸b
,它将无法直接用于函数
应该起作用的代码是一些函数(a)(b)这通常被称为currying或partial函数。在python中看起来是这样的
from functools import partial
def some_function(a, x):
if a == 1:
return x ** 2
else:
return x - 1000
通常,存储分部函数
a = 1
func = partial(some_function, a)
func(5)
但你也可以把它们当作一行
partial(some_function, 1)(5)
partial(some_function, 0)(1500)
或者,您可以使用某些函数
返回函数
def some_function(a):
if a == 1:
return lambda b: b **2
else:
return lambda b: b - 1000
但是,使用
partial
通常是更灵活的方法。这通常被称为currying或partial函数。在python中看起来是这样的
from functools import partial
def some_function(a, x):
if a == 1:
return x ** 2
else:
return x - 1000
通常,存储分部函数
a = 1
func = partial(some_function, a)
func(5)
但你也可以把它们当作一行
partial(some_function, 1)(5)
partial(some_function, 0)(1500)
或者,您可以使用某些函数
返回函数
def some_function(a):
if a == 1:
return lambda b: b **2
else:
return lambda b: b - 1000
不过,使用
partial
通常是更灵活的方法。在这种情况下,另一个答案是正确的,但可能不适合您正在尝试的操作
您要做的是返回一个函数,Python使之非常容易:
def some_function(a):
if a == 1:
def f(x):
return x ** 2
else:
def f(x):
return x - 1000
return f
>>> some_function(1)(5)
25
>>> some_function(0)(1500)
500
在这种情况下,另一个答案是正确的,但可能不适合您正在尝试的操作 您要做的是返回一个函数,Python使之非常容易:
def some_function(a):
if a == 1:
def f(x):
return x ** 2
else:
def f(x):
return x - 1000
return f
>>> some_function(1)(5)
25
>>> some_function(0)(1500)
500
尽管Brian的答案是有效的,但它存在代码重复,并且无法利用函数闭包 函数闭包意味着函数定义范围内的变量在函数创建后会得到维护,即使这些变量现在超出了范围
def some_function(a):
def f(x):
if a == 1:
return x ** 2
else:
return x - 1000
return f
some_function(a)(b)
>>> some_function(1)(4)
16
>>> some_function(0)(1000)
0
在本例中,变量
a
仅在some_function
的范围内定义,但由于我们在f(x)
中使用它,因此在稍后调用返回函数时仍然可用。尽管Brian的答案有效,但它存在代码重复,无法利用函数闭包
函数闭包意味着函数定义范围内的变量在函数创建后会得到维护,即使这些变量现在超出了范围
def some_function(a):
def f(x):
if a == 1:
return x ** 2
else:
return x - 1000
return f
some_function(a)(b)
>>> some_function(1)(4)
16
>>> some_function(0)(1000)
0
在本例中,变量
a
仅在some_function
的范围内定义,但由于我们在f(x)
中使用它,因此当我们稍后调用返回的函数时,它仍然可用。其他答案将起作用,但您可能正在寻找它
def first_function(a):
return a ** 2
def second_function(a):
return a - 1000
def some_funtion(a):
if a == 1:
return first_function
else:
return second_function
print(some_function(1)(3)) #prints 9
print(some_function(0)(1500)) #prints 500
其他答案也行,但你可能正在寻找答案
def first_function(a):
return a ** 2
def second_function(a):
return a - 1000
def some_funtion(a):
if a == 1:
return first_function
else:
return second_function
print(some_function(1)(3)) #prints 9
print(some_function(0)(1500)) #prints 500
是的,这就是我要找的!是的,这就是我要找的!这很有趣,谢谢!但是正确的答案是在def中使用另一个def;您只需要寻找简单的表达式。如果您需要返回函数(即语句)的更多功能,
def
将是必需的。感谢lambda,它适用于简单的情况,但在我的情况下,它使errors@XuMuK是的,lambdas
只能执行一个表达式(如x**2
)。如果有多个表达式或条件,则必须使用def
。Guido不太喜欢使用lambda
s,所以他们故意让人们使用def
sparial非常有趣,谢谢!但是正确的答案是在def中使用另一个def;您只需要寻找简单的表达式。如果您需要返回函数(即语句)的更多功能,def
将是必需的。感谢lambda,它适用于简单的情况,但在我的情况下,它使errors@XuMuK是的,lambdas
只能执行一个表达式(如x**2
)。如果有多个表达式或条件,则必须使用def
。Guido并不真正喜欢使用lambda
s,因此他们被有意地欺骗,迫使人们使用def
s。我不清楚这种方法的好处:为什么你希望a
可以被f()
使用?或者您只是在为返回函数中必须使用a
的情况做准备?是的,这种方法更灵活。如果功能中需要使用a
,则它可以。例如,您可以通过这种方式实现乘法(a)(b)
函数,而不改变结构。@AdamVanProoyen明白了:我认为“未能利用函数闭包”更像是OP需要做什么的问题,而不是我的不当实现:如果OP需要使用a
,当然,它应该在返回的函数中。不过,他举了一个简单的例子,这是没有必要的。我不清楚这种方法的好处是什么:为什么你希望a
能够提供给f()
?或者您只是在为返回函数中必须使用a
的情况做准备?是的,这种方法更灵活。如果功能中需要使用a
,则它可以。例如,您可以通过这种方式实现乘法(a)(b)
函数,而不改变结构。@AdamVanProoyen明白了:我认为“未能利用函数闭包”更像是OP需要做什么的问题,而不是我的不当实现:如果OP需要使用a
,当然,它应该在返回的函数中。不过,在他引用的简单案例中,这是没有必要的。我在手机上,请告诉我我是否犯了错误。这是有效的解决方案,但不需要使用三个def。我在手机上,请让我知道我是否犯了错误。这是有效的解决方案,但不是