你有没有遇到过这些烦恼?
写Python函数时,是不是经常遇到这些问题:
如果你点头了,那这篇文章就是为你准备的。掌握了*args
和**kwargs
,你的Python函数将变得无比灵活,代码质量直接上一个台阶。
什么是*args和**kwargs?
简单来说:
听起来抽象?看例子就明白了。
*args:处理可变数量的位置参数
基础用法
def my_sum(*args):
"""计算任意数量数字的和"""
total=0
for num in args:
total+=num
return total
# 可以传任意数量的参数
print(my_sum(1, 2, 3)) # 6
print(my_sum(1, 2, 3, 4, 5)) # 15
print(my_sum(10)) # 10
print(my_sum()) # 0
实际应用:日志函数
def log_info(*messages):
"""打印多条日志信息"""
import datetime
timestamp=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
for message in messages:
print(f"[{timestamp}] INFO: {
message}")
# 使用示例
log_info("程序开始运行")
log_info("连接数据库成功", "开始处理数据", "准备生成报告")
与普通参数结合
def greet(name, *hobbies):
"""问候函数,可以介绍多个爱好"""
print(f"你好,{name}!")
if hobbies:
hobby_list="、".join(hobbies)
print(f"听说你喜欢:{hobby_list}")
greet("小明") # 你好,小明!
greet("小红", "读书") # 你好,小红!听说你喜欢:读书
greet("小李", "编程", "游戏", "旅行") # 你好,小李!听说你喜欢:编程、游戏、旅行
**kwargs:处理可变数量的关键字参数
基础用法
def create_user(
**kwargs):
"""创建用户,接受任意用户信息"""
print("创建用户信息:")
for key, value in kwargs.items():
print(f" {key}: {value}")
# 可以传任意关键字参数
create_user(name="张三", age=25, city="北京")
create_user(name="李四", email="lisi@example.com", phone="13800138000")
实际应用:数据库查询
def search_products(**filters):
"""根据不同条件搜索商品"""
conditions= []
for field, value in filters.items():
conditions.append(f"{field} = '{value}'")
if conditions:
sql=f"SELECT * FROM products WHERE {
' AND '.join(conditions)}"
else:
sql="SELECT * FROM products"
print(f"生成SQL: {sql}")
return sql
# 灵活的搜索条件
search_products(category="手机", price_range="1000-3000")
search_products(brand="Apple", color="黑色", storage="256GB")
search_products() # 查询所有商品
同时使用*args和**kwargs
万能函数包装器
def smart_function(*args, **kwargs):
"""一个万能的函数"""
print("位置参数:")
for i, arg in enumerate(args):
print(f" 参数{i+1}: {arg}")
print("关键字参数:")
for key, valueinkwargs.items():
print(f" {key}: {value}")
smart_function(1, 2, 3, name="测试", mode="debug")
# 输出:
# 位置参数:
# 参数1: 1
# 参数2: 2
# 参数3: 3
# 关键字参数:
# name: 测试
# mode: debug
函数装饰器应用
import time
import functools
def timer(func):
"""计时装饰器"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time=time.time()
result=func(*args, **kwargs)
end_time=time.time()
print(
f"{func.__name__} 执行时间: {end_time-start_time:.4f}秒")
return result
return wrapper
@timer
def complex_calculation(n, method="fast"):
"""复杂计算函数"""
total=sum(i**2 for i in range(n))
return total
# 装饰器可以处理任意参数的函数
result=complex_calculation(10000, method="precise")
参数传递的技巧
解包参数
def multiply(a, b, c):
"""三个数相乘"""
return a*b*c
# 用*解包列表/元组
numbers= [2, 3, 4]
result=multiply(*
numbers) # 等同于 multiply(2, 3, 4)
print(result) # 24
# 用**解包字典
def introduce(name, age, city):
print(f"我是{name},{age}岁,住在{city}")
info= {"name": "王五", "age": 30, "city": "上海"}
introduce(**info) # 等同于 introduce(name="王五", age=30, city="上海")
常见错误和注意事项
1. 参数顺序很重要
# ✅ 正确的参数顺序
def correct_function(required_arg, *args, default_arg="default", **kwargs):
pass
# ❌ 错误的参数顺序(会报语法错误)
# def wrong_function(*args, required_arg, **kwargs):
# pass
2. 避免可变默认参数陷阱
# ❌ 危险的写法
def
add_item(item, target_list=[]):
target_list.append(item)
return target_list
# ✅ 正确的写法
def add_item(item, target_list=None):
if target_list is None:
target_list= []
target_list.append(item)
return target_list
3. 性能考虑
import time
def performance_test(*args):
"""大量参数的性能测试"""
start=time.time()
# 直接遍历args(推荐)
total=sum(args)
end=time.time()
print(f"处理{len(args)}个参数,耗时: {end-start:.6f}秒")
return
total
# 测试大量参数
large_numbers=list(range(100000))
result=performance_test(*large_numbers)
*args
和**kwargs
是Python函数设计的核心武器:
灵活性:让函数能处理可变数量的参数
可扩展性:不用修改函数签名就能添加新功能
代码复用:一个函数处理多种场景
API设计:创建更友好的接口
最佳实践
学习建议
从简单开始:先掌握基础用法,再学高级技巧
多写多练:在实际项目中尝试使用
阅读源码:看看知名库是如何使用的
关注性能:大量参数时要考虑效率
掌握了*args
和**kwargs
,你就拥有了编写高质量Python函数的超能力!
对Python,AI,自动化办公提效,副业发展等感兴趣的伙伴们,扫码添加逍遥,限免交流群
备注【成长交流】