python3
我得到的输出是20。
这个实际上让我感到困惑,比如它是如何工作的。任何人都可以通过分解来解释我这是如何工作的
答案 0 :(得分:7)
函数apply_twice(func,arg)
接受两个参数,一个函数对象func
和一个传递给名为func
的函数arg
的参数。
在Python中,函数可以很容易地作为参数传递给其他函数, 它们没有被区别对待 比任何其他参数类型(即first class citizens)。
在apply_twice
内,func
在该行中被调用两次:
func(func(arg))
或者,可以以更友好的方式查看:
res = func(arg)
func(res)
如果将func
替换为add_five
中传递的函数名称,则会得到以下内容:
res = add_five(arg) # equals: 15
add_five(res) # result: 20
当然会返回您的预期结果。
要记住的关键点是你不应该将Python
中的函数视为一些特殊的构造,函数就像int
s,lists
s和一切一样的对象别的是。
答案 1 :(得分:2)
从print
调用开始,扩展它执行的代码如下:
apply_twice(add_five,10))
add_five(add_five(10)) # add_five(10) = 15
add_five(15) # add_five(15) = 20
给你结果:20。
调用apply_twice
时,传入的是函数对象和值。正如您在apply_twice
定义中所看到的,您可以看到func
被传递给它的函数对象替换(在本例中为add_five
)。然后,从内部func(arg)
调用开始,评估结果,然后在外部add_five
调用中再次传递给return func( ... )
。
答案 2 :(得分:0)
您在这里需要了解的是
apply_twice(func,arg)
是一个接受两个参数的更高函数(另一个名为func
的函数和一个参数arg
)。它的工作方式是先评估另一个函数的值,然后将该值用作更高函数内的参数。
请记住,我们有一个函数add_five(x)
,该函数将其中的参数提供项加5 ...
然后将此函数add_five(x)
作为参数传递给另一个名为
apply_twice_(func,arg)
返回func(func(arg))
。
现在分裂func(func(arg))
,我们有
func(arg)
#let称之为a
然后func(func(arg))==func(a
),因为a = func(agr)
并且(a)
是我们的add_five(x)
函数,在将其加5后,然后将我们得到的值重新用作另一个新参数来向其添加另外5,这就是为什么我们将20作为我们的结果。
另一个例子是:
def test(func, arg):
return func(func(arg))
def mult(x):
return x * x
print(test(mult, 2))
结果为16。