社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python函数参数的终极武器:*args和**kwargs完全指南

A逍遥之路 • 5 天前 • 20 次点击  

你有没有遇到过这些烦恼?

写Python函数时,是不是经常遇到这些问题:

  • 不知道用户会传几个参数,只能写好多个重载函数?

  • 想要一个函数既能处理2个参数,也能处理10个参数?

  • 看别人代码里的*args**kwargs一脸懵逼?

  • 调用第三方库时,参数传递总是出错?

如果你点头了,那这篇文章就是为你准备的。掌握了*args**kwargs,你的Python函数将变得无比灵活,代码质量直接上一个台阶。

什么是*args和**kwargs?

简单来说:

  • *args 收集多余的位置参数,变成一个元组

  • **kwargs 收集多余的关键字参数,变成一个字典

听起来抽象?看例子就明白了。

*args:处理可变数量的位置参数

基础用法

def my_sum(*args):
    """计算任意数量数字的和"""
    total=0
    for num in args:
        total+=num
    return total

# 可以传任意数量的参数
print(my_sum(123))           # 6
print(my_sum(12345))     # 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 keyvalue in kwargs.items():
        print(f"  {key}{value}")

# 可以传任意关键字参数
create_user(name="张三"age=25city="北京")
create_user(name="李四"email="lisi@example.com"phone="13800138000")

实际应用:数据库查询

def search_products(**filters):
    """根据不同条件搜索商品"""
    conditions= []
    
    for fieldvalue 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 iarg in enumerate(args):
        print(f"  参数{i+1}{arg}")
    
    print("关键字参数:")
     for keyvalueinkwargs.items():
        print(f"  {key}{value}")

smart_function(123name="测试"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(nmethod="fast"):
    """复杂计算函数"""
    total=sum(i**for in range(n))
    return total

# 装饰器可以处理任意参数的函数
result=complex_calculation(10000method="precise")

参数传递的技巧

解包参数

def multiply(abc):
    """三个数相乘"""
    return a*b*c

# 用*解包列表/元组
numbers= [234]
result=multiply(* numbers)  # 等同于 multiply(2, 3, 4)
print(result)  # 24

# 用**解包字典
def introduce(nameagecity):
    print(f"我是{name}{age}岁,住在{city}")

info= {"name""王五""age"30"city""上海"}
introduce(**info)  # 等同于 introduce(name="王五", age=30, city="上海")

常见错误和注意事项

1. 参数顺序很重要

# ✅ 正确的参数顺序
def correct_function(required_arg*argsdefault_arg="default"**kwargs):
    pass

# ❌ 错误的参数顺序(会报语法错误)
# def wrong_function(*args, required_arg, **kwargs):
#     pass

2. 避免可变默认参数陷阱

# ❌ 危险的写法
def  add_item(itemtarget_list=[]):
    target_list.append(item)
    return target_list

# ✅ 正确的写法
def add_item(itemtarget_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函数设计的核心武器:

  1. 灵活性:让函数能处理可变数量的参数

  2. 可扩展性:不用修改函数签名就能添加新功能

  3. 代码复用:一个函数处理多种场景

  4. API设计:创建更友好的接口

最佳实践

  • 优先使用具体的参数名,*args**kwargs作为补充

  • 在函数文档中说明参数的含义和类型

  • 合理验证参数,避免静默错误

  • 性能敏感的场景要测试参数传递的开销

学习建议

  1. 从简单开始:先掌握基础用法,再学高级技巧

  2. 多写多练:在实际项目中尝试使用

  3. 阅读源码:看看知名库是如何使用的

  4. 关注性能:大量参数时要考虑效率

掌握了*args**kwargs,你就拥有了编写高质量Python函数的超能力!

转发、收藏、在看,是对作者最大的鼓励!👏
关注逍遥不迷路,Python知识日日补!






           对Python,AI,自动化办公提效,副业发展等感兴趣的伙伴们,扫码添加逍遥,限免交流群

备注【成长交流】

图片

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184060
 
20 次点击