函数的形参与实参
形参与实参
形参:在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名
def func(x,y):
print(x,y)
实参:在调用函数阶段传入的值称之为实际参数,简称实参,相当与变量值
func(1,2)
形参与实参的关系:
在调用阶段,实参会绑定给形参
这种绑定关系只能在函数体内使用
实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系
位置形参
在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参
特点:必须被传值,多一个不行,少一个也不行
def foo(x,y,z)
print(x,y,z)
foo(1,2,3)
foo(1,2,3,4),报错
foo(1,2),报错
位置实参
在函数调用阶段,按照从左到右依次传入的值 ,称之为位置实参
def foo(x,y,z)
print(x,y,z)
foo(1,2,3)
foo(3,2,1)
关键字实参
在函数调用阶段,按照k,v的格式来传值。称之为关键字实参
特点:可以打乱顺序,但仍能为指定的形参赋值
foo(x=1,y=2,z=3)
foo(x=1,z=3,y=2)
注意:
1,可以混用位置实参与关键字实参,但是位置实参必须在关键字实参前面,
2,不能为同一个形参重复赋值
foo(1,y=2,z=3)
foo(y=2,1,z=3)这个会报错
foo(1,2,3,x=4)报错,x重复赋值了
默认形参
在函数定义阶段,就已经为形参赋值,称之为默认形参
特点:定义阶段就已经有值了,意味着在调用阶段可以不用为其传值,
def foo(x,y=2):
print(x)
print(y)
foo(111)
foo(111,333)
只给x传值,不给y传值,y就使用定义阶段传的值
也可以给y传值,这样y就会使用后传的值,不会使用定义阶段的值
注意:可以混用位置形参与关键字形参,但是
1,位置形参必须在跟在默认形参的前面
2,默认形参的值推荐指向不可变类型
3,默认形参的值只在函数定义阶段被赋值一次
m = 100 m-> 100的内存地址
def foo(x,y=m): y = 100的内存地址
print(x,y)
m = 200
foo(1)
x = 1,y= 100
m = [111,222,333] m指向的是列表的内存地址
def foo(x,y=m):
print(x,y)
m = 200
foo(1)
x = 1,y = [111,222,333]
m = [111,222,333]
def foo(x,y=m):
print(x,y)
m.append(444)
foo(1)
x = 1 y = [111,222,333,444]
可变长参数
在形参中带*,*会将溢出的位置是实参值汇总成列表,然后赋值给紧跟其后的形参名
def foo(x,*Y): y = (222,333,22,25)
print(x,y)
foo(1),x=1,y为空
foo(1,222,333,22,25):x = 1,y=(222,333,22,25)
在形参中带**:**会将溢出的关键字实参值汇总成字典,然后赋值给紧跟其后的形参名
def foo(x,**y):
print(x,y)
foo(1,a=111,b=222,c=333)#x=1 y={'a': 111, 'b': 222, 'c': 333}
在实参中带*
def foo(x,y,z)
print(x,y,z)
foo(*[11,22,33]) # x=11,y=22,z=33
相当于:foo(11,22,33)
在实参中带**
def foo(x,y,z)
print(x,y,z)
foo(**{'a':1,'b':2,'c':3})#foo(a=1,b=2,c=3)
foo(**{'x':1,'y':2,'z':3})#foo(x=1,y=2,z=3)
def index(a,b,c):
print(a,b,c)
def wrapper(*args,**kwargs):
index(*args,**kwargs)
wrapper(1,b=222,c=333)
浙公网安备 33010602011771号