def do_twice(f,x): f(x) f(x) def do_four(f,x): do_twice(do_twice(f,x),x) def printx(x): print(x) do_four(printx,"text")
我是该语言的初学者,我发现函数可以很容易地作为参数发送。所以我决定使用它。但是我尝试了这个,以及一些随机更改的版本,都失败了。
def do_four(f,x): do_twice(f,x) do_twice(f,x)
我知道我可以解决这个问题,但由于以前的问题不起作用,我想知道原因。
答案 0 :(得分:0)
您对do_twice()
的嵌套调用(在do_four()
内)会返回None
,因为您没有明确返回其他内容。对do_twice()
的“外部”调用会将值None
视为要调用的函数,但None
不是函数。
首先评估对do_twice()
的最内层函数调用,以便建立外部调用的第一个参数。这个最里面的调用传递正确的参数(函数和对象)。这导致前两行text
。当do_twice()
的第一次调用返回时,如果没有给出显式返回,则返回None
,这是默认返回。
None
然后作为第一个参数传递给do_twice()
的最外层调用,但None
不是函数,所以你不能“调用”它。最终,外部调用似乎是一个如下调用:
do_twice(None, x)
# ^^^^ note the None value here; None is not a function, so
# the subsequent call to do_twice() fails
如果do_twice()
在尝试调用f
之前检查f
是否为函数,则不会发生此错误,而只会看到{{1}的两行印刷。
答案 1 :(得分:0)
在你的四个功能中:
text
对def do_four(f,x):
do_twice(do_twice(f,x),x)
的第一次调用将在输入正确的情况下运行,但由于 do_twice
将返回call
,下一次调用{{1尝试调用函数“None
”,从而失败。
所以,你有两个选择,你可以明确地两次进行调用:
do_twice
或使用更具可扩展性的<{1}} :
None