在python里写函数的时候,参数到底有哪几种、各自怎么用,是入门阶段就必须弄明白的基础问题。python的参数设计比较灵活,理解清楚之后不管是自己封装函数还是调用第三方库都会轻松很多。

python中常见的参数类型
python函数的参数从定义和调用的角度,可以分成下面几类:
- 位置参数:调用时按定义顺序传入
- 默认参数:定义时给了默认值,调用可不传
- 关键字参数:调用时用 名称=值 的方式传入
- 可变位置参数(*args):收集多余的位置参数为元组
- 可变关键字参数(**kwargs):收集多余的关键字参数为字典
位置参数和默认参数
位置参数是最普通的写法,必须按顺序传。默认参数在定义时赋值,不传就使用默认值。
def greet(name, msg='你好'):
# name是位置参数,msg是默认参数
print(f'{name},{msg}')
greet('小明') # 输出:小明,你好
greet('小红', '早啊') # 输出:小红,早啊
关键字参数怎么用
关键字参数指在调用函数时显式写出参数名,这样就不受顺序限制,代码也更好读。
def connect(host, port):
print(f'连接 {host}:{port}')
connect(port=8080, host='127.0.0.1') # 关键字参数打乱顺序也没问题
可变参数 *args 和 **kwargs
当不确定会传多少个参数时,可以用星号语法。*args 把多余位置参数收进元组,**kwargs 把多余关键字参数收进字典。
def show(*args, **kwargs):
print('位置参数:', args)
print('关键字参数:', kwargs)
show(1, 2, 3, a=10, b=20)
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'a': 10, 'b': 20}
参数定义顺序规则
如果函数里同时用到多种参数,定义顺序一般是:位置参数、默认参数、*args、普通关键字参数、**kwargs。弄错顺序会直接报语法错误。
| 顺序 | 类型 | 示例 |
|---|---|---|
| 1 | 位置参数 | def f(a, b) |
| 2 | 默认参数 | def f(a, b=2) |
| 3 | *args | def f(a, *args) |
| 4 | 关键字参数 | def f(a, *args, c) |
| 5 | **kwargs | def f(a, *args, c, **kwargs) |
在调用时使用拆包
除了定义函数,调用时也能用星号把列表或字典拆开当成参数传进去。
def add(x, y, z):
return x + y + z
nums = [1, 2, 3]
print(add(*nums)) # 列表拆包成位置参数
info = {'x': 10, 'y': 20, 'z': 30}
print(add(**info)) # 字典拆包成关键字参数
小结
python的参数体系虽然看着多,但其实核心就是位置、默认、关键字以及可变这两类收集参数。写函数时优先保证必填项用位置参数,可选配置用默认或关键字参数,需要泛化接收时用 *args 和 **kwargs。搞清楚这些,参数怎么用就不再是问题。