函数之形参与实参
一.形参与实参
1.形参(形式的参数)指的是:在定义函数时 括号内的定义的参数 其实就是变量的名
实参(实际的参数)指的是:在调用函数时 括号内传入的值 其实就是变量的值
def func(x,y): #x y 就是形参
print(x)
print(y)
func(10,11) # 10 11 就是实参
2.注意
实参(变量的值)与形参(变量的名)的绑定关系
只在函数调用的才会生效 绑定
在函数调用结束就会立刻解除绑定
二.位置参数
3.位置参数:位置即顺序 位置参数指的就是从左到右的顺序依次定义的参数
分两种:
3.1.在定义函数时,按照位置定义的形参 称为位置形参
def foo(x,y,z):
print(x,y,z)
foo(1,2,3)
#位置形参的特性:在调用函数时必须为其传值 多一个不行 少一个也不行
3.2.在调用函数时,按照位置定义的实参 称为位置实参
#位置实参会与形参一一对应
foo(1,2,3)
三.关键字参数
4.什么是关键字参数:在调用函数时 按照key-value的形式定义的实参 称为关键字参数
def foo(x,y,z):
print(x,y,z)
foo(x=1,y=2,z=3)
#注意:
1.相当于指名道姓的为形参传值,意味着即便是不按照顺序定义,仍然能为指定的参数传值
2.在调用函数时,位置实参与关键字实参可以混合使用 但
必须遵循形参的规则
foo(1,y=3,z=2)
3.不能为同一个形参重复的传值
foo(1,x=1,y=3,z=2) #错误
foo(1,y=3,z=2)
4.位置实参必须在到关键字实参的前面
foo(y=3,1,x=2) #错误
foo(1,z=2,y=3) #正确
四.默认参数:
在定义阶段,已经为某个形参赋值 那么该形参就是默认参数
#注意:在定义阶段已经有值,意味着调用阶段可以不传值
def register(name,age,sex='male'):
print(name,age,sex)
register('zhang',18) #只传两个值
regsiter('miss',73,'female') #传入三个值 不执行默认值
1.位置参数必须在默认参数的前面
def func(x,y=1): #y=1 默认参数
pass
2.默认参数的值只在定义阶段赋值一次,也就是说默认参数的值在定义阶段就固定死了
m=10
def foo(x,y=m): #固定值m=10 传值也没用
print(x,y)
m='111111111111'
foo(1)
3.默认的参数的值应该设置为不可变的类型
def register(name,hobby,l=None):
if l is None:
l=[]
l.append(hobby)
print(name,l)
regsiter('www','play')
register('zhang','read')
register('miss','music')
#形参定义方面:
对于经常需要变化的值,需要将对应的形参定义成位置形参
对于大多数情况值都一样的情况,需要将对应的形参定义成默认形参
五.可变长度的参数
什么是可变的参数:
可变长度值的参数的个数可以不固定
实参有按位置定义的实参和关键字定义的实参
所以可变的长度的实参指的就是按照两种形式定义的实参个数不固定
然而实参终究是要给形参传值
所以形参必须有对应的解决方案来分别处理以上的两种形式的可变长度的实参
形参:* ** 代替
#形参加* **
# * 会将溢出的位置实参全部接收 然后保存成元祖的形式赋值给args
def foo(x,y,z,*args): #args=(4,5,6,7,8)
print(x,y,z)
print(args)
foo(1,2,3,4,5,6,7,8)
# ** 会将溢出的位置实参全部接收,然后保存成字典的形式赋值给kwargs
def foo(x,y,z,**kwargs): #kwargs={'a':1,'b':2,'c':3}
print(x,y,z)
print(kwargs)
foo(x=1,y=2,z=3,a=1,b=2,c=3)
#实参加* **
#一旦碰到实参加* 就把该实参的值打散
def foo(x,y,z,*args): #args=([4,5,6,7,8])
print(x,y,z)
print(args)
foo(1,2,3,*[4,5,6,7,8]) #foot(1,2,3,4,5,6,7,8)
#一旦碰到实参参加**,就把该实参的值打散
def foo(x,y,z,**kwargs): #kwargs={'a':1,'b':2,'c':3}
print(x,y,z)
print(kwargs)
foo(1,2,3,**{'a':1,'b':2}) #foo(1,2,3,b=2,a=1)
def foo(x,y,z):
print(x,y,z)
foo(1,**{'z':2,'y':3}) #foo(1,y=3,z=2)
foo(1,**{'z':3,'y':2,'x':1111}) #错误 x不能重复赋值
#组合使用
def wrapper(*args,**kwargs): #任意参数的长度传参都可以接收 args=(1,2,3,4,5,6,7,8,10),kwargs={'x':1,'y':2,'z':3}
print(args)
print(kwargs)
wrapper(1,2,3,4,5,6,7,8,10,x=1,y=2,z=3)
例子:
def index(name,age,gender):
print('welcome %s %s %s'%(name,age,gender))
def wrapper(*args,**kwargs):
index(*args,**kwargs) #index(*(1,2,3)),**{'x':1,'y':2,'z':3} 打散为 index(1,2,3,z=3,y=2,z=2)
wrapper('miss',age=18,gender='male') #关键字参数
wrapper('zhang',18,gender='maile')
wrapper('zhang',18,'maile') #位置参数
*的应用场景
计算数的和
def sum2(*args): #args=(1,2,3)
res=0
for num in args:
res+=num
resturn res
print(sum2(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20))
** 的应用场景
def auth(name,pwd,**kwargs)
print(name)
print(pwd)
print(kwargs)
auth(name='zhang',pwd='123',group='group1')