问题
构造一个可接受任意数量参数的函数。
解决方案
为了函数接受任意数量的位置参数,使用一个以一个星号(*)
开头的参数。例如:
def avg(first, *args):
return (first + sum(args)) / (1 + len(args))
print(avg(1, 2))
1.5
print(avg(1, 2, 3, 4))
2.5
在这个例子中,agr
参数是由所有其他位置参数组成的元组,在代码中把它当成了一个序列来进行后续的计算。
为了接受任意数量的关键字参数,使用一个以2个星号(**)
开头的参数。例如:
import html
def make_element(name, value, **kwargs):
key_vals = [' %s = "%s"' % item for item in kwargs.items()]
attrs = ''.join(key_vals)
element = f"""<{name}{attrs}>{value}{name}>"""
return element
print(make_element('item', 'Albatross', size='large', quantity=6))
- Albatross
print(make_element('p', ''))
在这里,kwargs
是一个包含所有被传入进来的关键字参数的字典。
函数能同时接受任意数量的位置参数和关键字参数,可以同时使用*
和**
。比如:
def anyargs(*args, **kwargs):
print(args) # A tuple
print(kwargs) # A dict
使用这个函数时,所有 位置参数 会被放到args元组
中,所有 关键字参数 会被放到kwargs字典
中。
讨论
位置参数 (*)
只能出现在函数的最后一个位置参数后面,而 关键字参数 (**)
只能出现在最后一个参数。 位置参数 (*)
后面仍然可以定义其他参数。这种参数就是我们所说的强制关键字参数,比如:
def a(x, *args, y):
pass
def b(x, *args, y, **kwargs):
pass