smandjd 发表于 2023-1-3 23:40:35

return的奇奇怪怪

def Fun1():
                x = 5
                def Fun2():
                        nonlocal x
                        x *= x
                        return x
                return Fun2()
这个感觉很奇怪,return x是对函数Fun2(),可是Fun2()又无法调用,第二个return Fun2()是对Fun1()有一个返回值,怎么返回的是一个函数,不理解,求大神解释一下

wp231957 发表于 2023-1-4 07:43:54

---------可是Fun2()又无法调用
这里fun2本身确实没有自我调用
但是最后一句代码却对它进行了调用

KeyError 发表于 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这个函数

                               

wp231957 发表于 2023-1-4 10:48:12

请楼主测试一下 以下代码加深一下对函数地址的理解:
def wp():
    return print

wp()("你说奇怪不,咋还能这样玩???")   

linke.zhanghu 发表于 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的地方就已经被调用了。

z5560636 发表于 2023-1-5 09:46:21

你把代码的执行顺序搞明白就没毛病了。
这个代码有个专业的术语,叫做闭包函数。

实际上定义在函数内的 Fun2() 的执行是由 return Fun2() 来调动的。
页: [1]
查看完整版本: return的奇奇怪怪