函数参数类型 #

Python函数支持多种参数类型,提供了极大的灵活性。

一、位置参数 #

位置参数是最基本的参数类型,按位置顺序传递。

python
def greet(name, message):
    print(f"{message}, {name}!")

greet("Tom", "Hello")  # Hello, Tom!

二、关键字参数 #

关键字参数通过参数名指定,顺序可以任意。

python
def greet(name, message):
    print(f"{message}, {name}!")

greet(name="Tom", message="Hello")  # Hello, Tom!
greet(message="Hi", name="Jerry")    # Hi, Jerry!

# 混合使用:位置参数必须在前
greet("Tom", message="Hello")  # 正确
# greet(name="Tom", "Hello")   # 错误

三、默认参数 #

python
def greet(name, message="Hello"):
    print(f"{message}, {name}!")

greet("Tom")              # Hello, Tom!
greet("Tom", "Hi")        # Hi, Tom!
greet("Tom", message="Hey")  # Hey, Tom!

注意:默认参数的陷阱

python
# 错误:使用可变对象作为默认值
def add_item(item, items=[]):
    items.append(item)
    return items

print(add_item(1))  # [1]
print(add_item(2))  # [1, 2] - 不是预期的[2]!

# 正确:使用None作为默认值
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

四、可变位置参数 (*args) #

python
def add(*numbers):
    return sum(numbers)

print(add(1, 2, 3))     # 6
print(add(1, 2, 3, 4))  # 10

# args是元组
def print_args(*args):
    print(type(args))  # <class 'tuple'>
    for arg in args:
        print(arg)

# 与普通参数结合
def greet(greeting, *names):
    for name in names:
        print(f"{greeting}, {name}!")

greet("Hello", "Tom", "Jerry", "Alice")

五、可变关键字参数 (**kwargs) #

python
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Tom", age=25, city="Beijing")

# kwargs是字典
def get_info(**kwargs):
    return kwargs

info = get_info(name="Tom", age=25)
print(info)  # {'name': 'Tom', 'age': 25}

六、参数顺序 #

参数定义的顺序必须是:

  1. 位置参数
  2. 默认参数
  3. *args
  4. 仅关键字参数
  5. **kwargs
python
def function(a, b, c=3, *args, d=4, e, **kwargs):
    print(f"a={a}, b={b}, c={c}")
    print(f"args={args}")
    print(f"d={d}, e={e}")
    print(f"kwargs={kwargs}")

# Python 3.8+: 仅位置参数
def func(a, b, /, c, d, *, e, f):
    pass
# a, b: 仅位置
# c, d: 位置或关键字
# e, f: 仅关键字

七、仅位置参数 (Python 3.8+) #

python
def greet(name, /, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("Tom")           # 正确
greet("Tom", "Hi")     # 正确
# greet(name="Tom")    # 错误:不能作为关键字

八、仅关键字参数 #

python
def greet(*, name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet(name="Tom")           # 正确
greet(name="Tom", greeting="Hi")  # 正确
# greet("Tom")              # 错误:必须使用关键字

九、参数解包 #

python
def add(a, b, c):
    return a + b + c

# 列表/元组解包
numbers = [1, 2, 3]
print(add(*numbers))  # 6

# 字典解包
params = {"a": 1, "b": 2, "c": 3}
print(add(**params))  # 6

十、总结 #

参数类型 语法 示例
位置参数 name def f(a, b):
默认参数 name=default def f(a=1):
可变位置 *args def f(*args):
可变关键字 **kwargs def f(**kwargs):
仅位置参数 / def f(a, /):
仅关键字参数 * def f(*, a):
最后更新:2026-03-16