函数对象与闭包函数
一. 函数对象(函数名)
ps :函数名遇到括号就会调用!!!
函数名有4种用法
-
函数名可以当做变量名赋值
def index(): print('from index') a = index a() # 本质就是在调用index函数
-
函数名还可以当做函数的实参
def index(): print('from index') def func(a): print(a) a() print('from func') func(index)
-
函数名还可以当做函数返回值
def index(): print('from index') def func(): print('from func') return index res = func() # 调用func并接受func的返回值 res() # 就是index()
-
函数名可以当做容器类型(内部可以存放多个数据)的元素
def index(): print('from index') l = [111, 222, 333, index()] print(l)
二. 函数的嵌套调用
# 嵌套调用:函数内部调用其他函数
def my_max(a, b):
if a > b:
return a
return b
def many_max(x,y,z,m):
res = my_max(x,y)
res1 = my_max(res,z)
res2 = my_max(res1,m)
return res2
ret = many_max(1,2,3,4)
print(ret) # 4
函数的嵌套定义
将复杂的功能全部隐藏起来 暴露一个简单的接口
三. 闭包函数
1. 定义
闭:定义在函数内部的函数
包:内部函数使用了外部函数名称空间中的名字
只有符合上述两个特征的函数才可以称之为"闭包函数"
闭包函数其实是给函数传参的第二种方式
x=1
def outer():
x=2
def inner():
print(x)
return inner
func=outer()
func() # 结果为2
“闭”代表函数是内部的,“包”代表函数外’包裹’着对外层作用域的引用。因而无论在何处调用闭包函数,使用的仍然是包裹在其外层的变量。
2.闭包的用途
def outer(x,y):
# x = 2
# y = 40
def my_max():
if x > y:
return x
return y
return my_max
res = outer(2,40)
print(res())
print(res())
# 这样以后就不需要再赋值,要替换的话只需要把x,y重新赋值然后用新的变量接收就可以一直使用了.