关于python:如何将一些(但不是全部)参数的函数传递给另一个函数?

How to pass a function with some (but not all) arguments to another function?

本问题已经有最佳答案,请猛点这里访问。

我有这个函数f(x,a,b):

1
2
def f(x, a, b):
    return a*x + b

我必须将此函数传递给另一个预先设置为'a'和'b'的函数,例如:

1
2
3
4
5
def print2(f):
    x = np.linspace(0,1,10)
    print(f(x))

print2(f( , 1, 1))

我知道还有其他方法可以解决这个特定的问题,但这只是一个例子,而不是真正的问题,而且我想知道是否还有做类似这样的事情"print2(f(,1,1))"。 换句话说,无论如何都要做到这一点,而不必一直通过参数? 喜欢,

1
2
3
4
def print3(f, a, b):
    x = np.linspace(0, 1, 10)
    print(f(x, a, b))
print3(f, a, b)

你可以完全使用functools.partial!

1
2
3
4
5
def print2(f):
    x = np.linspace(0,1,10)
    print(f(x))
f2 = functools.partial(f, a=1, b=2)
print2(f2)

对于使用partial获得的许多可能的优点,请参阅此内容。

简而言之:

  • 部分允许内省,您可以知道您设置值的内容。
  • 在许多领域的标准库中都支持部分,并且由asyncio等模块推荐。
  • 与lambda不同,部分可以腌制。
  • 部分是完全固定的,不需要使用可能导致固定改变的闭合变量。
  • 部分执行速度更快。

还有很多...


你可以把它包装在另一个函数中:

1
2
3
g = lambda x: f(x, 1, 1)

print2(g)

无论需要提供什么数据,都要创建外部函数的参数,然后传递数据。

我被告知这种方法在Python中并不理想。 @Bharel的回答可能更合适。


lambdapartial都是创建新函数的奇特方式。你也可以自己写一下:

1
2
def f2(x):
    return f(x, 1, 1)

使lambdapartial特殊的是它们是表达式,可以直接作为参数传递给高阶函数。