01 形参 动态参数
1.目的:
函数为了拓展,对于传入的实参数量不固定,我们需要一个万能参数,可以收纳所有传入的数据。
2.形式:
- 在函数定义时,在位置函数前加一个'*',含义是聚合或者打散。
- *args将所有的实参的位置参数聚合到一个元组,并将这个元组赋值给args
- **kwargs将所有的实参的关键字参数聚合到一个字典,并将这个字典赋值给kwargs
打散的魔性用法例题:
l1 = [1,2,3]
l2 = [111,22,33]
def fun1(*args)
print(args)
func1(*l1,*l2)
#打散后得到的结果是
(1,2,3,111,22,33)
def func1(**kwargs):
print(kwargs)
dic = {'name':'alex'}
dic1 = {'age':1000}
func1(**dic,**dic1)
#打散得到的结果
{'name':'alex','age':1000}
3.形参顺序
- 位置参数>*args>默认参数>**kwargs
02 作用域,名称空间,取值顺序等
1.名称空间
作用:存储的是变量名与对应值的内存空间的对应关系。
分类:
1)内置名称空间
2)全局名称空间
3)局部名称空间
2.作用域
作用域分类:
1)全局作用域,包含全局名称空间和内置名称空间
2)局部作用域包含局部名称空间。
3.取值顺序
满足就近原则
先局部名称空间找,没有就去全局名称空间找,再没有就去内置名称空间找。也没有,则报错。
顺序:局部>全局>内置,单项从小到大。
4.加载顺序
内置名称空间最先加载,全局名称空间其次(在程序执行时),最后局部名称空间(函数调用时)
顺序:内置名称空间 先于 全局名称空间 先于 局部名称空间
03 函数的嵌套
04 global nonlocal
#例题:
count = 1
def func1():
count = count + 1
print(count)
func1()
#注意:在局部名称空间,对一个变量进行修改,那么解释器会认为该变量在局部已经定义
#而上述的例题,局部没有定义count,所以会报错。
1.global
作用:
1)在局部名称空间声明一个全局变量。
#例题:
def func2():
name = 'alex'
func2()
print(name)
#输出:报错
#原因:name为局部变量在函数执行完毕后内存空间释放
# 报错没有定义
def func2():
global name
name = 'alex'
func2()
print(name)
#输出:alex
#原因:global函数会保留name的内存空间在内存中,
#不会因为函数结束而释放
2)局部名称空间可以对全局变量进行修改
例题:
count = 1
def func1():
global count
count = count + 1
print(count)
func1()
#输出结果:2
#在函数内更改了全局变量count的值
实际应用:
对全局变量进行修改
2.nonlocal
例题:
def func1():
count = 666
def func2():
count += 1
print(count)
func2()
func1()
#输出:报错,内部名称空间不能对外部名称空间的变量进行修改,只能引用。
作用:
子函数对父函数的变量进行修改。
注意:此变量不能是全局变量