qiuyouzhi 发表于 2020-3-3 19:14:22

Python FAQ 005 闭包(2)

本帖最后由 qiuyouzhi 于 2020-3-4 12:04 编辑

Python FAQ 005

问题:

闭包没听太懂,课后习题中有两题:
1、
def funOut():
   def funIn():
         print("……")
   return funIn()

2、
def funOut():
   def funIn():
         print("……")
   return funIn

这两题最后一行,这个返回的,有括号和没括号有什么区别?

(原文: https://fishc.com.cn/forum.php?mod=viewthread&tid=151273&highlight=Python%B1%D5%B0%FC)

解答:

有括号是返回这个函数,没有括号是返回这个函数对象
如果返回的是函数,那么调用外部的函数就必定会调用内部的函数
举个代码例子:
def funX(x):
    print(x)
    def funY(y):
      x *= y
      return x
    return funY(5)

print(funX(5))
运行这段代码后,一定会打印出25
但是,如果稍微改一改:
def funX(x):
    print(x)
    def funY(y):
      nonlocal x
      x *= y
      return x
    return funY

a = funX(5)
print(a(50))
print(a(25))
这时我们发现,funY 的参数可以在外部变动了!
而这就是 funY 的好处
当然,如果在一些特殊的情况,还是第一种写法比较好~~~
本人才疏学浅,如果有纰漏,请在评论区指出!

一个账号 发表于 2020-3-4 11:38:06

建议把 by xxx 去掉

qiuyouzhi 发表于 2020-3-4 12:07:50

一个账号 发表于 2020-3-4 11:38
建议把 by xxx 去掉

已去

wp231957 发表于 2020-3-4 12:59:51

这里没有解答提问也是比较多的一个问题
明明是一个变量,为什么要加括号呢
尤其有人再简写时,更会出现函数后面再套一个括号,更是难倒一大批

aaawrl 发表于 2020-4-10 04:36:35

def funX(x):
    print(x)
    def funY(y):
      x *= y
      return x
    return funY(5)

print(funX(5))

不懂为什么输出25呀 {:10_266:}

aaawrl 发表于 2020-4-10 04:37:23

def funX(x):
    print(x)
    def funY(y):
      x *= y
      return x
    return funY(5)

print(funX(5))

不懂为什么输出25呀

qiuyouzhi 发表于 2020-4-10 07:37:16

aaawrl 发表于 2020-4-10 04:36
def funX(x):
    print(x)
    def funY(y):


按着函数调用过程来:
funx里面是一个funY,
funY的定义的funX的参数
乘上funY的参数,然后返回
结果。(这是定义,没有调用!)
然后返回funY(5),这时候调用funY,
把funX的参数和funY的参数相乘,
然后返回结果。

aaawrl 发表于 2020-4-15 17:55:43

qiuyouzhi 发表于 2020-4-10 07:37
按着函数调用过程来:
funx里面是一个funY,
funY的定义的funX的参数


感谢!
页: [1]
查看完整版本: Python FAQ 005 闭包(2)