先前的联系中,函数的参数,尤其是带星号的参数,没怎么复习,这里再复习下
当参数被用在函数内部时, 星号将一组可变数量的位置参数集合成参数值的元组。在下面
的例子中args 是传入到函数print_args() 的参数值的元组:
>>> def print_args(*args):
... print('Positional argument tuple:', args)
...
无参数调用函数,则什么也不会返回:
>>> print_args()
Positional argument tuple: ()
给函数传入的所有参数都会以元组的形式返回输出:
>>> print_args(3, 2, 1, 'wait!', 'uh...')
Positional argument tuple: (3, 2, 1, 'wait!', 'uh...')
这样的技巧对于编写像print() 一样接受可变数量的参数的函数是非常有用的。如果你的
函数同时有限定的位置参数,那么*args 会收集剩下的参数:
>>> def print_more(required1, required2, *args):
... print('Need this one:', required1)
... print('Need this one too:', required2)
... print('All the rest:', args)
...
>>> print_more('cap', 'gloves', 'scarf', 'monocle', 'mustache wax')
Need this one: cap
Need this one too: gloves
All the rest: ('scarf', 'monocle', 'mustache wax')
当使用* 时不需要调用元组参数args,不过这也是Python 的一个常见做法。
使用**收集关键字参数
使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字
典的值。下面的例子定义了函数print_kwargs(),然后打印输出它的关键字参数:
>>> def print_kwargs(**kwargs):
... print('Keyword arguments:', kwargs)
...
现在,使用一些关键字参数调用函数:
>>> print_kwargs(wine='merlot', entree='mutton', dessert='macaroon')
Keyword arguments: {'dessert': 'macaroon', 'wine': 'merlot', 'entree': 'mutton'}
在函数内部,kwargs 是一个字典。
如果你把带有*args 和**kwargs 的位置参数混合起来,它们会按照顺序解析。和args 一
样,调用时不需要参数kwargs,这也是常见用法。
随后一个重要概念,这本书里没讲,就是还有一个叫做 命名关键字
就是要限制你输入的关键字名字,怎么用呢?
def person(name, age, *, city, job):
print(name, age, city, job)
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
调用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given
由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。
命名关键字参数可以有缺省值,从而简化调用:
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
由于命名关键字参数city具有默认值,调用时,可不传入city参数:
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数:
def person(name, age, city, job):
# 缺少 *,city和job被视为位置参数
pass
下面看一下自己对以上做的测试,还有就是关于命名关键字参数,如果在调用函数时,没有给予分隔符*后面对应的名字,那么就会报错。