鱼C论坛

 找回密码
 立即注册
查看: 1925|回复: 11

[已解决]关于python中return返回值的疑问

[复制链接]
发表于 2021-1-28 14:07:14 | 显示全部楼层 |阅读模式

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

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

x
老师好。我有个疑问请老师能解答一下谢谢
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY

a = funX()
print(a())
print(a())
print(a())
这段代码中内嵌函数两个return返回值是将x和funY返回给谁是a吗?一直没搞明白函数体中return返回到哪一步。谢谢老师能讲解一下。
最佳答案
2021-1-28 14:47:26


善用论坛的搜索功能~:[已解决] 内嵌函数和闭包课后题

def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY
首先定义函数 funX() 已经该函数的内嵌函数 funY():
a = funX()
然后调用 funX 函数,从函数定义中可以看出 funX 函数 return 返回值为 funY

那么此时 a = funX() 相当于 a = funY (注意这里没有括号,说明是指代 funY 函数本身,而不是调用 funY 函数)

而且此时 x 被赋值为 5 ,然后你执行 :
print(a())
此时 a() 因为 a = funY ,所以 a() 相当于 funY() ,使得 x + 1 然后返回 x 的值,被 print 函数打印

后续反复执行两次,即 funY() 函数的调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-28 14:47:26 | 显示全部楼层    本楼为最佳答案   


善用论坛的搜索功能~:[已解决] 内嵌函数和闭包课后题

def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY
首先定义函数 funX() 已经该函数的内嵌函数 funY():
a = funX()
然后调用 funX 函数,从函数定义中可以看出 funX 函数 return 返回值为 funY

那么此时 a = funX() 相当于 a = funY (注意这里没有括号,说明是指代 funY 函数本身,而不是调用 funY 函数)

而且此时 x 被赋值为 5 ,然后你执行 :
print(a())
此时 a() 因为 a = funY ,所以 a() 相当于 funY() ,使得 x + 1 然后返回 x 的值,被 print 函数打印

后续反复执行两次,即 funY() 函数的调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-28 16:21:51 | 显示全部楼层
Twilight6 发表于 2021-1-28 14:47
善用论坛的搜索功能~:[已解决] 内嵌函数和闭包课后题

老师我还有个疑问为什么
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY()

a = funX()
print(a())
print(a())
print(a())
不能这样返回funY()的值而是一定要返回函数体。我看了返回funY()报错不可调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 16:26:58 | 显示全部楼层
redaiconglin 发表于 2021-1-28 16:21
老师我还有个疑问为什么
def funX():
    x = 5


这样代码你调用 funX() 是不是 返回 funY()了?

那么 a = funX() 就是 a = funY() 而 funY() 返回 x 所以 a 最后等于 x 即  6

a = 6 此时你 print(a()) 就等价于 6() ,而 6() 没有这种语法呀~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-28 16:43:35 | 显示全部楼层
本帖最后由 redaiconglin 于 2021-1-28 16:48 编辑
Twilight6 发表于 2021-1-28 16:26
这样代码你调用 funX() 是不是 返回 funY()了?

那么 a = funX() 就是 a = funY() 而 funY() 返回  ...


感谢老师的讲解。那我把代码改成这样
def funX():                 2步
    x = 5                     3步
    def funY():             5步
        nonlocal x
        x += 1
        return x            
    return funY()         4步

a = funX()                1步
print(a)
print(a)
print(a)
输出的是6、6、6这个里面return x为什么返回的值是5而不是6.这个里面不是已经用nonlocal 申明过了吗?另外我没弄明白这段代码运行的顺序。是我标注的这样吗?感谢老师谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 16:45:03 | 显示全部楼层
redaiconglin 发表于 2021-1-28 16:43
感谢老师的讲解。那我把代码改成这样
def funX():
    x = 5


你认真看 return x 的前面一行代码~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-28 16:50:54 | 显示全部楼层
Twilight6 发表于 2021-1-28 16:45
你认真看 return x 的前面一行代码~

return x前面的这段代码是x =x + 1,那是不是返回的是6不是5.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 16:53:15 | 显示全部楼层
redaiconglin 发表于 2021-1-28 16:50
return x前面的这段代码是x =x + 1,那是不是返回的是6不是5.

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

使用道具 举报

 楼主| 发表于 2021-1-28 16:55:52 | 显示全部楼层

def funX():                 2步
    x = 5                     3步
    def funY():             5步
        nonlocal x
        x += 1
        return x            
    return funY()         4步

a = funX()                1步
print(a)
print(a)
print(a)
老师那这段代码运行的顺序是这样吗?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 16:57:27 | 显示全部楼层
redaiconglin 发表于 2021-1-28 16:55
def funX():                 2步
    x = 5                     3步
    def funY():             5 ...


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

使用道具 举报

 楼主| 发表于 2021-1-28 17:06:15 | 显示全部楼层

实在不好意思老师最后一个问题
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
      
    return funY()

a = funX()
print(a)
print(a)
print(a)
这段代码中我把return x这个删除了,为什么输出是none,在返回funY的时候x不是应该计算过了吗?谢谢

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
Twilight6 + 2 + 3 + 3 加油~

查看全部评分

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

使用道具 举报

发表于 2021-1-28 17:07:44 | 显示全部楼层
redaiconglin 发表于 2021-1-28 17:06
实在不好意思老师最后一个问题
def funX():
    x = 5



因为 funY 函数没有设置返回值,Python 默认返回 None

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
redaiconglin + 5 + 3 感谢版主的耐心讲解。鱼C有你更精彩。

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 11:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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