Python函数将应用于另一个变量

时间:2016-10-28 16:43:11

标签: 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,它将无法直接用于函数。

应该有效的代码是some_function(a)(b)

4 个答案:

答案 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