函数的动态参数:对于传入的实参数量不固定,万能参数,动态参数,*args,**kwargs
*: 在函数定义的时候聚合,在*位置参数聚合
在函数调用的时候打散,在*位置参数打散
l1 = [1, 2, 3, 4] l2 = [a, b, c, 'alex'] def funcl(*args): print(args) funcl(*l1,*l2)
形参的位置参数:
位置参数,*args,默认参数,**kwargs顺序不能错乱,会报错
def funcl(a,b,*args,sex='男',**kwargs) print(a,b) print(sex) print(*args) print(**kwargs) funcl(10,20,34,55,6,77,87,45,sex='nv',name='alex',age=10)
python中名称空间分为三种:
全局名称空间:所定义的值会在内存里开辟出一个空间,这个空间是存放着值跟变量的id
count = 0 def funcl(): count += 1 print(count) funcl() #显示报错信息:UnboundLocalError: local variable 'count' referenced before assignment
因为count=0是在全局名称空间中的,而局部名称空间只能引用,不能修改,而count+=1则是把count的值修改了
局部名称空间:所定义的函数,虽然系统会开辟出一个空间,但仅仅是存放这个函数的整体的,至于函数内部,系统并不关心,只有在调用时才会临时开辟出一个空间,当函数结束时,所开辟的空间也会一并消失
def funcl(): count = 3 print(count) funcl()
此时count输出的是3,而如果print放在函数外面,将会报错,并提示count没有被定义
def funcl(): count = 3 funcl() print(count)
内置名称空间:对于内置函数来说,len,print....本身的出现就会在系统里开辟了空间
作用域:就是作用范围,按照生效范围,可以分为全局作用域和局部作用域
全局作用域分为:全局名称空间,内置名称空间,整个文件的任意位置都可以被引用,全局有效
局部作用域:局部作用空间,只能在局部范围内引用
取值顺序:局部名称空间 ------->全局名称空间----->内置名称空间 单向从小到大范围
加载顺序:内置名称空间---->全局名称空间(当程序执行时)------>内置名称空间(当函数被调用时)
global:
1,在局部名称空间中声明一个全局变量
def func1(): global name name = 'alex' func1() print(name)
2.在局部名称空间可以对全局变量进行修改
count = 0 def funcl(): global count count += 1 funcl() print(count)
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()