鱼C论坛

 找回密码
 立即注册
查看: 2069|回复: 5

为什么会返回“字符串对象不能被调用”的错误提示?

[复制链接]
发表于 2023-5-30 18:13:48 | 显示全部楼层 |阅读模式

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

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

x
def fun1():
        print('fun1()正在被调用…')
        def fun2():
                return ('fun2()正在被调用…')
        return fun2()

>>> fun1()()
fun1()正在被调用…
Traceback (most recent call last):
  File "<pyshell#124>", line 1, in <module>
    fun1()()
TypeError: 'str' object is not callable


能否结合语句执行的逻辑先后讲解下?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 18:35:56 | 显示全部楼层
上述代码定义了两个嵌套的函数 fun1() 和 fun2(),其中函数 fun1() 调用了函数 fun2() 并返回其结果。具体来说,fun1() 函数的执行逻辑如下:

  • 执行第一条语句 print('fun1()正在被调用…'),输出字符串 'fun1()正在被调用…';
  • 执行第二条语句 return fun2(),调用函数 fun2() 并将其返回值返回给调用方。

由于 fun2() 函数的返回值是字符串 'fun2()正在被调用…',因此 fun1() 函数的返回值也是该字符串。因此,当我们调用 fun1()() 时,会执行 fun1() 函数,并将其返回值(即字符串 'fun2()正在被调用…')作为函数调用的结果。但由于该字符串并不是一个可调用对象,因此会出现异常 'str' object is not callable。

如果我们想要避免上述异常,可以将 return fun2() 改为 return fun2,这样 fun1() 函数就返回了内部定义的函数 fun2(),而不是其返回值。这时,调用 fun1()() 得到的结果就是函数 fun2() 的执行结果 'fun2()正在被调用…',而不再会出现异常。


求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-30 18:54:15 | 显示全部楼层
本帖最后由 lzb1001 于 2023-5-30 19:05 编辑
sfqxx 发表于 2023-5-30 18:35
上述代码定义了两个嵌套的函数 fun1() 和 fun2(),其中函数 fun1() 调用了函数 fun2() 并返回其结果。具体 ...


感谢大神指点!

---请问:

2 执行第二条语句 return fun2(),调用函数 fun2() 并将其返回值返回给调用方。---其中的调用方是否是指外部函数 fun1()?

---另外:

……,并将其返回值(即字符串 'fun2()正在被调用…')作为函数调用的结果。---这句话没看明白,尤其是“作为函数调用的结果”,作为哪个函数的调用结果?

是不是理解为:并将其返回值(即字符串 'fun2()正在被调用…')作为调用内部函数fun2()的参数传入内部函数fun2()???

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-30 19:04:51 | 显示全部楼层
本帖最后由 sfqxx 于 2023-5-30 19:07 编辑
lzb1001 发表于 2023-5-30 18:54
感谢大神指点!

---请问:


是的,这里的调用方指的是外部函数 fun1()。具体来说,在 fun1() 函数执行时,它会调用内部函数 fun2() 并将其返回值作为自己的返回值返回给它的调用方。

对于第二个问题,我理解您可能有所疑惑。在执行 fun1()() 时,第一个括号表示对 fun1() 函数的调用,而第二个括号可以理解为对 fun2() 函数的调用(即外层函数 fun1() 返回的函数对象)。所以,当我们调用 fun1()() 时,实际上是先调用了函数 fun1(),然后又调用了该函数的返回值,即函数 fun2()。由于 fun2() 函数返回的是一个字符串,因此这个字符串就成了整个调用链的结果。换句话说,字符串 'fun2()正在被调用…' 是对整个表达式 fun1()() 的评价结果,也就是说,它是 fun1()() 这个函数调用的结果。只不过由于这个结果是一个字符串,而非一个可调用对象,所以后面的括号就会引发 "TypeError: 'str' object is not callable" 异常。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-30 19:17:48 | 显示全部楼层
sfqxx 发表于 2023-5-30 19:04
是的,这里的调用方指的是外部函数 fun1()。具体来说,在 fun1() 函数执行时,它会调用内部函数 fun2() ...

……具体来说,在 fun1() 函数执行时,它会调用内部函数 fun2() 并将其返回值作为自己的返回值返回给它的调用方。


这句话后半句读起来很绕口

写得完整、复杂点话是不是可以写成下面这样:

……具体来说,外部函数 fun1() 在被执行时会调用内部函数 fun2(), 并将内部函数 fun2()的返回值(即字符串 'fun2()正在被调用…')作为自己的返回值返回给它(指谁?)的调用方(指谁?)。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-30 19:34:04 | 显示全部楼层
lzb1001 发表于 2023-5-30 19:17
……具体来说,在 fun1() 函数执行时,它会调用内部函数 fun2() 并将其返回值作为自己的返回值返回给它的 ...




具体来说,在代码中定义了两个函数,其中 fun2() 是 fun1() 的内部函数,只能在 fun1() 中被调用。当外部函数 fun1() 被调用时,它会执行内部函数 fun2(),并将内部函数 fun2() 的返回值作为自己的返回值返回给自己被调用的地方。因此,以下两行代码等价:
result = fun1()()
result = 'fun2()正在被调用...'
第一行代码首先调用了外部函数 fun1(),然后再调用其返回的结果(即内部函数 fun2() 的返回值);第二行代码直接将内部函数 fun2() 的返回值赋值给变量 result。

希望这样更清晰一些!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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