一、函数参数—动态传参
1、动态的接收位置参数
参数位置编写* 表示接收任意内容,有多个参数传进去,收到的内容是元组tuple
def func(*food): print(food) func("面","米饭","面包","馒头")
先位置参数,后动态参数
def chi(a,b,*food): print(a,b,food) chi("米饭","面条","鱼","肉","小菜")
默认值参数
def chi(a,b,*food,c="哇哈哈"): print(a,b,food,c) chi("腊肠","甜点","油条","大面包") #默认值生效
2、动态接收关键字参数
在python中使用**来接收动态关键字参数
def fun(**args): print(args) fun(a=1,b=2,c=3,d=4)
在上面的程序中接收到是:字典
最终的顺序:
位置参数>*args>默认值参数>**kwargs
这四种参数可以任意使用
如果想接收所有的参数,用*args和**kwargs
def func(*args,**kwargs): print(args,kwargs) func("小明","18",a=1,b=2)
动态参数的另一种传参方式
def func(*args): print(args) lst = [1,2,3,4,5] func(lst[0],lst[1],lst[2],lst[3],lst[4])
在实参位置上给一个序列,列表,可迭代对象前面加*表示把这个序列安位置打散
def func(*args): print(args) lst = [1,2,3,4,5] func(*lst)
在形参的位置上,加*表示聚合
如果是一个字典,也可以进行打散,但需要两个*
def func(**kwargs): print(kwargs) dic = {"a":1,"b":2,"c":3} func(**dic)
3、函数的注释
def func(a,b): ''' 这里是函数的注释,解释一下这个函数是干什么的 :param a: 参数a是干什么的 :param b: 参数b是干什么的 :return: 返回的是啥 ''' print(a,b)
二、命名空间
1、全局命名空间——我们在py文件中,在函数外声明的是变量叫全局命名空间
2、局部命名空间——在函数中声明的变量叫局部命名空间
3、内置命名空间——python解释器为我们提供的名字,如:list tuple str int 都是内置命名空间
加载顺序
内置命名空间、全局命名空间、局部命名空间(函数被执行的时候)
取值顺序
局部命名空间、全局命名空间、内置命名空间
作用域
1、全局作用域:全局命名空间+内置命名空间
2、局部作用域:局部命名空间
我们可以通过globals()查看全局作用域的内容,也可以用locals()查看局部作用域的内容
三、函数的嵌套
global表示:不在使用局部作用域中的内容,而改用全局作用域的变量
nonlocal表示:在局部作用域中,使用父级局部命名空间的变量