Python中的函数提供错误消息

时间:2017-01-30 08:41:20

标签: python function

我正在学习Python,而我正在阅读" Think Python"并做了一些简单的练习。

我被问及"定义一个名为do_four的新函数,它接受一个函数对象和一个值,并调用该函数四次,将该值作为参数传递。"

我试图通过调用一个名为do_twice()的函数来用一个语句编写这个函数,并用一个名为print_double()的函数测试它。这是代码:

def do_twice(f, x): 
    f(x) 
    f(x)

def do_four(f, v):
    do_twice(do_twice(f, v), v)

def print_twice(s): 
    print s
    print s

s = 'abc'

do_four(print_twice, s)

此代码产生错误:

abc
abc
abc
abc
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-41-95b513e5e0ee> in <module>()
----> 1 do_four(print_twice, s)

<ipython-input-40-100f8587f50a> in do_four(f, v)
      1 def do_four(f, v):
----> 2     do_twice(do_twice(f, v), v)

<ipython-input-38-7143620502ce> in do_twice(f, x)
      1 def do_twice(f, x):
----> 2     f(x)
      3     f(x)

TypeError: 'NoneType' object is not callable

在试图了解发生了什么时,我试图构建一个堆栈图,如书中所述。这是:

enter image description here

你能解释一下错误信息并对Stack Diagram进行评论吗?

您的建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

do_twice获取第一个参数的函数,并且不返回任何内容。因此,没有理由通过do_twice do_twice的结果。您需要传递它a function

这就是你的意思:

def do_four(f, v):
    do_twice(f, v)
    do_twice(f, v)

非常类似于do_twice

定义f的方式

答案 1 :(得分:1)

JOIN

略有改写:

do_twice(do_twice(f, v), v)
         ^^^^^^^^^^^^^^

您将result = do_twice(f, v) do_twice(result, v) 的返回值作为第一个参数传递给do_twice(...)。该参数应该是一个函数对象。 do_twice(...)不会返回任何内容,因此do_twiceresult,而您传递的是None而不是预期的函数对象。

在这里以任何方式嵌套两个do_twice毫无意义。

答案 2 :(得分:0)

do_twice(do_twice(f, v), v)

您不能将do_twice(f,v)作为函数参数传递,因为它不返回任何内容。