为什么这个小函数乘法器不起作用

时间:2017-12-15 18:16:46

标签: python

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)

我知道我可以解决这个问题,但由于以前的问题不起作用,我想知道原因。

2 个答案:

答案 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