Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数作为函数的参数_Python_Function_Arguments - Fatal编程技术网

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) 难

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

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的回答在很大程度上帮助我理解了正在发生的事情。