写 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
小总结
- 关键字参数让传参更清晰,可跳过默认参数;
*args接收任意个位置参数,打包成元组;**kwargs接收任意个关键字参数,打包成字典。