3

我在一本 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)
4

2 回答 2

5

g作为参数传递给diff2. 在diff2,那个参数被调用f,所以里面diff2的名字f指的是函数g。当diff2调用f(x-h)(以及其他调用)时,它正在调用g,并提供参数。

换句话说,当你这样做时diff2(g, t),你是在告诉diff2g是要调用的函数。的参数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将在调用之前调用diff2diff2然后在尝试调用时会失败f,因为f它将是一个数字(值g(1.2))而不是一个函数。

于 2013-04-10T23:01:19.210 回答
3

所讨论的功能相当随机,可能难以理解。让我们考虑一个简单的例子,一个函数sum,它接受两个数字ab,并返回它们的和。实际上,我们可以很容易地定义另一个函数prod,它也返回他们的产品。

def sum(a,b):
    return a + b

def prod(a,b):
    return a * b

假设我们有另一个 function compute,它将操作(一个函数)和两个操作数(调用函数的两个数字)作为其参数。在compute中,我们在参数上调用给定的操作。

def compute(fn, a, b):
    return fn(a, b)

我们可以compute做不同的事情。我们可以computesum两个数:

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
于 2013-04-10T23:16:22.073 回答