-- coding: utf-8 -
‘’’
位置可变参数: 一个形参可以匹配任意个参数
在形参前面使用 * 表示该形参是可变参数,可以接收多个实参
收集多个实参为一个 tuple
‘’’
def add(*nums):
s = 0
print(type(nums))
for x in nums:
s += x
print(s)
add(3, 6, 9)
#add(nums=1) # got an unexpected keyword argument 'nums'
‘’’
关键字可变参数
形参前面使用 ** 符号,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典
在混合使用的时候,可变参数要放到参数列表的最后,普通参数需要放到参数列表前面,位置可变参数需要在关键字可变参数之前
‘’’
def show_config(username, *args, **kwargs):
print(username)
print(args)
for k, v in kwargs.items():
print("{} = {}".format(k, v))
print("----------- showconfig -----------")
#show_config(host='127.0.0.1', port='1111') #takes at least 1 argument (0 given)
print("----------- 1 -----------")
show_config('root', host='127.0.0.1', port='1111')
print("----------- 2 -----------")
show_config('root', 'pass', host='127.0.0.1', port='1111')
def fn(x, y, *args, **kwargs):
print(x)
print(y)
print(args)
print(kwargs)
print("----------- fn -----------")
fn(3, 5, 7, 9, 10, a=1, b='py')
print("----------- 1 -----------")
fn(3, 5)
print("----------- 2 -----------")
fn(3, 5, 7)
print("----------- 3 -----------")
fn(3, 5, a=1, b='py')
print("----------- 4 -----------")
fn(7, 9, y=5, x=3, a=1, b='py') #fn() got multiple values for keyword argument 'y'
print("----------- fn -----------")
‘’’
keyword-only 参数(python3): 在一个位置可变参数后,出现的普通参数.
‘’’
def fn2(*args, x):
print(x)
print(args)
print("----------- fn2 -----------")
fn(3, 5)
print("----------- 1 -----------")
fn(3, 5, 7)
print("----------- 2 -----------")
fn(3, 5, x=7) # args可以看作已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参
def fn3(*, x, y): # *之后,普通形参都变成了必须给出的 keyword-only 参数
print(x, y)
print("----------- fn3 -----------")
fn3(3, 5) #takes 0 positional arguments but 2 were given
fn3(6, x=4, y=7) # takes 0 positional arguments but 1 positional argument(and 2 keyword-only arguments) given