除了可变参数外,都可以有缺省值,定义时,如果没有提供该参数,动用缺省值.
仅位置和普通参数,一起算,缺省值的定义往后放
仅关键字参数,缺省值无所谓先后
def foo(*args, x, y):
print(x, y, args)
foo(y=6, x=4), foo(x=4, y=6), foo(1, x=4, y=8), foo(1, 2, 3, 4, y=3, x=3)
# 返回结果:4 6 ()
# 返回结果:4 6 ()
# 返回结果:4 8 (1,)
# 返回结果:3 3 (1, 2, 3, 4)
# 返回结果:(None, None, None, None)
def foo(*args, x, y, **kwargs):
print(x, y, args, kwargs)
foo(a=100, b=2, y=6, x=4), foo(1, 2, x=4, a=100, y=5)
# 返回结果:4 6 () {'a': 100, 'b': 2}
# 返回结果:4 5 (1, 2) {'a': 100}
# 返回结果:(None, None)
def foo(x, *args, y):
print(x, args, y)
foo(1, 2, 3, y=10), foo(y=6, x=7)
# 返回结果:1 (2, 3) 10
# 返回结果:7 () 6
# 返回结果:(None, None)
def foo(x, *args, y):
print(x, args, y)
def fn(a, b, /):
print(a, b)
fn(1, 2)
# 返回结果:1 2
def bar(a, b, /, c, d=10, *args, m, n, **kwargs):
print(a, b, c, d, '|', m, n, args, kwargs)
# 函数形参5种形参方式都展现出来了。
bar(1, 2, 3, 4, 5, m=6, n=7)
# 返回结果:1 2 3 4 | 6 7 (5,) {}
def config(host, username='Runaway', password='123', port=3306, **options):
connstr = "mysql://{}:{}@{}:{}".format(username, password, host, port)
print(connstr)
# 定义函数时,把重要的参数列在外面,最常改变的参数尽量往前放
config('192.168.1.1'), config('192.168.1.1', 'root', 'root', 2206)
# 返回结果:mysql://Runaway:[email protected]:3306
# 返回结果:mysql://root:[email protected]:2206
# 返回结果:(None, None)
* 对容器解构,按照位置传实参,字典取的是key
** 只用于mapping(字典),按照kv对实现关键字传参,key要和形参对应
def add(*nums):
s = 0
for i in nums:
s += i
return s
# 求和函数
add(1, 4, 5)
# 返回结果:10
add(*range(5))
# 对range(5)解构
# 返回结果:10
add(*[1, 2]), add(*(1, 2)), add(*{1, 2}), add(*{'a':1, 'b':2}.values())
# 获取字典的value值在解构就可以了。
# 返回结果:(3, 3, 3, 3)
def foo(*args, x, y):
print(x, y, args)
foo(), foo(1, 2, 3, 4, 5), foo(x=7, z=5, y=8)
# 报错原因:x和y没有给值
# 报错内容:TypeError: foo() missing 2 required keyword-only arguments: 'x' and 'y'
def foo(x, *args, y):
print(x, args, y)
foo(1, 2, 3, x=100, y=200)
# 报错原因:# x的值给了2次
# 报错内容:TypeError: foo() got multiple values for argument 'x'
def fn(*, x, y):
print(x, y)
fn()
# 报错原因:星后面的是仅关键字参数,必须指定,上面的函数是定义了一个keyword形参,只能接收仅关键字参数
# 报错内容:TypeError: fn() missing 2 required keyword-only arguments: 'x' and 'y'
def fn(a, b, /):
print(a, b)
fn()
# 报错原因:没有传参
# 报错内容:TypeError: fn() got some positional-only arguments passed as keyword arguments: 'a, b'
fn(1), fn(a=1, b=2)
# 报错原因:/前面仅接受位置传参
# 报错内容:TypeError: fn() missing 2 required positional arguments: 'a' and 'b'