第九天函数
---恢复内容开始---
一.定义
形参:在定义函数时括号内的参数,其实就是变量名
实参:在调用函数时括号内的参数,其实就是变量的值
举个例子:
def func(x,y):(x,y就是形参)
print(x)
print(y)
func(10,5):(10和5就是实参)
二.位置参数
位置即顺序,就是按位置从左到右的的顺序依次定义的参数
2.1位置形参:在定义函数时按照位置定义的形参
def func(x,y,z)
print(x,y,z)
注意点:再调用函数的时候必须为其传值,一个也不能多一个也不能少。
2.2位置实参:在调用函数时,按照位置定义的实参
func(1,2,3)
注意:位置实参会和形参一一对应
三.关键字参数
定义:在调用函数时以key=value的形式来定义的实参,称之为关键字实参
def foo(x,y,z)
print(x,y,z)
需要注意一下几点:
1相当于指名道姓的为形参传值,意味着即便不按顺序定义也能够为形参传值
foo(x=1,y=2,z=3)
2.在调用函数时,位置实参和关键字实参可以放一起使用但必须遵循以下规则:
①必须遵循形参规则
foo(1,z=3,y=2)
foo(1,z=3)#少一个参数都不行
②不能为同一个形参重复传值
foo(1,x=1,y=2,z=3)
③位置实参必须放到关键字实参前面
foo(z=3,y=2,1),错
foo(1,z=3,y=2)
四:默认参数
定义:在定义阶段已经为某一个形参赋值,那么该形参就会默认参数
注意事项:
①在定义阶段有值,意味着调用阶段可以不用传值
②位置形参必须在默认参数的前面
③默认参数的值只在定义阶段赋值一次,也就是说默认参数的值在定义阶段就已经赋值死了
④默认参数的值应该设置为不可变类型
五.可变长度的参数
定义:可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
5.1形参中包含
①*args:*会将溢出部分的参数全部接收,然后保存成为元组的形式赋值给args
def func(x,y,z,*args)
print(x,y,z,args)
func(1,2,3,4,*[5,6,7,8])
②**kwargs:**会将溢出的部分的参数全部接收,然后保存成字典的形式赋值给kwargs
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,a=1,b=2,c=3)
5.2实参中包含*:就把该实参的值打散
def foo(x,y,*args):
print(args)
foo(1,2,*[3,4,5])
def foo(x,y,z)
print(x,y,z)
foo(*[1,2,3]) #foo(1,2,3)
foo(*[1,2])#foo(1,2)#报错
5.3实参中包含**,就是把实参的值打撒
def foo(x,y,z):
print(x,y,z)
foo(1,**{'z':3,'y':2}) #foo(1,z=3,y=2)
foo(1,**{'z':3,'y':2,'x':111}) #foo(1,z=3,y=2,x=111)#报错,不能给一个形参多重赋值
5.4组合使用
def wrapper(*args,**kwargs): #args=(1,2,3),kwargs={'x':1,'y':2,'z':3}
print(args)
print(kwargs)
index(*args,**kwargs) # index(*(1,2,3),**{'x':1,'y':2,'z':3}) # index(1,2,3,z=3,y=2,x=2)
wrapper(1,2,3,x=1,y=2,z=3)
6.命名关键字参数:
定义:在*后面的参数都是命名关键字参数
特点:①必须被传值
②约束函数的调用者必须用key=value的形式传值
③约束函数调用者必须用指定的key名
例子:
1.
def foo(x,y,*,z)
print(x,y,z)
foo(1,2)
foo(1,2,3)
foo(1,2,z=3)#正确
2.
def auth(*args,name,pwd)
print(name,pwd)
auth(pwd='213',name='egon')
7.1函数的嵌套调用:在函数内又调用了其它函数
例如:
def max2(x,y):
if x>y:
return x
else:
return y
def max3(x,y,z):
res1=max2(x,y)
res2=max2(res1,z)
return res2
print(max3(11,199,2))
结果输出:199
7.2函数的嵌套定义:在函数内又定义其它函数
def func1():
print('from func1')
def func2(): #func2=内存地址
print('from func2')
print(func2) #<function func1.<locals>.func2 at 0x0000024907A098C8>
func2()
func2()
func2()
func1()
8.名称空间与作用域
一.名称空间:存放名字与绑定关系的地方
二.名称空间分三类:
1.内置名称空间:存放python解释器自带的名字,在解释器启动时就生效,解释器关闭就失效
2.全局名称空间:文件级别的名字,在执行文件的时候生效,在文件结束或者文件执行期间被删除则失效
3.局部名称空间:存放函数内定义的名字(函数的参数内的名字都存放与局部名称空间)在函数调用时临时生效,函数结束时则失效
加载顺序:内置名称空间==》全局名称空间==》局部名称空间
查找名字:局部名称空间==》全局名称空间==》内置名称空间
三.作用域
①全局作用域:包含的是内置名称空间与全局名称空间的名字
特点:1️⃣在任何位置都能访问的到
2️⃣在该范围内的名字会伴随程序整个生命周期
②局部作用域:包含的是局部名称空间的名字
特点:1️⃣只能在函数内使用
2️⃣调用函数时生效,调用时结束
9.函数在python中时第一类对象
1️⃣可以被引用
2️⃣可以当作参数引用
3️⃣可以当作函数的返回值
4️⃣可以当作容器类型的元素
10.闭包函数
1️⃣指的是定义在函数内部的函数
2️⃣并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
作用域关系:在函数定义阶段就规定死了,与调用位置无关
---恢复内容结束---