在 Python 编程中,函数是组织代码、提高复用性的基本单元。而“参数”是函数与外界交互的关键桥梁。理解函数参数的不同形式及其使用规则,有助于编写更灵活、清晰和健壮的代码。

一、五种函数参数的形式

Python 中的函数参数主要包括以下几类:

正确的顺序:

位置参数 → 默认参数 → *args → 命名关键字参数 → **kwargs

示例:

def example(a, b=2, *args, c, d=4, **kwargs):
    ...

二、五种参数详细讲解

1、位置参数

位置参数(Positional Arguments)最常见的参数形式之一,参数顺序决定了值的匹配关系。

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

greet("Alice", "Hello")  # 输出:Hello, Alice!

调用时按顺序传入参数即可。

2、默认参数

默认参数(Default Arguments)指的是为某些参数设定默认值,在调用时可以省略这些参数。

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

greet("mediaTEA")                  # 输出:Hello, mediaTEA!
greet("mediaTEA", "Good morning")  # 输出:Good morning, mediaTEA!

默认值在函数定义时就被计算并固定,不会在每次调用时重新初始化。如果默认值是可变对象(如列表或字典),所有调用共享同一个对象,容易造成逻辑错误。

错误示例:

def add_item(item, lst=[]):  # 错误示范:共享一个默认列表
    lst.append(item)
    return lst

期望输出:

print(add_item(1))  # 期望输出:[1]
print(add_item(2))  # 期望输出:[2]

实际输出:

print(add_item(1))  # [1]
print(add_item(2))  # [1, 2]
print(add_item(3))  # [1, 2, 3]

修正写法:

def add_item(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst

3、可变位置参数

可变位置参数(Variable Position Arguments,*args)用于接收多个额外位置参数,以元组形式传入。

def sum_all(*numbers):
    total = sum(numbers)
    print(f"Sum = {total}")

sum_all(1, 2, 3, 4)  # 输出:Sum = 10

也可以通过 * 运算符解包序列传入:

nums = [10, 20, 30]
sum_all(*nums)  # 输出:Sum = 60

4、仅限关键字参数

仅限关键字参数(Keyword-only Arguments),也称“命名关键字参数”,Python 3 特性,若函数定义中出现了 *,其后的参数只能通过关键字传参。

def register(name, *, city, age):
    print(f"{name} lives in {city}, age {age}.")

register("Alice", city="Beijing", age=22)  # 正确
# register("Alice", "Beijing", 22)  # 错误:city 和 age 必须显式写出参数名

调用时必须显式写出参数名。这种方式可提升函数调用的可读性和安全性。

也可以为 * 之后的关键字参数设置默认值。

def greet(name, *, mood="happy"):
    print(f"Hello, {name}! You seem {mood} today.")
    
greet("Alice")                   # Hello, Alice! You seem happy today.
greet("Bob", mood="excited")     # Hello, Bob! You seem excited today.

5、可变关键字参数

可变关键字参数(Variable Keyword Arguments,**kwargs)用于接收任意数量的关键字参数,形式上是一个字典。

def print_profile(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

print_profile(name="mediaTEA", age=7, city="Changsha")

也可以通过 ** 运算符解包字典传参:

data = {"name": "xiao hong", "age": 18}
print_profile(**data)

三、综合示例

def demo(a, b=2, *args, c=3, **kwargs):
    print("a =", a)
    print("b =", b)
    print("args =", args)
    print("c =", c)
    print("kwargs =", kwargs)

demo(10, 20, 30, 40, c=50, d=60, e=70)
# 解释:a=10(位置1),b=20(位置2),args=(30,40),c=50(命名),其余进入 kwargs

输出结果:

a = 10
b = 20
args = (30, 40)
c = 50
kwargs = {'d': 60, 'e': 70}

结:参数顺序

先定必传(位置),再定默认(Default),星号打包(*args),限定命名(*),双星兜底(**kwargs)。

点赞有美意,赞赏是鼓励