Python函数参数类型详解¶
1. 参数类型概述¶
Python函数支持多种参数类型,使函数调用更加灵活。主要包括: - 位置参数 - 默认参数 - 关键字参数 - 可变参数
2. 位置参数(Positional Arguments)¶
位置参数是最基本的参数类型,调用时必须按照定义的顺序传递参数。
2.1 基本用法¶
def greet(first_name, last_name):
return f"Hello, {first_name} {last_name}!"
# 调用时必须按顺序传递参数
print(greet("John", "Doe")) # 输出: Hello, John Doe!
2.2 注意事项¶
- 参数数量必须匹配
- 参数顺序必须正确
- 缺少参数会引发TypeError
3. 默认参数(Default Arguments)¶
默认参数允许在函数定义时为参数指定默认值,调用时可以省略这些参数。
3.1 基本用法¶
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("Alice")) # 输出: Hello, Alice!
print(greet("Bob", "Hi")) # 输出: Hi, Bob!
3.2 注意事项¶
- 默认参数必须放在位置参数后面
- 默认值在函数定义时计算,而不是调用时
- 可变对象(如列表)作为默认值可能导致意外结果
# 错误示例:可变对象作为默认值
def add_item(item, lst=[]): # 不推荐
lst.append(item)
return lst
# 正确示例
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
4. 关键字参数(Keyword Arguments)¶
关键字参数允许通过参数名指定参数值,不必考虑参数顺序。
4.1 基本用法¶
def create_profile(name, age, city):
return f"{name} is {age} years old from {city}"
# 使用关键字参数,顺序可以不同
print(create_profile(age=25, city="Beijing", name="Tom"))
print(create_profile(name="Alice", city="Shanghai", age=30))
4.2 混合使用¶
def mixed_args(a, b, c):
return f"a={a}, b={b}, c={c}"
# 位置参数和关键字参数混合使用
print(mixed_args(1, c=3, b=2)) # 正确
# print(mixed_args(a=1, 2, 3)) # 错误:位置参数不能在关键字参数后
5. 可变参数¶
5.1 *args(可变位置参数)¶
使用*args
接收任意数量的位置参数,以元组形式存储。
def sum_all(*numbers):
"""计算所有参数的和"""
return sum(numbers)
print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5)) # 15
5.2 **kwargs(可变关键字参数)¶
使用**kwargs
接收任意数量的关键字参数,以字典形式存储。
def print_info(**info):
"""打印所有信息"""
for key, value in info.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, city="Beijing")
5.3 组合使用¶
def combined_example(a, b=10, *args, **kwargs):
print(f"a = {a}")
print(f"b = {b}")
print(f"args = {args}")
print(f"kwargs = {kwargs}")
combined_example(1, 2, 3, 4, x=100, y=200)
# 输出:
# a = 1
# b = 2
# args = (3, 4)
# kwargs = {'x': 100, 'y': 200}
6. 参数顺序规则¶
在Python函数定义中,参数必须按照以下顺序排列: 1. 位置参数 2. 默认参数 3. 可变位置参数 (args) 4. 可变关键字参数 (*kwargs)
def standard_arg_order(pos1, pos2, def1="default", *args, **kwargs):
pass
7. 实践建议¶
- 使用描述性的参数名
- 遵循Python命名规范(小写+下划线)
- 避免使用单字母参数名(除非是约定俗成的)
- 不要使用可变对象作为默认值
- 默认值应该是不可变类型
- 使用None作为可变对象的默认值占位符
- 在文档字符串中说明参数的类型和用途
- 说明参数的有效值范围
- 提供参数使用示例