我为学习而疯狂 发表于 2022-10-22 12:15:30

求大神解答return 函数名 后面加不加()的问题

def function():
    def funtion1():
      print("11111111")
      return 12
    return funtion1()   

function()

def function2():
    def funtion3():
      print("11111111222")
      return 12
    return funtion3   

function2()

为什么第一个能打印,第二个不行

jackz007 发表于 2022-10-22 12:36:41

本帖最后由 jackz007 于 2022-10-22 12:47 编辑

       这叫闭包,函数返回的是不带括号的内嵌函数名,其实是这个内嵌函数的调用地址,需要这样调用:
x = function()       # x 获得 function() 内嵌函数 function1() 的调用地址
print(x())         # 打印对 function() 的内嵌函数 function1() 的调用结果
x = function2()      # x 获得 function2() 内嵌函数 function3() 的调用地址
x()                  # 调用 function2() 的内嵌函数 function3()
       本来 function3()只能在 function2() 内可见,通过这种方式,可以在 function2() 以外也可以调用这个本来无法调用的内嵌函数 function3()。

       通过一个变量来调用函数,是不是不可思议,在 IDLE 里试试这个:
a = print
b = input
x = b('请输入您的姓名:')
a('hello' , x)
       也许就可以理解了?

我为学习而疯狂 发表于 2022-10-22 12:50:33

本帖最后由 我为学习而疯狂 于 2022-10-22 12:53 编辑

1

我为学习而疯狂 发表于 2022-10-22 12:53:03

本帖最后由 我为学习而疯狂 于 2022-10-22 13:04 编辑

明白了

jackz007 发表于 2022-10-22 13:08:03

本帖最后由 jackz007 于 2022-10-22 13:10 编辑

我为学习而疯狂 发表于 2022-10-22 12:53
明白了

      前者返回对 function() 函数的调用结果,例如,如果 function() 返回的是 100,那么,return function() 返回的就是 100;后者返回的是一个函数的调用地址,不会对这个函数发生调用,就像执行 a = input 并不会的调用 input() 函数,而如果执行了 a = input() 那就会执行函数了。

我为学习而疯狂 发表于 2022-10-22 13:10:11

jackz007 发表于 2022-10-22 13:08
前者返回对 function() 函数的调用结果,例如,如果 function() 返回的是 100,那么,return f ...

我懂了!!!!!!!感谢大哥{:10_298:}

潺陵大地 发表于 2022-11-27 01:43:49

jackz007 发表于 2022-10-22 12:36
这叫闭包,函数返回的是不带括号的内嵌函数名,其实是这个内嵌函数的调用地址,需要这样调用:


...

def fun1(x) :
        def fun2(y) :
                nonlocal x
                x = x * y
                return x
        return fun2    #在闭包中内部函数如果有参数,return 内部函数就不用加括号,

fun1(5)(4)   #运行结果为 20


def fun1(x) :
        def fun2() :
                return x
        return fun2()      #如果内部函数没得参数, return 内部函数就要加括号。

fun1(5)   # 运行结果为   :5

我个人觉得以上括号是不是可以这样理解 ,在闭包中内部函数如果有参数,return 内部函数就不用加括号,#有参数不加括号,返回就是内部函数的内容
                                                             如果内部函数没得参数, return 内部函数就要加括号。            #没有参数加括号,返回就是内部函数的运行结果

不知道我说得对不对,请批评指正,谢谢。
页: [1]
查看完整版本: 求大神解答return 函数名 后面加不加()的问题