祢豆子oo 发表于 2021-9-15 20:25:02

py新手入门,有基础不会的地方请各位同学帮帮忙

在小甲鱼py零基础20讲的课后作业中,以下这题为什么返回 funIn后面可以不加括号呢?又为什么要用 funOut双括号来访问?
5. 请问如何访问 funIn() 呢?
def funOut():
    def funIn():
      print('宾果!你成功访问到我啦!')
    return funIn


区别于上一题,这里你就需要用 funOut()() 访问啦:
funOut()()
宾果!你成功访问到我啦!


当然你也可以“曲线救国”:
go = funOut()
go()
宾果!你成功访问到我啦!

傻眼貓咪 发表于 2021-9-15 20:25:03

本帖最后由 傻眼貓咪 于 2021-9-15 21:22 编辑

你的代碼其實可以寫成:(我將 funIn 拿出來,運行結果一樣,這樣你比較容易明白)
def funOut():
    return funIn

def funIn():
    print('宾果!你成功访问到我啦!')

funOut()() # 宾果!你成功访问到我啦!

go = funOut()
go() # 宾果!你成功访问到我啦!
函數帶有括號 () 表示 執行函數+返回值(如果有返回值,默認為 None),沒有括號 表示 返回內存地址

A 表示返回函數 A 內存地址
A() 表示執行函數+返回值(如果有返回值)
A()() 表示執行函數+返回值(如果有返回值)+返回值(如果有返回值) # 這邊你會發現重複 2 次返回值,那麼返回什麼值呢?請看以下示例:
def A():
    return B

def B():
    return 13

print(A)
print(A())
print(A()())
print("------------------------")
print(B)
print(B())<function A at 0x0000021053BEDF70>
<function B at 0x00000210540DBA60>
13
------------------------
<function B at 0x00000210540DBA60>
13以上打印 A,A() 和 A()() 都不同結果,但是你會發現答案了,打印 A 返回內存地址 A,A() 返回內存地址 B(這裡補充一下 B 的內存地址就是 A 的返回值),A()() 返回 B 值

結論:
A() 就是 B
A()() 就是 B()

至於為什麼會打印?只要有括號 () 就會執行函數 A()() 表示 B() 也就表示執行函數 B(打印)

wp231957 发表于 2021-9-15 21:21:38

因为返回时没有括号,所以再调用时需要把括号补上,第一个括号是从属于外函数,第二个括号才是内函数的调用

逃兵 发表于 2021-9-15 21:34:34

不加括号代表的是函数本身,在python中指向存储的地址
加括号代表的是函数的执行

比方说print是打印员这个身份
print()是打印员执行打印的动作

所以你返回值不加括号就是返回函数本身
返回值加括号就是返回函数的执行
funOut()是funIn本身
funOut()()是funIn()的执行

祢豆子oo 发表于 2021-9-15 22:45:15

傻眼貓咪 发表于 2021-9-15 20:25
本帖最后由 傻眼貓咪 于 2021-9-15 21:22 编辑
你的代碼其實可以寫成:(我將 funIn 拿出來,運行結果一 ...

感谢大佬的耐心讲解~笔芯{:10_288:}

祢豆子oo 发表于 2021-9-15 22:45:57

逃兵 发表于 2021-9-15 21:34
不加括号代表的是函数本身,在python中指向存储的地址
加括号代表的是函数的执行



我懂了,谢谢啦{:10_287:}

祢豆子oo 发表于 2021-9-15 22:46:26

wp231957 发表于 2021-9-15 21:21
因为返回时没有括号,所以再调用时需要把括号补上,第一个括号是从属于外函数,第二个括号才是内函数的调用

我懂了,谢谢啦{:10_287:}

江湖散人 发表于 2021-9-15 22:57:50

带括号是函数,也就是方法,那就需要运行内部的东西。
不带括号是内存地址,直接返回内存地址,没有可运行的东西
页: [1]
查看完整版本: py新手入门,有基础不会的地方请各位同学帮帮忙