1. 参数基础
函数参数是向函数传递数据的主要方式,Python 提供了多种参数传递机制。
基本用法
def greet(name): # name 是形式参数print(f"Hello, {name}!")greet("Alice") # "Alice" 是实际参数
使用场景:当函数需要外部数据来完成其操作时
2. 参数类型
2.1 位置参数 (Positional Arguments)
最常见的参数类型,按位置顺序传递
def power(base, exponent):return base ** exponentprint(power(2, 3)) # 8
最佳实践:
- 将最重要的参数放在前面
- 避免超过5个位置参数,否则考虑使用对象或字典
2.2 关键字参数 (Keyword Arguments)
通过参数名指定,不依赖位置
print(power(exponent=3, base=2)) # 8
优势:
- 提高代码可读性
- 允许跳过某些参数
2.3 默认参数 (Default Arguments)
定义函数时指定默认值
def power(base, exponent=2): # exponent默认为2return base ** exponentprint(power(3)) # 9
print(power(3, 3)) # 27
重要规则:
- 默认参数只计算一次(对于可变对象要特别注意)
- 默认参数应放在参数列表最后
2.4 可变参数
2.4.1 *args - 可变位置参数
接收任意数量的位置参数,打包为元组
def sum_all(*numbers):return sum(numbers)print(sum_all(1, 2, 3)) # 6
使用场景:不确定需要接收多少参数时
2.4.2 **kwargs - 可变关键字参数
接收任意数量的关键字参数,打包为字典
def print_info(**info):for key, value in info.items():print(f"{key}: {value}")print_info(name="Alice", age=25)
最佳实践:常用于包装函数或配置参数传递
3. 参数解包
3.1 列表/元组解包 (*)
def func(a, b, c):print(a, b, c)args = [1, 2, 3]
func(*args) # 1 2 3
3.2 字典解包 (**)
kwargs = {'a': 1, 'b': 2, 'c': 3}
func(**kwargs) # 1 2 3
应用场景:从其他函数获取参数后传递
4. 参数传递机制
Python 使用"对象引用传递"(按共享传参)
def modify_list(lst):lst.append(4) # 修改会影响原对象my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # [1, 2, 3, 4]
重要特性:
- 不可变对象(数字、字符串、元组)表现为"按值传递"
- 可变对象(列表、字典)表现为"按引用传递"
5. 类型提示 (Python 3.5+)
def greeting(name: str, age: int = 18) -> str:return f"{name} is {age} years old"
优势:
- 提高代码可读性
- IDE 能提供更好的代码补全和检查
- 可使用 mypy 进行静态类型检查
6. 参数最佳实践
- 保持参数数量合理:理想情况下不超过5个
- 使用关键字参数提高可读性,特别是布尔参数
- 避免可变默认参数:默认值应为不可变对象
- 合理使用类型提示:特别是公共API
- 参数顺序:位置参数 → 默认参数 → *args → **kwargs
7. 高级技巧
仅限关键字参数
def func(a, b, *, c, d): # c和d必须用关键字传递passfunc(1, 2, c=3, d=4) # 正确
func(1, 2, 3, 4) # 错误
参数注解
def func(a: 'description', b: int = 5) -> 'return description':pass
应用:文档生成或参数验证框架