一.可变长的参数
可变长指的是参数的个数不固定
站在实参的角度,实参是为了给形参复制的,如果实参的个数不固定,那么必须要有对应的形参来接收溢出的实参
1.在形参中出现和**
1.1 形参中出现,会把多余的普通实参收集起来组成元组,赋值给后面的形参名
1.2 形参中出现**,会把多余的关键字实参收集起来组成字典,赋值给**后的形参名
2.在实参中出现和**
2.1 实参中出现*,会将后的可迭代数据打散成普通实参
2.2 实参中出现**,会将**后的字典打散成关键字实参
3.形参中,在和**之间出现的是命名关键字形参,特点:必须要有关键字实参给其赋值,命名关键字参数可以是默认形参的形式
二.函数参数总结
参数分为形参和实参两种
形参:在函数定义阶段的参数,顺序 位置形参,默认形参,普通收集参数,命名关键字形参,关键字收集参数
实参:在函数调用阶段的参数,顺序:位置实参,关键字实参
- 在定义处用来收集多余普通实参,返回元组
- *在定义处用来收集多余的关键字实参,返回字典
在调用处用来打散后的可迭代数据,变成普通实参
在调用处用来打散后的字典,变成关键字实参
三. 函数对象
函数对象指的是函数可以当做变量使用
def foo():
print(‘from foo’)
1.可以被赋值
f = foo
f()
2.可以当做一个参数传给函数
def bar(func):
print(func)
func()
bar(foo)
3.可以当做函数的返回值
def bar():
return foo
4.可以当做容器中的元素
lst = [foo]
四.函数嵌套
函数的嵌套使用:正常情况下,内函数只能在函数内部调用
闭包函数:内函数使用了外函数的变量,并且被外函数返回
def circle(radius,mode=0):
def perimiter(radius):
return 2 * pi * radius
def area(radius):
return pi * (radius ** 2)
if mode == 0:
return perimiter(radius)
elif mode == 1:
return area(radius)
res1=circle(3,0)
res2=circle(3,1)
print(res1)
print(res2)
五.名称空间和作用域
名称空间:存放名字的地方
1.内置名称空间:存放的是内置的名字,如print\len等
生命周期:解释器启动则产生,解释器关闭则销毁
2.全局名称空间:存放的是全局变量的名字,
生命周期:python程序运行时产生,python程序结束则销毁
3.局部名称空间:存放的是局部变量的名字
生命周期:调用函数时产生,函数调用结束后销毁
4.名字查找优先级
从当前位置往外查找,如果当前在局部:局部名称空间==>全局名称空间==>内置名称空间
从当前位置往外查找,如果当前在全局:全局名称空间==>内置名称空间
ps:名称空间的嵌套关系是在函数定义阶段就固定死的,与函数的调用位置无关
5.全局范围/全局作用域:内置名称空间+全局名称空间
特点:全局存活,全局有效
局部范围/局部作用域:局部名称空间
特点:临时存活,局部有效
6.修改全局变量:global
修改局部变量 nonlocal