Python 函数参数通关秘籍:别再只会写固定参数了!

46 阅读2分钟

写 Python 函数时,你是不是总局限于 “固定参数个数”?遇到需要灵活传参的场景就头大?这 3 个进阶偏基础的参数技巧,帮你写出万能又优雅的函数,新手也能秒懂!

1. 位置参数 vs 关键字参数:传参更灵活,可读性拉满

函数参数不止 “按顺序传” 一种方式!关键字参数能让代码更易读,还能跳过默认参数,再也不用记参数顺序了~

# 定义一个计算商品总价的函数
def calculate_total(price, quantity, discount=0.0):
    """price: 单价, quantity: 数量, discount: 折扣(默认无折扣)"""
    return price * quantity * (1 - discount)

# 传统写法:位置参数(按顺序传,容易记混)
total1 = calculate_total(99, 2)
print(total1)  # 198.0(无折扣)

# 进阶写法1:关键字参数(明确参数含义,顺序无关)
total2 = calculate_total(price=99, quantity=2, discount=0.1)
total3 = calculate_total(discount=0.1, quantity=2, price=99)  # 顺序打乱也没问题
print(total2)  # 178.2(9折)
print(total3)  # 178.2

# 进阶写法2:混合使用(位置参数在前,关键字参数在后)
total4 = calculate_total(99, 2, discount=0.2)
print(total4)  # 158.4(8折)

2. *args:接收任意个位置参数,告别 “参数不够用”

想让函数支持不确定个数的位置参数?用 *args 就能把所有位置参数打包成元组,灵活处理多参数场景!

# 需求:计算任意多个数字的总和
def sum_all(*args):
    print(type(args))  # <class 'tuple'>,args 是元组类型
    total = 0
    for num in args:
        total += num
    return total

# 传任意个数的参数都可以
print(sum_all(1, 2))  # 3
print(sum_all(1, 2, 3, 4))  # 10
print(sum_all(5, 6, 7, 8, 9))  # 35

# 拓展:结合固定参数使用(固定参数在前)
def sum_with_base(base, *args):
    return base + sum(args)

print(sum_with_base(10, 1, 2, 3))  # 16(10+1+2+3)

3. **kwargs:接收任意个关键字参数,实现 “万能配置”

需要灵活传递配置项?**kwargs 能把所有关键字参数打包成字典,适合处理不确定的配置参数!

# 需求:打印用户信息,支持任意额外字段
def print_user_info(name, age, **kwargs):
    print(type(kwargs))  # <class 'dict'>,kwargs 是字典类型
    info = f"姓名:{name},年龄:{age}"
    # 遍历额外的关键字参数
    for key, value in kwargs.items():
        info += f",{key}{value}"
    print(info)

# 只传必填参数
print_user_info("张三", 25)  # 姓名:张三,年龄:25

# 传必填参数+额外配置
print_user_info("李四", 30, city="北京", job="Python开发")  
# 输出:姓名:李四,年龄:30,city:北京,job:Python开发

print_user_info("王五", 28, gender="男", hobby="爬山", salary=15000)
# 输出:姓名:王五,年龄:28,gender:男,hobby:爬山,salary:15000

小总结

  1. 关键字参数让传参更清晰,可跳过默认参数;
  2. *args 接收任意个位置参数,打包成元组;
  3. **kwargs 接收任意个关键字参数,打包成字典。