将应用于另一个变量的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。我在手机上,请让我知道我是否犯了错误。这是有效的解决方案,但不是