⼀:函数的参数分为两种:
#1.形参:在定义阶段括号内指定的参数,相当于变量名#2.实参:在调⽤阶段传⼊的值称之为实参,相当于值
#形参在定义阶段是不占⽤内存空间的
#在调⽤阶段,实参的值会绑定给形参,在调⽤结束后解除绑定。 # def foo(x,y): #x=1,y=2 # print(x,y) #
# foo(1,2)
⼆:在python中的参数分类
#1.位置参数:按照从左到右的顺序依次定义的参数
#位置形参:必须被传值,在函数调⽤的使传⼊的值多⼀个少⼀个都不⾏。#位置实参:与形参⼀⼀对应传值 #按照顺序给形参传值
如:位置形参:必须被传值,多⼀个少⼀个都不⾏。def foo(x,y): print(x,y)
foo(1,2,3)
错误:TypeError: foo() takes 2 positional arguments but 3 were given
#接受两个位置参数,你给了3个,只有两个位置形参,那就必须给传两个实参.
如:#位置实参:与形参⼀⼀对应传值 #按照顺序给形参传值def foo(x,y): print(x,y)foo(1,2)#结果是 1 2
def foo(x,y): print(x,y)foo(2,1)#结果是2 1
#我们通过位置实参,发现我们传参是通过顺序给我们的形参⼀⼀对应的
关键字参数:在函数调⽤时,按照key=value的形式定义的实参 #按照关键词的⽅式给我们的形参传值特点:指明道姓地给形参传值,不在依赖于位置注意:关键词实参必须放在位置实参的后⾯。如:
def info(name,age,sex): print(name,age,sex)info('zhao',18,'male')
#返回结果:zhao 18 male #这个传值你必须知道这个参数是按照什么排列的,有⼀个更好的⽅法,我们使⽤关键字参数
关键词传参如下:
def info(name,age,sex): print(name,age,sex)
info(name='zhao',sex='male',age=18)
#返回结果:zhao 18 male #现在就不依赖位置进⾏传参,这个时候我们的形参是固定死,位置形参
总结:
实参的传值⽅式:位置实参,关键词实参,它们必须遵循形参的规则。 位置形参是必须⽐传值。
默认参数:
#默认参数:在函数定义阶段,就已经给形参赋值了
#特点:定义阶段已经有值,意味着调⽤阶段可以不⽤传值#注意:
#1.默认参数必须放在位置形参的后⾯#2.默认参数的值旨在定义是被赋值⼀次
#3.默认参数的值通常应该是不可变类型 : 常⽤字符串 整型def info(name,age,sex='male'): print(name,age,sex)info('zhao',18)
#返回结果:zhao 18 male
def info(name,age,sex='male'): print(name,age,sex)info(name='zhao',age=18)#返回结果:zhao 18 male
可变成参数 *的⽤法
#可变长参数:在调⽤函数是,实参值的个数不固定#实参的形式有:位置实参,关键字实参
#位置实参的个数不固定,形参是负责收值,形参就必须有相应的解决⽅案#位置实参的个数不固定:形参的解决⽅案:*, **
# * 处理的按照位置定义的实参,溢出的部分,多出来的部分# ** 处理按照关键词,溢出的部分,多出来的部分
def info(x,y,*args): print(x,y) print(args)
info(1,2,3,4,5,6) #按照位置定义的实参,超出都会被*接受,然后保存成元组的形式,赋值给args # #返回结果: 1 2
( 3, 4, 5, 6) #第⼆种
#以后只要在实参看见* 他就等同于位置参数,在这⾥遇到的是⼀个元组的⽅式 *(1,2,3,4,5),⾸先我们进⾏解压得到的结果 1 2 3 4 5def info(x,y,*args): #args=(3,4,5) print(x,y) print(args)
info(*(1,2,3,4,5)) #解压打回原形成位置实参的⽅式 info(1,2,3,4,5) #在进⾏对形参传值info(*[1,2,3,4,5]) #解压 info(1,2,3,4,5)
#注意以后在实参看见* 就先把它解压打回原形#返回结果是⼀样
1 2(3, 4, 5)1 2(3, 4, 5)
#实例
#⾸先看到实参上有* 先把他打回原形
def info(x,y): #x=1 y=2 print(x,y)
info(*(1,2)) # info(1,2) 这⾥的1对应的x 2对应的y#**kwargs 关键字参数
#按照关键字定义的实参它的个数是不固定的,相应的形参也有⼀种按照关键词收值多出来的#只要关键字实参遇见 ** 先打会原形解压
def info(x,y,**kwargs): #kwargs={'x':1,'y':2,'c':3,'d':4,'e':5} 赋值给kwargs print(x,y) print(kwargs)
info(x=1,y=2,c=3,d=4,e=5) #c=3,d=4,e=5 这个是关键词多出来的实参#返回的结果是:1 2
{'c': 3, 'd': 4, 'e': 5} 实例⼆:
def info(x,y,**kwargs): # x=1,y=2 kwargs={c:3} print(x,y) print(kwargs)
# info(x=1,y=2,c=3,d=4,e=5)
info(**{'x':1,'y':2,'c':3}) #看到**关键字实参,先打回原形解压 info(x=1,y=2,c=3)
实例三:
def foo(name,age): print(name,age)
foo(**{'name':'zhao','age':18}) #把字典当做参数传给形参,先解压 foor(name=zhao,'age'=18)
foo({'name':'zhao','age':18},18) #注意这⾥不加**他就是⼀个位置实参,把⼀个字典给了我们的形参name赋值 name='name':'zhao','age':18}#返回结果:
zhao 18
{'name': 'zhao', 'age': 18} 18
*和 ** 可变长参数的应⽤的场景
#⾸先我们定义个 bar函数
#bar定义的是位置形参,意味就是必须给传值,传值的形式不固定,可以按照位置实参传值,关键字传值def bar(x,y,z): print(x,y,z)
#以下定义的这个函数很⽜逼,任意长度,任意形式的参数def wrapper(*args,**kwargs): print(args,kwargs)
wrapper(1,2,3,a=4,b=5,c=6)
站在实参的位置,必须这样写返回结果:(1, 2, 3) {'a': 4, 'b': 5, 'c': 6}
因篇幅问题不能全部显示,请点此查看更多更全内容