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"""