这个函数 setfun
的定义包含几种不同类型的参数:
def setfun(a, b=1, c='X', *, d=int):
print(f'a = {a}')
print(f'b = {b}')
print(f'c = {c}')
print(f'd = {d}')
setfun('1', '2', 3, d=str)
# setfun(2, 2)
a
是一个必需的位置参数。b
是一个可选的位置参数,默认值为1
。c
也是一个可选的位置参数,默认值为字符串'X'
。d
是一个关键字参数,必须通过指定其名称来传递,并且有一个默认值int
。
由于 d
是用两个星号(**
)引入的,这意味着所有跟在 c
之后的参数都必须通过关键字来指定。在这个定义中,d
是唯一一个必须命名的关键字参数,因为它跟在星号(*
)之后。
以下是如何传递参数给这个函数的一些例子:
传递一个参数
setfun(2)
这将输出:
a = 2
b = 1
c = X
d = 0
因为 a
是必需的,b
和 c
取默认值,而 d
默认为 int
类型对象。
传递两个参数
setfun(2, 3)
这将输出:
a = 2
b = 3
c = X
d = 0
在这里,a
和 b
被赋值,而 c
和 d
取默认值。
传递三个参数
setfun(2, 3, 'Y')
这将输出:
a = 2
b = 3
c = Y
d = 0
在这个调用中,a
、b
和 c
都被赋值,而 d
保持默认值。
传递四个参数
由于 d
是一个关键字参数,当你想传递四个参数时,最后一个必须通过关键字 d
来指定:
setfun(2, 3, 'Y', d=10)
这将输出:
a = 2
b = 3
c = Y
d = 10
在这个调用中,所有参数 a
、b
、c
和 d
都被明确赋值。
使用关键字参数传递 d
即使 d
是第一个参数,你仍然需要使用关键字来指定它:
setfun(d=5)
这将输出:
a = 5
b = 1
c = X
d = 5
在这个调用中,只有 d
被指定,其他参数 a
、b
和 c
取它们的默认值。
错误用法
尝试不使用关键字参数来传递 d
将会导致错误:
# 这将引发 TypeError,因为 `d` 必须是一个关键字参数
setfun(2, 3, 'Y', 10)
正确的做法是使用 d
作为关键字:
setfun(2, 3, 'Y', d=10)
这样,所有参数都按照预期被传递和处理。