Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';这个小函数不起作用吗 def do_两次(f,x): f(x) f(x) def do_四(f,x): 做两次(做两次(f,x,x) def printx(x): 打印(x) do_four(printx,“文本”)_Python - Fatal编程技术网

Python 为什么';这个小函数不起作用吗 def do_两次(f,x): f(x) f(x) def do_四(f,x): 做两次(做两次(f,x,x) def printx(x): 打印(x) do_four(printx,“文本”)

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) 我知道我可以解决这样的问题,但因为之前

我是该语言的初学者,我发现函数可以很容易地作为参数发送。所以我决定用它。但我尝试了这个,一些随机更改的版本,都失败了

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)