求大神解答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: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:53 编辑
1 本帖最后由 我为学习而疯狂 于 2022-10-22 13:04 编辑
明白了 本帖最后由 jackz007 于 2022-10-22 13:10 编辑
我为学习而疯狂 发表于 2022-10-22 12:53
明白了
前者返回对 function() 函数的调用结果,例如,如果 function() 返回的是 100,那么,return function() 返回的就是 100;后者返回的是一个函数的调用地址,不会对这个函数发生调用,就像执行 a = input 并不会的调用 input() 函数,而如果执行了 a = input() 那就会执行函数了。 jackz007 发表于 2022-10-22 13:08
前者返回对 function() 函数的调用结果,例如,如果 function() 返回的是 100,那么,return f ...
我懂了!!!!!!!感谢大哥{:10_298:} 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]