Python位置传参
位置传参也称为必备参数,必须按照正确的顺序将参数传递到函数中,定义函数时的参数与实际传入的参数数量必须保持一致
正常如下:
def par(A,B):
return A+B
print(par(1,2))
结果
3
少传参数:
def par(A,B):
return A+B
print(par(1))
结果
TypeError: par() missing 1 required positional argument: 'B'
缺少一个必要的 B 参数。
多传参数
def par(A,B):
return A+B
print(par(1,2,3))
结果
TypeError: par() takes 2 positional arguments but 3 were given
只需要 2 个参数,但是却传入了 3 个参数。
Python 关键字参数
关键字传参是以形参的名字确认输入的参数值,通过关键字传参不在需要与形参位置完全一致,只要参数名正确即可
def par(A,B):
print("A",A)
print("B",B)
par(A=1,B=2)
print("~"*30)
par(B=2,A=1)
结果
A 1
B 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A 1
B 2
可看出在调用函数时既可以根据位置参数调用,也可以使用关键字来调用,也可任意调换位置,只要参数关键字正确即可
必须要注意的是在使用位置参数和关键字参数混合传参的方式时,关键字参数必须位于所有位置参数之后
Python 默认传参
在调用函数时如果不指定某个参数,python解释器会抛出异常。为了解决这个问题python运行为参数设置默认值,即在定义函数时直接给形参指定一个默认值。这样即使调用函数时没有给拥有默认值的形参传递参数时,该参数可以直接使用定义函数时设置的默认值
语法格式
def 函数名(...,形参名,形参名=默认值):
代码块
注意,在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
def par(A,B=2):
print("A",A)
print("B",B)
par(A=1)
print("~"*30)
par(A=1,B=3)
结果
A 1
B 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A 1
B 3
结论:函数中 B参数设有默认值,也就是说可以只传一个参数,也可以传两个参数,传一个参数时会使用默认值
对于自己定义的函数可以知道哪个参数有默认值,但如果使用python提供的内置函数,或者其他第三方提供的函数,怎么知道哪些参数有默认值?
Python中可以使用"函数名__defaults__"查看函数默认参数的当前值,返回的是一个元组
def par(A,B=2):
print("A",A)
print("B",B)
print(par.__defaults__)
结果
(2,)
Python可变参数(*args,**kwargs)
可变参数又称为不定长参数,即传入函数中的实际参数可以是任意多个
可变参数:形参前添加一个 '*'
args表示创建一个名为args的空元组,该元组可接受任意多个传入的非关键字实参
def par(A,*args):
print(A)
print(args)
par(1,2,3,4)
结果
1
(2, 3, 4)
除了前面位置参数接收对应位置的实参外,其它非关键字参数都会由 args元组接收。
def par(*args,A):
print(A)
print(args)
par(1,2,3,4)
结果
TypeError: par() missing 1 required keyword-only argument: 'A'
我们没有给 A 参数传值。当然,如果A 参数有默认参数,则此调用方式是可行的。
可变参数:形参前添加两个’*'
**kwargs 表示创建一个名为 kwargs 的空字典,该字典可以接收任意多个以关键字参数赋值的实际参数。
def par(A,**kwargs):
print(A)
print(kwargs)
par(1,B=1,C=2)
结果
1
{'B': 1, 'C': 2}
注意,*args 可变参数的值默认是空元组,**kwargs 可变参数的值默认是空字典。因此,在调用具有可变参数的函数时,不一定非要给它们传值。
def par(A,**kwargs):
print(A)
print(kwargs)
par(1)
结果
1
{}
Python逆向参数传递
- 直接将列表、元组、字典作为函数参数,Python 会将其进行拆分,把其中存储的元素按照次序分给函数中的各个形参。
- 在以逆向参数收集的方式向函数参数传值时,Pyhon 语法规定,当传入列表或元组时,其名称前要带一个 * 号,当传入字典时,其名称前要带有 2 个 * 号。
def par(A,args):
print(A)
print(args)
data = ["A","B"]
par(*data)
结果
A
B
def par(A,B):
print(A)
print(B)
data = {"A":1,"B":2}
par(**data)
结果
1
2
如果使用逆向参数收集的方式,必须注意 * 号的添加。以逆向收集字典为例,如果传参时其字典名前不带 * 号,则 Python 解释器会将整个字典作为参数传递给一个参数。例如:
def par(A,*args):
print(A)
print(args)
data = {"A":1,"B":2}
par(data)
结果
{'A': 1, 'B': 2}
()