- 大体上分为三种(位置传参和关键字传参以及综合传参)
位置传参又包含普通位置传参和序列传参(也是位置传参的一种)
关键字传参又包含普通的关键字传参和字典传参
综合传参是以上传参的方式混合使用
1.位置传参(实参和形参按照对应的位置进行传参)
#位置传参
def myfun(a,b,c):
print('a = ',a)
print('b = ',b)
print('c = ',c)
myfun(1,,2,3) #形参和实参按照位置进行传参
2.序列传参(将实参序列按照*进行拆解,然后按照对应的位置进行传参)
#序列传参(将序列)
def func(a,b,c):
print("a = ",a,end=" ")
print("b = ",b,end=" ")
print("c = ",c,end=" ")
lst = [1,2,3] #列表序列
s = "xyz" #String序列
t = (4,5,6) #元组序列
st = {2,3,4} #集合序列
func(*lst)
func(*s)
func(*t)
func(*st)
3.关键字传参(按照形参的名称对形参进行赋值,实参和形参一一进行匹配)
# 此示例示意关键字传参
def myfun(a,b,c):
print("a = ",a)
print("b = ",b)
print("c = ",c)
myfun(b = 2,c = 3, a = 1)
myfun(c = 222,a = 1111,b = 333) #关键字传参不要求传递顺序
# myfun(a = 1,b = 2) 错误,参数不能缺少
# myfun(a = 1,b = 2,a = 3) 错误,参数必须一一对应
4.字典传参(是指实参为字典,将字典用**进行拆分后按照关键字传参的方式)
- 说明
1> 字典的键名和形参名必须一致,字典的键名要在形参当中
2>字典的键名必须为字符串
# 此示例示意字典关键字传参
def func(a,b,c):
print('a = ',a)
print('b = ',b)
print('c = ',c)
d = {'a':111,'c':333,'b':222}
func(**d) #等同于func(a = 111,c = 333,b = 222)
# 以下是错误的写法
# d2 = {1:'一','c':333,'b':222}
# func(**d2)
5.函数的综合传参:
- 函数的传参方式在能够确定形参能够唯一匹配到当前实参的情况下可以任意的组合.
- 要求:
位置传参在前,关键字传参在后.
# 函数的组合传参
def myfunc(a,b,c):
print("a = ",a)
print("b = ",b)
print("c = ",c)
myfunc(1,c = 3,b = 2) #正确
# myfunc(b = 2,a = 1,3) #错误,关键字传参必须在位置传参的后面
myfunc(100,*[200,300]) #正确,前面是位置传参,后面是星号序列传参
myfunc(*"AB",300)#正确,前面是星号序列传参,位置传参,后面也是位置传参
myfunc(*[100],c = 300, b = 200) #正确,
6.函数的缺省参数
- def 函数名(形参1=默认值1,形参2=默认值2,...)
1> 调用的时候可以不提供参数,使用默认的缺省参数就可.
2>缺省参数必须从右到左边依次存在,如果一个参数是缺省参数,则它的右边必须全部是缺省参数.
右边可以有可变参数,命名关键字参数,字典双星参数.
3>缺省参数可以有1个或多个,甚至可以全部是缺省参数.
# 缺省参数的使用
def info(name,age = 1,address = "不详")
print(name,"今年",age,"岁, 住在:",address)
# info() 出错,至少要提供一个实参给name绑定
info('小李')
info('tarena',15)
info('小魏',3,'北京市朝阳区')
7.位置形参
- def 函数名(形参1,形参2,....)
8.星号元组形参
- def 函数名(*args):
*收集多余的位置传参.
- 写一个函数可以接收n个参数,然后返回这些参数的和
def mysum(*args):
# args实际上是一个元组
return sum(args)
print(mysum(1,2,3))
print(mysum(4,3,2,3,5))
9.命名关键字形参
- def 函数名(,形参1,形参2): 或是 def 函数名(args,形参1,形参2)
作用:强制*后面的参数必须是关键字传参.字典传参也是关键字传参的一种
def fa(a, b, *, c, d):
'''强制c,d必须用关键字传参 '''
print(a, b, c, d)
fa(1, 2, d=400, c=300) # 对的
def fb(a, b, *args, c, d):
print(a, b, args, c, d)
fb(1, 2, 3, 4, d=400, c=200)
fb(1, 2, 3, 4, 5, **{'d': 400, 'c': 300})
# 问题:
# fb(1,2,3,4, c=400, d=300, e=500) # 出错,e是多余的
# fa(1, 2, 3, 4) # 错的
10.双星号字典传参
- def 函数名(**字典形参名):
作用: 收集多余的关键字传参
# 双星号字典形参的用法
def fa(**kwargs):
''' kwargs是一个字典,里面用键值对的方式存放了参数名称和对应的值
作用就是收集多余的关键字参数
'''
print("多余的关键字传参的个数是:",len(kwargs))
print("kwargs = ",kwargs)
fa(a = 10,b = 20,c = 30)
# fa(10,a = 10,b = 20,c = 30)错误,没有位置形参
# 多余的关键字传参的个数是: 3
# kwargs = {'b': 20, 'c': 30, 'a': 10}
# *args是星号元组传参,会收集前面n个位置传的形参,a必须是命名关键字形参.
# **kwargs负责收集后面的命名关键字传参(b and c)
def fb(*args,a,**kwargs):
print(args,a,kwargs)
fb(1,2,3, b = 30,c = 30,a = 10)
#(1, 2, 3) 10 {'b': 30, 'c': 30}
- 注意:
python中参数传递的一般顺序是:
位置传参 > 默认参数 > 星号元组传参 > 命名关键字传参 > 双星号字典传参