当前位置: 首页 > news >正文

【python基础知识】 *args, **kwargs介绍

文章目录

    • 1. `*args`:可变数量的位置参数
    • 2. `**kwargs`:可变数量的关键字参数
    • 3. 组合使用 `*args` 和 `**kwargs`
    • 4. 参数解包(Unpacking)
    • 5. 常见应用场景
      • (1)装饰器
      • (2)继承中传递参数
    • 总结

在 Python 中, *args**kwargs 是函数定义时用于处理可变数量参数的特殊语法。它们允许函数接受任意数量的位置参数( *args)和关键字参数( **kwargs),提供了极大的灵活性。以下是详细介绍:

1. *args:可变数量的位置参数

作用

  • 允许函数接受任意数量的位置参数(即不带关键字的参数)。
  • 这些参数在函数内部被封装为一个元组(tuple)。

语法

def function(*args):# args 是一个包含所有位置参数的元组for arg in args:print(arg)# 调用示例
function(1, 2, 3)  # 输出: 1 2 3

示例

def sum_numbers(*args):total = 0for num in args:total += numreturn totalprint(sum_numbers(1, 2, 3))       # 输出: 6
print(sum_numbers(10, 20, 30, 40)) # 输出: 100

2. **kwargs:可变数量的关键字参数

作用

  • 允许函数接受任意数量的关键字参数(即带有关键字的参数)。
  • 这些参数在函数内部被封装为一个字典(dict)。

语法

def function(**kwargs):# kwargs 是一个包含所有关键字参数的字典for key, value in kwargs.items():print(f"{key}: {value}")# 调用示例
function(name="Alice", age=30)  # 输出: name: Alice, age: 30

示例

def print_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_info(name="Bob", city="New York", job="Engineer")
# 输出:
# name: Bob
# city: New York
# job: Engineer

3. 组合使用 *args**kwargs

函数可以同时使用 *args**kwargs,但顺序必须是:

  1. 普通参数
  2. *args
  3. **kwargs

示例

def example(a, b, *args, **kwargs):print(f"a: {a}, b: {b}")  # 普通参数print(f"args: {args}")    # 位置参数元组print(f"kwargs: {kwargs}") # 关键字参数字典example(1, 2, 3, 4, name="Charlie", age=25)
# 输出:
# a: 1, b: 2
# args: (3, 4)
# kwargs: {'name': 'Charlie', 'age': 25}

4. 参数解包(Unpacking)

*** 也可以在函数调用时用于解包可迭代对象或字典:

  • * 用于解包列表、元组或其他可迭代对象为位置参数。
  • ** 用于解包字典为关键字参数。

示例

def add(a, b, c):return a + b + cnumbers = [1, 2, 3]
print(add(*numbers))  # 等价于 add(1, 2, 3),输出: 6person = {"name": "Dave", "age": 35}
def greet(name, age):print(f"Hello, {name}! You are {age}.")greet(**person)  # 等价于 greet(name="Dave", age=35)

5. 常见应用场景

(1)装饰器

捕获被装饰函数的所有参数:

def my_decorator(func):def wrapper(*args, **kwargs):print("Before function call")result = func(*args, **kwargs)print("After function call")return resultreturn wrapper@my_decorator
def say_hello(name):print(f"Hello, {name}!")say_hello("Eve")  # 输出: Before, Hello Eve, After

(2)继承中传递参数

子类调用父类的 __init__ 方法:

class Parent:def __init__(self, name, **kwargs):self.name = nameclass Child(Parent):def __init__(self, age, *args, **kwargs):super().__init__(*args, **kwargs)  # 传递所有参数给父类self.age = agec = Child(age=10, name="Frank")
print(c.name, c.age)  # 输出: Frank 10

总结

语法作用函数内部类型调用时的作用
*args接收任意数量的位置参数元组(tuple)解包可迭代对象为位置参数
**kwargs接收任意数量的关键字参数字典(dict)解包字典为关键字参数

注意

  • argskwargs 只是约定俗成的名称,实际可使用任意合法变量名(如 *params**options)。
  • *args**kwargs 使函数更加灵活,但过度使用会降低代码可读性。建议根据实际需求合理使用。
http://www.lqws.cn/news/186823.html

相关文章:

  • 一篇文章实现Android图片拼接并保存至相册
  • 深入了解linux系统—— 进程池
  • Redis哨兵模式
  • CSS 性能优化
  • 微信小程序动态效果实战指南:从悬浮云朵到丝滑列表加载
  • 密码学基础——SM4算法
  • spring重试机制
  • 一种全新的非对称加密算法
  • 从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
  • 金融系统渗透测试
  • 交易所系统攻坚:高并发撮合引擎与合规化金融架构设计
  • pe文件结构(TLS)
  • 字节推出统一多模态模型 BAGEL,GPT-4o 级的图像生成能力直接开源了!
  • Linux(线程控制)
  • python八股文算法:三数之和
  • 实践提炼,EtherNet/IP转PROFINET网关实现乳企数字化工厂增效
  • 正则持续学习呀
  • B站的视频怎么下载下来——Best Video下载器
  • Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
  • 2025年- H73-Lc181--22.括号生成(回溯,组合)--Java版
  • Git仓库的创建
  • 2025/6/6—halcon知识点总结
  • c++ set与multiset的介绍
  • SOC-ESP32S3部分:32-LVGL显示框架
  • 【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
  • 从零实现STL哈希容器:unordered_map/unordered_set封装详解
  • 在 Kali 上打造渗透测试专用的 VSCode 环境
  • 单芯片电流采用电路分享
  • 基于nacos2.5.1的MCP服务端微服务项目开发环境配置简介
  • Komiko 视频到视频功能炸裂上线!