我在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)
不应该这样做:
d2g = diff2(g(t), t)
答案 0 :(得分:5)
g
作为参数传递给diff2
。在diff2
中,该参数称为f
,因此在diff2
内,名称f
引用函数g
。当diff2
调用f(x-h)
(以及其他调用它)时,它会调用g
并提供参数。
换句话说,当您执行diff2(g, t)
时,您告诉diff2
g
是要调用的函数。 g
中提供diff2
的参数:
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
将是一个数字(值{ {1}})而不是函数。
答案 1 :(得分:3)
有问题的功能相当随机,可能难以理解。让我们考虑一个简单的例子,一个函数sum
,它取两个数字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
不同的事情。我们可以compute
两个数字sum
:
compute(sum, 1, 3)
我们可以compute
两个数字的乘积:
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