内容大纲:
一、函数的动态参数和函数的形参顺序
二、名称空间、作用域、取值顺序、加载顺序
三、函数的嵌套
四、global、nonlocal
一、函数的动态参数和函数的形参顺序
1、函数的动态参数:当函数的形参数量不一定时,可以使用动态参数。用*args和**kwargs接收,args是元组类型,接收除键值对以外的参数(接收位置参数),kwargs是字典类型,接收键值对(关键字参数)
def func(*args,**kwargs): print(args,type(args)) print(kwargs,type(kwargs)) func(1,2,3,4,'alex',name = 'alex') 输出结果是: (1, 2, 3, 4, 'alex') <class 'tuple'> {'name': 'alex'} <class 'dict'>
在函数定义时,在位置参数前加“ * ”代表聚合,将所有实参的位置参数聚合到一个元组中,并将这个元组赋值给args。在关键参数前加“ ** ”代表将实参的关键字参数聚合到一个字典中,并将这个字典赋值给kwargs。
2、“ * "的魔性作用
1、在函数定义时:*位置参数和**关键字参数代表聚合
2、在函数调用时:*位置参数和**位置参数代表聚合
def func(*args,**kwargs): print(args) print(kwargs) func(*[1,2,3],*[4,5,6],**{'name':'alex'},**{'age':18})#相当于func([1,2,3,4,5,6],{'name':'alex','age':18})
3、形参的顺序:
位置参数 ----> *args ----->关键字参数 ------->**kwargs
二、命名空间、作用域、取值顺序、加载顺序
1、命名空间:存放”名字与值关系的空间“
①全局命名空间:代码在运行时,创建的存储”变量名与值的关系“的内存空间
②局部命名空间:在函数调用时临时开辟出来的空间,会随着函数的执行完毕,这块内存中的所有内容被清空
③内置命名空间:存放了python解释器提供的名字,input、print、list、tuple等
2、作用域:就是作用范围
①全局作用域:全局命名空间、内置命名空间
②局部作用域:局部命名空间
3、取值顺序:就近原则
①在全局作用域时:全局命名空间 ----> 内置命名空间
②在局部作用域时:局部命名空间 -----> 全局命名空间 -----> 内置命名空间
4、加载顺序:内置命名空间(程序运行前加载)-----> 全局命名空间(程序运行中从上至下加载) -----> 局部命名空间(函数调用时加载)
三、函数的嵌套
def func1(): print(111) def func2(): print(222) func1() print(333) print(666) func2() print(555) 执行结果是: 666 222 111 333 555
四、global和nonlocal
局部名称空间对全局名称空间的变量可以引用,但不能修改。如果要修改,要将该变量定义为global。
count = 1 def fun1(): count = 2 # 局部命名空间的count,需要对count进行定义 print(count) print(count) # 全局命名空间的count fun1() 执行结果:1 2
count = 1 def fun1(): count += 1 # 会报错 print(count) fun1() #会报错:UnboundLocalError: local variable 'count' referenced before assignment
1、global:
①在局部命名空间声明全局变量
②在局部命名空间对全局变量进行修改
#1,在局部名称空间声明一个全局变量。 def func2(): global name name = 'alex' func2() print(name) 执行结果:alex # 2,在局部名称空间可以对全局变量进行修改。 count = 1 def func1(): global count count = count + 1 print(count) func1() print(count) 执行结果:2 2
2、nonlocal:
①子函数对父函数的变量进行修改,此变量不能是全局变量
②在局部作用域中,对父级作用域(或更外层的作用域,不能是全局作用域)的变量进行引用和修改,且引用的那一层之下的变量全部改变
def func1(): count = 666 def inner(): print(count) def func2(): nonlocal count count += 1 print('func2',count) func2() print('inner',count) inner() print('func1',count) func1() 执行结果是: 666 func2 667 inner 667 func1 667