位置参数
位置参数是最常见的python函数的参数传递方式。根据参数定义的顺序,依次使用即可。
def f(a, b, c, d):
print("参数a:", a)
print("参数b:", b)
print("参数c:", c)
print("参数d:", d)
# 根据位置,传递参数
# 第一个对应第一个,最后一个对应最后一个
f("a", "b", "c", "d")
默认参数
有的时候,我们希望某些参数可以不用被传递,它应该有一个默认值,如果我们在函数调用的时候传递了这个参数,那么就用我们传递的参数,如果函数调用的时候,没有传递这个参数,就使用默认值。
def f(a, b, c="c", d="d"):
print("参数a:", a)
print("参数b:", b)
print("参数c:", c)
print("参数d:", d)
# 这三种情况是一样的
f("a", "b")
f("a", "b", "c")
f("a", "b", "c", "d")
# 使用我们传递的参数
f("a1", "b1", "c1", "d1")
注意:默认参数以后,就不能再定义位置参数了。因为如果位置参数出现在了默认参数后边,将无法知道是否传递了默认参数
可变参数
有的时候我们并不清楚到底需要多少参数,这个时候我们可以将其设置为可变参数。通过*变量名进行设置,可变参数可以接受多个位置参数,并将它们组成一个元组使用。
def f(*a):
print(a)
f("a", "b") # 打印结果为('a', 'b')
f("a", "b", "c") # 打印结果为('a', 'b', 'c')
f("a", "b", "c", "d") # 打印结果为('a', 'b', 'c', 'd')
注意:在定义函数的时候,可变参数后边不能出现位置参数,可变参数后边出现的都被视为关键字参数。
关键字参数
可变参数传入的参数没有名字,因此,如果我们需要带有名字的参数,可以通过**变量名接受关键字参数。关键字参数可以通过key=value的形式传入,最终,将自动组成一个字典。
def f(**a):
print(a)
f(a=1, b=2, c=3) # 结果为{'a': 1, 'b': 2, 'c': 3}
参数限定
普通的位置参数,都是均可以当作位置参数,也可以当作关键字参数使用的。因此,python加入了参数限定的方式,/之前的参数必须为位置参数,*之后的参数必须为关键字参数。
def f(a, /, b, c, *, d, e):
print(a)
print(b)
print(c)
print(d)
print(e)
# 这是不被允许的,因为d和e必须为关键字参数
# f("a", "b", "c", "d", "e")
# 同样也是不被允许的,因为a必须为位置参数
# f(a="a", b="b", c="c", d="d", e="e")
# 以下的方式都是可以的,而且效果也是一样的
f("a", "b", "c", d="d", e="e")
f("a", "b", c="c", d="d", e="e")
f("a", b="b", c="c", d="d", e="e")
# 另外,由于关键字参数是无所谓顺序的,也可以
f("a", e="e", b="b", d="d", c="c")
总结
1,位置参数不可以被放在默认参数后边,不可以被放在关键字参数后边。
2,没有限定的普通参数都是可以同时被当作位置参数或者关键字参数适用的。
3,使用可变参数使用变量名,使用不限制个数关键字参数使用*变量名。
4,/之前的参数必须为位置参数,/到之间的参数既是位置参数,也是关键字参数,以后的参数必须为关键字参数。
5,位置参数必须按照位置传递,关键字参数不需要按位置传递,但是需要指出名字。