pejayang 发表于 2020-8-28 14:08:36

关于内嵌函数

自己写了两段代码,第一段是
def fun1(x):
        def fun2(y):
                def fun3(z):
                        print(x*y*z)
                return fun3
        return fun2
这一段代码可以正常运行。后来我修改了一下:
def fun1(x):
        def fun2(y):
                def fun3(z):
                        return(x*y*z)
        return fun2
就报错了,错误是:
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
    fun1(5)(6)(6)
TypeError: 'NoneType' object is not callable

这个是什么问题?

Json21 发表于 2020-8-28 14:24:05

没有返回 fun3即 fun1(5)(6) 这是没有返回值的,然后执行fun1(5)(6)(6) 就出错 NoneType 对象不能被调用

sunrise085 发表于 2020-8-28 14:36:04

因为你的fun2没有返回可执行函数,所以只能写fun1(5)(6),而不能再写一个括号

pejayang 发表于 2020-8-31 08:52:09

sunrise085 发表于 2020-8-28 14:36
因为你的fun2没有返回可执行函数,所以只能写fun1(5)(6),而不能再写一个括号

就是说在这里return(x*y*z)和return fun2是不一样的对吗?这两个是哪里不一样呢?

sunrise085 发表于 2020-8-31 13:26:14

pejayang 发表于 2020-8-31 08:52
就是说在这里return(x*y*z)和return fun2是不一样的对吗?这两个是哪里不一样呢?

你再仔细看看你的第二段程序,你的第二段程序的fun2根本没有任何执行语句哎!!
fun2中只有fun3函数的定义,根本没有任何执行语句

第一段程序中的fun2有一句执行语句,就是return fun3,相当于返回了函数fun3的函数体
将程序写成如下形式,才能执行fun1(5)(6)(6),第一个括号是fun1的参数,相当于fun2(6)(6),下一个括号是fun2的参数,相当于fun3(6),然后返回的是fun3内的执行语句 return (x*y*z),即5*6*6的结果
def fun1(x):
      def fun2(y):
                def fun3(z):
                        return(x*y*z)
                return fun3
      return fun2
页: [1]
查看完整版本: 关于内嵌函数