鱼C论坛

 找回密码
 立即注册
查看: 3645|回复: 6

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

[复制链接]
发表于 2022-10-22 12:15:30 | 显示全部楼层 |阅读模式

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

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

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

function()

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

function2()

为什么第一个能打印,第二个不行
最佳答案
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)
       也许就可以理解了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
       也许就可以理解了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-22 12:50:33 | 显示全部楼层
本帖最后由 我为学习而疯狂 于 2022-10-22 12:53 编辑

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

使用道具 举报

 楼主| 发表于 2022-10-22 12:53:03 | 显示全部楼层
本帖最后由 我为学习而疯狂 于 2022-10-22 13:04 编辑

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

使用道具 举报

发表于 2022-10-22 13:08:03 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-22 13:10 编辑


        前者返回对 function() 函数的调用结果,例如,如果 function() 返回的是 100,那么,return function() 返回的就是 100;后者返回的是一个函数的调用地址,不会对这个函数发生调用,就像执行 a = input 并不会的调用 input() 函数,而如果执行了 a = input() 那就会执行函数了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

我懂了!!!!!!!感谢大哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 内部函数就要加括号。              #没有参数加括号,返回就是内部函数的运行结果

不知道我说得对不对,请批评指正,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 20:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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