鱼C论坛

 找回密码
 立即注册
查看: 1326|回复: 7

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

[复制链接]
发表于 2021-9-15 20:25:02 | 显示全部楼层 |阅读模式
30鱼币
在小甲鱼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 拿出來,運行結果一樣,這樣你比較容易明白)
  1. def funOut():
  2.     return funIn

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

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

  6. go = funOut()
  7. go() # 宾果!你成功访问到我啦!
复制代码

函數帶有括號 () 表示 執行函數+返回值(如果有返回值,默認為 None),沒有括號 表示 返回內存地址

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

  3. def B():
  4.     return 13

  5. print(A)
  6. print(A())
  7. print(A()())
  8. print("------------------------")
  9. print(B)
  10. print(B())
复制代码
  1. <function A at 0x0000021053BEDF70>
  2. <function B at 0x00000210540DBA60>
  3. 13
  4. ------------------------
  5. <function B at 0x00000210540DBA60>
  6. 13
复制代码
以上打印 A,A() 和 A()() 都不同結果,但是你會發現答案了,打印 A 返回內存地址 A,A() 返回內存地址 B(這裡補充一下 B 的內存地址就是 A 的返回值),A()() 返回 B 值

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

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

最佳答案

查看完整内容

本帖最后由 傻眼貓咪 于 2021-9-15 21:22 编辑 你的代碼其實可以寫成:(我將 funIn 拿出來,運行結果一樣,這樣你比較容易明白) 函數帶有括號 () 表示 執行函數+返回值(如果有返回值,默認為 None),沒有括號 表示 返回內存地址 A 表示返回函數 A 內存地址 A() 表示執行函數+返回值(如果有返回值) A()() 表示執行函數+返回值(如果有返回值)+返回值(如果有返回值) # 這邊你會發現重複 2 次返回值,那麼返回什麼 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-15 20:25:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2021-9-15 21:22 编辑
你的代碼其實可以寫成:(我將 funIn 拿出來,運行結果一樣,這樣你比較容易明白)
  1. def funOut():
  2.     return funIn

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

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

  6. go = funOut()
  7. go() # 宾果!你成功访问到我啦!
复制代码

函數帶有括號 () 表示 執行函數+返回值(如果有返回值,默認為 None),沒有括號 表示 返回內存地址

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

  3. def B():
  4.     return 13

  5. print(A)
  6. print(A())
  7. print(A()())
  8. print("------------------------")
  9. print(B)
  10. print(B())
复制代码
  1. <function A at 0x0000021053BEDF70>
  2. <function B at 0x00000210540DBA60>
  3. 13
  4. ------------------------
  5. <function B at 0x00000210540DBA60>
  6. 13
复制代码
以上打印 A,A() 和 A()() 都不同結果,但是你會發現答案了,打印 A 返回內存地址 A,A() 返回內存地址 B(這裡補充一下 B 的內存地址就是 A 的返回值),A()() 返回 B 值

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

至於為什麼會打印?只要有括號 () 就會執行函數 A()() 表示 B() 也就表示執行函數 B(打印)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-15 21:21:38 From FishC Mobile | 显示全部楼层
因为返回时没有括号,所以再调用时需要把括号补上,第一个括号是从属于外函数,第二个括号才是内函数的调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-15 21:34:34 | 显示全部楼层
不加括号代表的是函数本身,在python中指向存储的地址
加括号代表的是函数的执行

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

所以你返回值不加括号就是返回函数本身
返回值加括号就是返回函数的执行
funOut()是funIn本身
funOut()()是funIn()的执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

感谢大佬的耐心讲解~笔芯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-15 22:45:57 | 显示全部楼层
逃兵 发表于 2021-9-15 21:34
不加括号代表的是函数本身,在python中指向存储的地址
加括号代表的是函数的执行

我懂了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-15 22:46:26 | 显示全部楼层
wp231957 发表于 2021-9-15 21:21
因为返回时没有括号,所以再调用时需要把括号补上,第一个括号是从属于外函数,第二个括号才是内函数的调用

我懂了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-15 22:57:50 | 显示全部楼层
带括号是函数,也就是方法,那就需要运行内部的东西。
不带括号是内存地址,直接返回内存地址,没有可运行的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 07:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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