鱼C论坛

 找回密码
 立即注册
查看: 1651|回复: 4

[已解决]关于内嵌函数

[复制链接]
发表于 2020-8-28 14:08:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
自己写了两段代码,第一段是
  1. def fun1(x):
  2.         def fun2(y):
  3.                 def fun3(z):
  4.                         print(x*y*z)
  5.                 return fun3
  6.         return fun2
复制代码

这一段代码可以正常运行。后来我修改了一下:
  1. def fun1(x):
  2.         def fun2(y):
  3.                 def fun3(z):
  4.                         return(x*y*z)
  5.         return fun2
复制代码

就报错了,错误是:
  1. Traceback (most recent call last):
  2.   File "<pyshell#45>", line 1, in <module>
  3.     fun1(5)(6)(6)
  4. TypeError: 'NoneType' object is not callable
复制代码


这个是什么问题?
最佳答案
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的结果
  1. def fun1(x):
  2.         def fun2(y):
  3.                 def fun3(z):
  4.                         return(x*y*z)
  5.                 return fun3
  6.         return fun2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 14:24:05 | 显示全部楼层
没有返回 fun3即 fun1(5)(6) 这是没有返回值的,然后执行fun1(5)(6)(6) 就出错 NoneType 对象不能被调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-28 14:36:04 | 显示全部楼层
因为你的fun2没有返回可执行函数,所以只能写fun1(5)(6),而不能再写一个括号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 08:52:09 | 显示全部楼层
sunrise085 发表于 2020-8-28 14:36
因为你的fun2没有返回可执行函数,所以只能写fun1(5)(6),而不能再写一个括号

就是说在这里return(x*y*z)和return fun2是不一样的对吗?这两个是哪里不一样呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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的结果
  1. def fun1(x):
  2.         def fun2(y):
  3.                 def fun3(z):
  4.                         return(x*y*z)
  5.                 return fun3
  6.         return fun2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-26 12:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表