函数对象与闭包函数
目录
- 一:名称空间的作用域
- 二:global与nonlocal关键字使用
- 三:函数对象(函数名)
- 四:函数的嵌套调用
- 五:函数的嵌套定义
- 六:闭包函数
一:名称空间的作用域
作用域
名称空间所能够作用的范围
内置名称空间
程序任何阶段任何位置均可使用(全局有效)
全局名称空间
程序任何阶段任何位置均可使用(全局有效)
局部名称空间
一般情况下只在各自的局部名称空间中有效
二:global与nonlocal关键字使用
x = 111
def index():
局部修改全局变量 需要使用关键字声明
global x
x = 222
index()
print()
name_list = ['jason', 'kevin']
def index():
name_list.append('heiheihei')
index()
print(name_list)
如果想在修改全局数据
如果数据为不可变类型则需要关键字global声明
如果数据为可变类型则无需关键字global声明
可变类型:
def index():
x = 111
l1 = [11,22]
def func():
内部局部修改外部局部
l1.append(333)
func()
print(l1)
index()
不可变类型:
def index():
x = 111
def func():
nonlocal x
x = 222
func()
print(x)
index()
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明
二:global与nonlocal关键字使用
x = 111
def index():
局部修改全局变量 需要使用关键字声明
global x
x = 222
index()
print()
name_list = ['jason', 'kevin']
def index():
name_list.append('heiheihei')
index()
print(name_list)
如果想在修改全局数据
如果数据为不可变类型则需要关键字global声明
如果数据为可变类型则无需关键字global声明
可变类型:
def index():
x = 111
l1 = [11,22]
def func():
内部局部修改外部局部
l1.append(333)
func()
print(l1)
index()
不可变类型:
def index():
x = 111
def func():
nonlocal x
x = 222
func()
print(x)
index()
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明
三:函数对象(函数名)
函数名遇到括号就会调用
用法1:函数名可以当作变量名赋值
def index()
print('form index')
a = index
a() # 本质就是在调用index函数
用法2:函数名还可以当做函数的实参
def index():
print('from index')
def func(a):
print(a)
a()
print('from func')
func(index)
用法3:函数名还可以当做函数返回值
def index():
print('from index')
def func():
print('from func')
return index
res = func() # 调用func并接受func的返回值
res()
用法4:函数名可以当做容器类型(内部可以存放多个数据)的元素
def index():
print('from index')
l = [111, 222, 333, index()]
print(l)
def register():
print('注册功能')
def login():
print('登录功能')
def shopping():
print('购物功能')
def transfer():
print('转账功能')
def withdraw():
print('提现功能')
def check_order():
print('查看订单')
func_dic = {
'1':['注册功能', register],
'2':['登录功能', login],
'3':['购物功能', shopping],
'4':['转账功能', transfer],
'5':['提现功能', withdraw],
'6':['查看订单', check_order],
}
# 循环
while True:
print('欢迎进入ATM购物车')
# 退出选项
print('0 退出功能')
# 循环将字典给i 字典暴露外界的值只有k
for i in func_dic:
# 打印输出 字典暴露外界只要k,i取k值,字典里面通过k 索引列表内的值0
print(i, func_dic[i][0])
# 获取用户输入选项
choicn = input('请输入您的功能选项:')
# 判断用户选项是否为退出
if choicn == '0':
print('已退出系统')
break
# # 判断用户输入的 在字典里进入
if choicn in func_dic:
# 用户输入的对应着字典内的k值 索引取1,小括号代表调用函数
func_dic[choicn][1]()
else:
print('抱歉暂无该功能')
四:函数的嵌套调用
嵌套调用:函数内部调用其他函数
def index():
print('from inde')
def func(
index()
print('from func')
func()
嵌套函数比大小
def my_max(a, b):
if a > b:
return:
return b
def many_max(x,y,z,m):
res = my_max(x,y)
res1 = my_max(re1,z)
res2 = my_max(res2,m)
teturn res2
ret = many_max(1,2,3,4)
print(ret)
五:函数的嵌套定义
函数体内部定义其他函数
将复杂的功能全部隐藏起来 暴露一个简单的接口
def all_func(type):
def register():
print('注册功能')
def login():
print('登录功能')
def transfer():
print('转账功能')
def shopping():
print('购物功能')
# 这里仅仅是延时嵌套定义的现象 暂不考虑优化
if type == '1':
register()
elif type == '2':
login()
elif type == '3':
transfer()
elif type == '4':
shopping()
else:
print('不知道啥功能')
all_func('3')
六:闭包函数
闭包函数
闭: 定义在函数内部的函数 函数的嵌套定义
包: 内部函数使用了外部函数名称空间中的名字
只有符合上述两个特征的函数才可以称之为'闭包函数'
def outer():
x = 222
def index():
闭包函数的作用:现在的index,以后在调用的时候,里面所用到的数据永远不会受外 界所干扰,永远用的是222
不受外界干扰,永远用的固定的,
print('from index', x)
return index
res = outer()
x = 444
res()
闭包函数其实是给函数传参的第二种方式
方式1:函数体代码需要用到数据 直接在括号内定义形参即可
def index(username):
print(username)
def my_max(a, b):
if a > b:
return a
return b
方式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())