鱼C论坛

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

return的奇奇怪怪

[复制链接]
发表于 2023-1-3 23:40:35 | 显示全部楼层 |阅读模式

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

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

x
def Fun1():
                x = 5
                def Fun2():
                        nonlocal x
                        x *= x
                        return x
                return Fun2()
这个感觉很奇怪,return x是对函数Fun2(),可是Fun2()又无法调用,第二个return Fun2()是对Fun1()有一个返回值,怎么返回的是一个函数,不理解,求大神解释一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-4 07:43:54 From FishC Mobile | 显示全部楼层
---------可是Fun2()又无法调用
这里fun2本身确实没有自我调用
但是最后一句代码却对它进行了调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-4 08:48:01 | 显示全部楼层
def fun1():
    x = 5     #
    def fun2():
        nonlocal x    #声明非局部变量
        x *= x     #x=x**2
        return x    #返回x
接下来:
return fun2()    #加了括号,返回fun2的返回值25
return fun2       #没加括号,返回值就是fun2这个函数

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

使用道具 举报

发表于 2023-1-4 10:48:12 | 显示全部楼层
请楼主测试一下 以下代码  加深一下对函数地址的理解:
def wp():
    return print

wp()("你说奇怪不,咋还能这样玩???")    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-5 06:15:09 | 显示全部楼层
def Fun1():
    # 第二步 定义变量
    # 需要注意的是,这个x只能在 Fun1 这个函数内部使用
    x = 5

    # 第三步 定义函数
    # 这里只定义函数 不执行
    # 目前为止 Fun2 只能在 Fun1 内部进行过调用
    # 因为 Fun2 的作用域只在 Fun1的内部
    def Fun2():
        # 第五步 执行 函数Fun2 这个函数的代码
        # nonloccal 声明 x 可以在 Fun2 这个函数内使用
        nonlocal x
        # 5 * 5 = 25
        x *= x
        # 将 x 的值 作为Fun2 这个函数的返回值返回
        # 哪里调用了 Fun2 哪里就能接收到这个返回值
        return x    # 在这里可以理解为 return 25
        # 到这里第五步结束 将结果 给第四步的 那个return


    # 第四步 返回 Fun2 这个函数的运行结果
    # 这时候也是调用函数的时候。
    # 函数名 + () 就代表调用函数
    return Fun2()  # 这里调用了 Fun2 所以这里能接收到Fun2 的返回值
    # 只有第五步完成,第四步才会结束。第四步结束才能把返回值给第一步的 f
    # 这里也可以理解为 return 25 到这里第四步运行结束
    # 将返回值 25 给 第一步的 f


# 第一步 调用 Fun1 函数 拿到这个函数的返回值
# 只有第四步运行结束,才能拿到返回值
f = Fun1()
# 打印结果 25
print(f)

# 补充一个知识点
# 函数名后面加括号就是在调用函数,以后看到 func() 这样的写法,不用考虑一定是调用了函数
# 你一直说Fun2 这个函数没有被调用,实际上在第二个return的地方就已经被调用了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-5 09:46:21 | 显示全部楼层
你把代码的执行顺序搞明白就没毛病了。
这个代码有个专业的术语,叫做闭包函数。

实际上  定义在函数内的 Fun2() 的执行是由 return Fun2() 来调动的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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