Python函数进阶(二)
一.名称空间的作用域
1.1 作用域:名称空间所能作用的范围
1.2 内置名称空间
程序任何阶段任何位置均可使用(全局有效)
1.3 全局名称空间
1程序任何阶段任何位置均可使用(全局有效)
1.4 局部名称空间
一般情况下之下各自的局部空间中有效
二.global与nonlocal关键字使用
x = 111 def index(): global x # 局部修改全局变量 需要用关键字声明 x = 222 index() print(x) list=['jason',18,'yiban','age'] def index(): list.append('hahaha') print(list) index() '''如果想在局部修改全局数据''' '''如果数据为不可变类型则需要修改关键字global声明''' '''如果数据为可变类型数据则无需关键字global声明''' def index(): l1=[11,12,13] def func(): l1.append('jason') func() print(l1) index() '''如果想要在内部的局部修改外局部的不可变类型数据,需要加关键字nonlocal声明'''
二.函数对象
切记函数遇到括号就会调用!
1 '''用法一:函数名可以当做变量名赋值''' 2 def index(): 3 print('from index') 4 a=index # a=这个函数的内存地址 5 a() # 运行a这个函数,调用的是index这个函数 6 7 '''用法二:函数名还可以做函数的实参''' 8 def index(): 9 print('from index') 10 def func(a): 11 print(a) 12 a() 13 print('from func') 14 func(index) 15 16 '''用法三:函数名还可以当做函数的返回值''' 17 def index(): 18 print('from index') 19 def func(): 20 print('from func') 21 return index 22 res=func() 23 res() 24 25 '''函数名可以当做容器类型(内部可以存放多个数据)的元素''' 26 def index(): 27 print('from index') 28 l=[11,222,333,index()] 29 print(l)
三.函数的嵌套使用
1 # 嵌套调用:函数内部调用其他函数 2 # def index(): 3 # print('from index') 4 # def func(): 5 # index() 6 # print('from func') 7 # func() 8 9 def my_max(a, b): 10 if a > b: 11 return a 12 return b 13 14 def many_max(x,y,z,m): 15 res = my_max(x,y) 16 res1 = my_max(res,z) 17 res2 = my_max(res1,m) 18 return res2 19 ret = many_max(1,2,3,4) 20 print(ret)
四.函数的嵌套定义
函数体内部定义其他函数,将复杂的功能全部隐藏起来只暴露一个简单的接口
1 def all_func(type): 2 def register(): 3 print('注册功能') 4 def login(): 5 print('登录功能') 6 def transfer(): 7 print('转账功能') 8 def shopping(): 9 print('购物功能') 10 if type == '1': 11 register() 12 elif type == '2': 13 login() 14 elif type == '3': 15 transfer() 16 elif type == '4': 17 shopping() 18 else: 19 print('没有此功能') 20 21 all_func('3')
五.闭包函数
5.1 定义
闭:在函数内部的函数
包:内部函数使用了外部函数名称与空间中的名字
同时含有上述两个特征的函数才可以称为"闭包函数"
1 def outer(): 2 x = 222 3 def index(): 4 print('from index', x) 5 return index
5.2 闭包函数给参数传参
方式一:函数体代码需要用到数据 直接在括号内定义
1 def index(username): 2 print(username) 3 def my_max(a, b): 4 if a > b: 5 return a 6 return b
方式二:利用闭包函数
1 def outer(x,y): 2 # x = 2 3 # y = 40 4 def my_max(): 5 if x > y: 6 return x 7 return y 8 return my_max 9 res = outer(2,40) 10 print(res()) 11 print(res())
六.装饰器
6.1 装饰器的原则
开放封闭原则,开放:对外扩展开放,封闭:对修改封闭。
6.2 装饰器核心思想
在不改变装饰对象内部代码和原有调用方式的基础上添加额外的功能
1 def index(): 2 print('from index') 3 index()