我正在学习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
在试图了解发生了什么时,我试图构建一个堆栈图,如书中所述。这是:
你能解释一下错误信息并对Stack Diagram进行评论吗?
您的建议将不胜感激。
答案 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_twice
为result
,而您传递的是None
而不是预期的函数对象。
在这里以任何方式嵌套两个do_twice
毫无意义。
答案 2 :(得分:0)
do_twice(do_twice(f, v), v)
您不能将do_twice(f,v)
作为函数参数传递,因为它不返回任何内容。