Python 中函数的参数

文章目录

必选参数

初学者必会的参数类型,也是 Python 函数参数传递最基础的方式。函数在定义中要求传入,调用时必须传入的参数就是必选参数。

1def foo(aParam, bParam):
2    print(aParam, bParam)
3
4foo(114514, 1919810)
5
6# output: 114514 1919810

函数定义中要求传入两个参数,那么在调用时就必须传入两个参数,如果出入过多或者过少参数均会报错。

 1def foo(aParam, bParam):
 2    print(aParam, bParam)
 3
 4foo(114514)
 5
 6"""
 7output:
 8Traceback (most recent call last):
 9  File "/home/jackgdn/python-script/test.py", line 4, in <module>
10    foo(114514)
11TypeError: foo() missing 1 required positional argument: 'bParam'
12"""

传入过少参数

 1def foo(aParam, bParam):
 2    print(aParam, bParam)
 3
 4foo(114514, 1919810, "Hello, World!")
 5
 6"""
 7Traceback (most recent call last):
 8  File "/home/jackgdn/python-script/test.py", line 4, in <module>
 9    foo(114514, 1919810, "Hello, world!")
10TypeError: foo() takes 2 positional arguments but 3 were given
11"""

传入过多参数

默认参数

在定义函数时给出默认值的参数,被称为默认参数。如果在调用函数时传入了默认参数,则默认参数被覆盖为传入的值;若没有传入,则默认参数为默认值。

1def foo(aParam, bParam=1919810):
2    print(aParam, bParam)
3
4foo(114514)
5
6# output: 114514 1919810

不传入参数,函数使用默认参数

1def foo(aParam, bParam=1919810):
2    print(aParam, bParam)
3
4foo(114514, "Hello, world!")
5
6# output: 114514 Hello, world!

重要

当默认参数为可变对象时,该对象会在函数的多次调用之间公用。

对于上面这个问题,我们不妨举一个例子:

 1def append_to(element, values=[]):
 2    values.append(element)
 3    return values
 4
 5print(append_to(10))
 6print(append_to(20))
 7
 8# output: 
 9# [10]
10# [10, 20]

在这段代码中,values 作为默认参数,默认为一个空列表。当这一函数被多次调用时,上一次得到的函数结果被保留,导致下一次调用函数时,得到的不是我们想要的结果。

如果想要修复这个 bug,可以将代码改写为下面的形式:

 1def append_to(element, values=None):
 2    if values is None:
 3        values = list()
 4    values.append(element)
 5    return values
 6
 7print(append_to(10))
 8print(append_to(20))
 9
10# output:
11# [10]
12# [20]

可变参数

可变参数在声明函数时一般写作 *args,可变参数的数量时可变的,可以是任意多个(包括 0 个)。可变参数中的所有参数都会存储到一个元组中。

 1def foo(param, *args):
 2    print(param)
 3    print(type(args))
 4    print(args)
 5
 6foo(114514, 1919810, "Hello, world!")
 7
 8# output:
 9# 114514r
10# <class 'tuple'>
11# (1919810, 'Hello, world!')

重要

函数声明时,若可变参数的数量多于一个,程序会抛出 SyntaxError

这也很好理解。因为函数会将多个传入的参数存储到一个元组中(如果可变参数数量为 0,则存储到一个空元组中),如果一个函数定义了多个可变参数,则无法区分存入的多个参数应当存入哪一个可变参数

关键字参数

关键字参数在声明函数中一般写作 **kwargs,在调用函数时,以键值对的格式传入参数,随后键值对会存储为字典格式。和可变参数一样,如果传入的关键字参数数量为 0,则字典为空字典。

 1def foo(param, *args, **kwargs):
 2    print(type(param), type(args), type(kwargs))
 3    print(param)
 4    print(args)
 5    print(kwargs)
 6
 7foo(141892, 1919810, "Hello, world!", name='jack_gdn', university='NEFU')
 8
 9"""
10output: 
11<class 'int'> <class 'tuple'> <class 'dict'>
12141892
13(1919810, 'Hello, world!')
14{'name': 'jack_gdn', 'university': 'NEFU'}
15"""