Python 函数作为函数的参数
我在一本Python书中看到了这个示例,它展示了如何将一个函数用作另一个函数的参数:Python 函数作为函数的参数,python,function,arguments,Python,Function,Arguments,我在一本Python书中看到了这个示例,它展示了如何将一个函数用作另一个函数的参数: def diff2(f, x, h=1E-6): r = (f(x-h) - 2*f(x) + f(x+h))/float(h*h) return r def g(t): return t**(-6) t = 1.2 d2g = diff2(g, t) print d2g 我的问题是,在不为函数g提供参数的情况下,这个脚本如何工作?这条线是: d2g = diff2(g,t) 难
def diff2(f, x, h=1E-6):
r = (f(x-h) - 2*f(x) + f(x+h))/float(h*h)
return r
def g(t):
return t**(-6)
t = 1.2
d2g = diff2(g, t)
print d2g
我的问题是,在不为函数g提供参数的情况下,这个脚本如何工作?这条线是:
d2g = diff2(g,t)
难道不应该这样做吗:
d2g = diff2(g(t), t)
g
作为参数传递给diff2
。在diff2
中,该参数称为f
,因此在diff2
中,名称f
指的是函数g
。当diff2
调用f(x-h)
(以及它所做的其他调用)时,它正在调用g
,并提供参数
换句话说,当您执行diff2(g,t)
时,您告诉diff2
要调用的函数是g
。diff2
中提供了g
的参数:
f(x-h) # calls g with x-h as the argument
f(x) # calls g with x as the argument
f(x+h) # calls g with x+h as the argument
如果调用
diff2(g(t),t)
,则将g(1.2)
的结果作为参数传递g
将在调用diff2
之前被调用,而diff2
将在尝试调用f
时失败,因为f
将是一个数字(值g(1.2)
)而不是一个函数。所讨论的函数相当随机,可能很难理解。让我们考虑一个简单的例子,一个函数<代码>和<代码>,它取两个数字<代码> a <代码> > <代码> b>代码>,并返回它们的和。实际上,我们可以很容易地定义另一个函数prod
,该函数也会返回他们的产品
def sum(a,b):
return a + b
def prod(a,b):
return a * b
假设我们有另一个函数compute
,它以操作(一个函数)和两个操作数(调用函数的两个数字)作为参数。在compute
中,我们对参数调用给定的操作
def compute(fn, a, b):
return fn(a, b)
我们可以计算不同的东西。我们可以计算两个数的和:
compute(sum, 1, 3)
compute(prod, 1, 3)
我们可以计算两个数的乘积:
compute(sum, 1, 3)
compute(prod, 1, 3)
基本上,函数名后面没有括号,我们实际上并没有调用函数,它只是名称空间中的另一个对象(正好是我们可以调用的函数)。只有在compute
内部调用函数时,才会调用该函数,此时我们执行fn(a,b)
让我们看看控制台输出是什么样子的:
>>> compute(sum,1,3)
4
>>> compute(prod,1,3)
3
>>> sum
<function sum at mem-address>
>>> prod
<function prod at mem-address>
>>> sum(1,2)
3
计算(和,1,3)
4.
>>>计算(prod,1,3)
3.
>>>总数
>>>刺激
>>>总和(1,2)
3.
g(t)
在您的最后一行中,会告诉g
以参数t
执行,这不是您想要的。我稍微修改了我的问题。让我困惑的是,在上面的例子中,我们从来没有为函数g提供参数。@marillion:正如我所写的,你是这样做的。您只需在diff2(g,t)
行中不调用g
。您要做的是告诉diff2
要调用什么函数,然后diff2
调用它,并提供当时的参数。我可能错了,但python中的函数是第一类对象。@BrenBarn感谢您的解释,花了我一段时间,但我终于得到了它。非常感谢您的清晰解释。这句话:“我们实际上并不是在调用函数,它只是名称空间中的另一个对象”以及BrenBran的回答在很大程度上帮助我理解了正在发生的事情。