wymanl 发表于 2020-5-18 16:54:15

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


想问问,这一讲中,为什么闭包一个例子 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(),要带上()???

qiuyouzhi 发表于 2020-5-18 16:56:12

带括号的代表返回这个函数的返回值(一定返回),不带括号的返回这个函数对象(可以选择是否调用)

永恒的蓝色梦想 发表于 2020-5-18 16:56:36

return FunY 是返回一个函数对象,而不是返回函数返回值

pyrhon萌新# 发表于 2020-5-18 17:10:04

函数中小括号很重要,无论何时都会带上(就算没有参数)

Twilight6 发表于 2020-5-18 17:14:16

1、不带括号时,调用的是这个函数本身,是整个函数体,是一个函数对象,不需等该函数执行完成
2、带括号(此时必须传入需要的参数),调用的是函数的return结果,需要等待函数执行完成的结果

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

如果对你有帮助,记得给个最佳答案~{:10_287:}

永恒的蓝色梦想 发表于 2020-5-18 17:25:05

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

返回函数加括号干什么?

pyrhon萌新# 发表于 2020-5-18 17:26:17

永恒的蓝色梦想 发表于 2020-5-18 17:25
返回函数加括号干什么?

没考虑到诶

wymanl 发表于 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>就返回对象,不是值了。两个例子究竟差别在哪?

qiuyouzhi 发表于 2020-5-18 17:57:59

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


第一个带了括号呀
带了括号就是调用函数了

wymanl 发表于 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>就返回对象,不是值了。两个例子究竟差别在哪?

wymanl 发表于 2020-5-18 18:00:54

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

我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象

wp231957 发表于 2020-5-18 18:05:13

wymanl 发表于 2020-5-18 18:00
我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象

带括号就是返回函数值
不带括号返回地址(指针,对象指针)
python游戏规则就是如此,没有为什么

永恒的蓝色梦想 发表于 2020-5-18 18:06:52

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


没加括号,没有调用

Twilight6 发表于 2020-5-18 18:32:27

wymanl 发表于 2020-5-18 18:00
我主要是搞不明白内嵌函数,为啥里面内嵌的函数返回,不带(),但返回的是值而不是对象

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

wymanl 发表于 2020-5-18 20:02:46

Twilight6 发表于 2020-5-18 18:32
因为这个是闭包的部分概念吧

这样解释能懂吗?

感谢回答,不明白,我再重温一下教程

Twilight6 发表于 2020-5-18 20:04:29

wymanl 发表于 2020-5-18 20:02
感谢回答,不明白,我再重温一下教程

嗯,知乎和简书上也可以去查查,那边大佬非常多

niruipeng 发表于 2020-5-18 22:02:27

{:10_266:}
页: [1]
查看完整版本: 想问问,21讲,内嵌和闭包这一讲,内嵌函数返回带不带()问题