鱼C论坛

 找回密码
 立即注册
查看: 1142|回复: 16

[已解决]想问问,21讲,内嵌和闭包这一讲,内嵌函数返回带不带()问题

[复制链接]
发表于 2020-5-18 16:54:15 | 显示全部楼层 |阅读模式

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

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

x

想问问,这一讲中,为什么闭包一个例子 def FunX(x):
        def FunY(y):
                return x*y
        return FunY
内嵌函数 return funY,这里FunY不带()??

而另外例子:
def Fun1():
        x = 5
        def Fun2():
                nonlocal x
                x *= x
                return x
        return Fun2()
内嵌函数Fun2(),要带上()???
最佳答案
2020-5-18 18:32:27
wymanl 发表于 2020-5-18 18:00
我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象

因为这个是闭包的部分概念吧
1,需要传递函数本身这个对象时,不要加括号。
而在执行这个函数的时候,需要加括号。
2,函数在 python 中是对象,可以直接像变量一样赋值的,加上括号为 函数调用表达式,注意 python 中的官方说法,不是加不加括号的问题,而是函数执行的语法就是这样。

这样解释能懂吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-18 16:56:12 | 显示全部楼层
带括号的代表返回这个函数的返回值(一定返回),不带括号的返回这个函数对象(可以选择是否调用)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 16:56:36 | 显示全部楼层
return FunY 是返回一个函数对象,而不是返回函数返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 17:10:04 | 显示全部楼层
函数中小括号很重要,无论何时都会带上(就算没有参数)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 17:14:16 | 显示全部楼层
1、不带括号时,调用的是这个函数本身,是整个函数体,是一个函数对象,不需等该函数执行完成
2、带括号(此时必须传入需要的参数),调用的是函数的return结果,需要等待函数执行完成的结果

要注意的是:如果函数本身带有参数的时候,带括号就就必须带参数,同理函数本身不带参数,带括号就不能带参数


如果对你有帮助,记得给个最佳答案~

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

使用道具 举报

发表于 2020-5-18 17:25:05 | 显示全部楼层
pyrhon萌新# 发表于 2020-5-18 17:10
函数中小括号很重要,无论何时都会带上(就算没有参数)

返回函数加括号干什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 17:26:17 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-18 17:25
返回函数加括号干什么?

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

使用道具 举报

 楼主| 发表于 2020-5-18 17:57:18 | 显示全部楼层
qiuyouzhi 发表于 2020-5-18 16:56
带括号的代表返回这个函数的返回值(一定返回),不带括号的返回这个函数对象(可以选择是否调用)

那为啥第一个例子返回的不是对象,而是值。把函数改了
def FunX(x):
        def FunY():
                return x*x
        return FunY

>>> FunX(2)
<function FunX.<locals>.FunY at 0x02046C00>就返回对象,不是值了。两个例子究竟差别在哪?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 17:57:59 | 显示全部楼层
wymanl 发表于 2020-5-18 17:57
那为啥第一个例子返回的不是对象,而是值。把函数改了
def FunX(x):
        def FunY():

第一个带了括号呀
带了括号就是调用函数了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-18 17:58:02 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-18 16:56
return FunY 是返回一个函数对象,而不是返回函数返回值

那为啥第一个例子返回的不是对象,而是值。把函数改了
def FunX(x):
        def FunY():
                return x*x
        return FunY

>>> FunX(2)
<function FunX.<locals>.FunY at 0x02046C00>就返回对象,不是值了。两个例子究竟差别在哪?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-18 18:00:54 | 显示全部楼层
Twilight6 发表于 2020-5-18 17:14
1、不带括号时,调用的是这个函数本身,是整个函数体,是一个函数对象,不需等该函数执行完成
2、带括号( ...

我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 18:05:13 From FishC Mobile | 显示全部楼层
wymanl 发表于 2020-5-18 18:00
我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象

带括号就是返回函数值
不带括号返回地址(指针,对象指针)
python游戏规则就是如此,没有为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 18:06:52 | 显示全部楼层
wymanl 发表于 2020-5-18 17:58
那为啥第一个例子返回的不是对象,而是值。把函数改了
def FunX(x):
        def FunY():

没加括号,没有调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 18:32:27 | 显示全部楼层    本楼为最佳答案   
wymanl 发表于 2020-5-18 18:00
我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象

因为这个是闭包的部分概念吧
1,需要传递函数本身这个对象时,不要加括号。
而在执行这个函数的时候,需要加括号。
2,函数在 python 中是对象,可以直接像变量一样赋值的,加上括号为 函数调用表达式,注意 python 中的官方说法,不是加不加括号的问题,而是函数执行的语法就是这样。

这样解释能懂吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-18 20:02:46 | 显示全部楼层
Twilight6 发表于 2020-5-18 18:32
因为这个是闭包的部分概念吧

这样解释能懂吗?

感谢回答,不明白,我再重温一下教程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 20:04:29 | 显示全部楼层
wymanl 发表于 2020-5-18 20:02
感谢回答,不明白,我再重温一下教程

嗯,知乎和简书上也可以去查查,那边大佬非常多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 22:02:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 07:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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