动态参数:
位置参数: *表示接收位置参数的动态传参,接收到的是元组
顺序: 位置参数-->*args(动态参数)-->默认值参数

关键字的动态传参: **表示接收关键字的动态传参,接收到的是字典
顺序: 位置参数-->*args-->默认值参数-->**kwargs
def func(*args,**kwargs) 无敌传参

以上参数可以随意搭配使用,但是必须按照顺序写


函数的参数整理:
实参:
位置参数
关键字参数
混合参数
形参:
位置参数
默认值参数
动态传参:
*args: 位置参数动态传参
**kwargs: 关键字参数的动态传参

顺序: 位置参数-->*args-->默认值参数-->**kwargs

文档注释:
def func(a,b)
"""
中间是对函数的注释
"""

print(func.__doc__) #查看文档注释(函数的注释)


接收所有参数:
(1):
def func(*args,**kwarge):
形参位置的*args是聚合的作用
print(args,kwargs)

func(1,2,3,4,5,a=6,b=7,c=9)
(2):
def func(*food):
print(food)
lst = ['1','2','3','4']
func(*lst) 此处的*是打散的意思,list,tuple,set,str

如果想打散字典的话:
在实参位置使用**,得到的是关键字参数


命名空间:
全局名称空间: 函数外面的变量,全局不会被清,顶格写的
局部名称空间: 函数里面的变量,每次调用完成会清一下
内置命名空间: 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内 置命名空间
大小关系:
内置名称空间-->全局名称空间-->局部名称空间(不一定会产生,在函数调用的时候才会产生)


作用域:
全局作用域: 全局命名空间 + 内置命名空间
局部作用域: 局部名称空间

可以通过 globals() 函数来查看全局作⽤域中的内容,
也可以通过 locals() 来查看局部作 ⽤域中的变量和函数信息





关键字global和nonlocal:
global 表示在局部作用域中,调用全局中的变量
如果全局中没有变量的话,在局部中global,会在全局中创建一个变量
nonlocal 表⽰在局部作⽤域中, 调⽤⽗级命名空间中的变量
找的是离他最近的对应的变量,如果父级没有,继续往外找,直到找到为止,
但是遇到全局会自动停止(不会找全局的),如果直到最后还没找到的话,会报错