例如:
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
,它将无法直接用于函数。
应该有效的代码是some_function(a)(b)
。
答案 0 :(得分:6)
这通常称为 currying 或部分函数。它在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)
或者,你可以让some_function
返回一个函数
def some_function(a):
if a == 1:
return lambda b: b **2
else:
return lambda b: b - 1000
使用partial
通常是更灵活的方法。
答案 1 :(得分:4)
在这种情况下,另一个答案是正确的,但可能不适合您要做的事情。
你要做的是返回一个函数,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
答案 2 :(得分:4)
尽管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)
中使用它,所以当我们稍后调用返回的函数时它仍然可用
答案 3 :(得分:1)
其他答案可行,但您可能正在寻找此答案。
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