Python 为什么';这个小函数不起作用吗 def do_两次(f,x): f(x) f(x) def do_四(f,x): 做两次(做两次(f,x,x) def printx(x): 打印(x) do_four(printx,“文本”)
我是该语言的初学者,我发现函数可以很容易地作为参数发送。所以我决定用它。但我尝试了这个,一些随机更改的版本,都失败了 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_四(f,x): 做两次(f,x) 做两次(f,x)Python 为什么';这个小函数不起作用吗 def do_两次(f,x): f(x) f(x) def do_四(f,x): 做两次(做两次(f,x,x) def printx(x): 打印(x) do_four(printx,“文本”),python,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_四(f,x): 做两次(f,x) 做两次(f,x) 我知道我可以解决这样的问题,但因为之前
我知道我可以解决这样的问题,但因为之前的一个不起作用,我想知道原因。您对
dou tweep()
(在dou four()
内部)的嵌套调用返回None
,因为您没有显式返回其他内容。对do_tweep()
的“外部”调用将值None
视为要调用的函数,但None
不是函数
首先计算对do_tweep()
的最内层函数调用,以建立外部调用的第一个参数。这个最内部的调用传递正确的参数(函数和对象)。这将导致前两行打印的文本
。当第一次调用do_tweep()
返回时,它返回None
,如果没有给出显式返回,这是默认返回
None
然后作为第一个参数传递给最外层的调用dou_tweep()
,但是None
不是函数,因此不能“调用”它。最终,外部调用将显示为如下所示的调用:
def do_four(f,x):
do_twice(f,x)
do_twice(f,x)
如果在尝试调用
f
之前检查f
是否为函数,则不会发生此错误,相反,您只会看到打印的文本的两行。在四个函数中:
do_twice(None, x)
# ^^^^ note the None value here; None is not a function, so
# the subsequent call to do_twice() fails
第一次调用do_两次
将在输入正确时运行,但由于该调用
将返回None
,下一次调用do_两次
将尝试调用函数“None
”,因此失败
因此,您有两种选择,您可以直接调用两次:
def do_four(f,x):
do_twice(do_twice(f,x),x)
或者对循环使用更具可伸缩性的:
它是如何“失败”的?请详细说明你期望的行为,你看到的行为,以及它是如何不充分的。你有错误吗?然后发布完整的错误消息,包括堆栈跟踪。很好的实验!如果您(仅用于故障排除)定义do_twice1(f,x)
和do_twice2(f,x)
然后调用do_twice1(do_twice2(printx,'text'),'text')
,它是否有效?我的想法是,也许一个人不能从内部调用函数。例如,解释器也不允许您递归导入模块。如果您在这一行中传递了dou两次(f,x)
错误dou两次(dou两次(f,x),x)
。do_tweep
的第一个参数是函数引用,而不是函数调用(None
)。
def do_four(f,x):
do_twice(f,x)
do_twice(f,x)
def do_four(f,x):
for _ in range(2):
do_twice(f, x)