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

Python中*args和**kwargs

*args 的基本用法

*args 允许函数接收任意数量的位置参数,这些参数会被自动打包成一个元组。在函数内部,可以通过遍历元组来处理这些参数。

def sum_numbers(*args):print("args 类型:", type(args))  # <class 'tuple'>total = 0for num in args:total += numreturn total# 调用函数时可以传入任意数量的参数
print(sum_numbers(1, 2, 3))  # 6
print(sum_numbers(10, 20, 30, 40))  # 100
print(sum_numbers())  # 0(可以传入0个参数)

**kwargs 的基本用法

**kwargs 用于接收任意数量的关键字参数,这些参数会被自动收集到一个字典中,其中键是参数名,值是对应的参数值。

def show_info(**kwargs):print("kwargs 类型:", type(kwargs))  # <class 'dict'>for key, value in kwargs.items():print(f"{key}: {value}")# 调用函数时传入关键字参数
show_info(name="Alice", age=30, city="New York")
# 输出:
# name: Alice
# age: 30
# city: New Yorkshow_info(product="Laptop", price=999)
# 输出:
# product: Laptop
# price: 999

混合使用 *args 和 **kwargs

在函数定义中,可以同时使用 *args 和 **kwargs,但必须按照以下顺序:普通参数、*args、**kwargs。

def mixed_function(arg1, arg2, *args, **kwargs):print("Fixed arguments:", arg1, arg2)print("Additional positional arguments:", args)print("Additional keyword arguments:", kwargs)mixed_function(1, 2, 3, 4, key1="value1", key2="value2")

参数解包的应用

在调用函数时,可以使用 * 和 ** 来解包列表/元组和字典,将其内容作为参数传递给函数。

def add(x, y, z):return x + y + znumbers = [10, 20, 30]
print(add(*numbers))  # 等价于 add(10, 20, 30) → 60def person_info(name, age):print(f"{name} is {age} years old")info = {"name": "Charlie", "age": 25}
person_info(** info)  # 等价于 person_info(name="Charlie", age=25)

实际应用场景

*args 和 **kwargs 在装饰器、函数包装、可变参数处理等场景中非常有用。例如,在装饰器中,通常使用 *args 和 **kwargs 来传递任意参数给被装饰的函数。

def decorator(func):def wrapper(*args, **kwargs):print("Before function call")result = func(*args, **kwargs)print("After function call")return resultreturn wrapper@decorator
def greet(name):print(f"Hello, {name}!")greet("Alice")

http://www.dtcms.com/a/335316.html

相关文章:

  • 基于springboot的在线视频教育管理系统设计与实现(源码+文档+部署讲解)
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • 概率论基础教程第3章条件概率与独立性(二)
  • 如何解决C盘存储空间被占的问题,请看本文
  • C语言零基础第18讲:自定义类型—结构体
  • 9.从零开始写LINUX内核——设置中断描述符表
  • duiLib 实现鼠标拖动标题栏时,窗口跟着拖动
  • 深入了解 swap:作用、局限与分区建立
  • Linux sar命令详细使用指南
  • Effective C++ 条款45:运用成员函数模板接受所有兼容类型
  • Day2--滑动窗口与双指针--2090. 半径为 k 的子数组平均值,2379. 得到 K 个黑块的最少涂色次数,2841. 几乎唯一子数组的最大和
  • Linux软件编程:线程间通信
  • 【FreeRTOS】队列集
  • MySQL 插入数据提示字段超出范围?一招解决 DECIMAL 类型踩坑
  • 第三十七天(js前端数据加密和混淆)
  • Fixture Caliper 工具
  • GRPO(Group Relative Policy Optimization)公式速览
  • Scala面试题及详细答案100道(11-20)-- 函数式编程基础
  • 嵌入式软件架构设计之九: 双机通信之通信方式
  • 排列与组合
  • 超详细yolov8/11-obb旋转框全流程概述:配置环境、数据标注、训练、验证/预测、onnx部署(c++/python)详解
  • STM32标准库学习笔记
  • MM-Spatial和Spatial-MLLM论文解读
  • 【力扣-多数元素 JAVA/Python】
  • CD4+ T细胞激活区分抗PD-L1联合抗CTLA4疗法与单药抗PD-L1治疗的响应差异-空间最近邻分析
  • 民法学学习笔记(个人向) Part.5
  • 【最后203篇系列】032 OpenAI格式调用多模型实验
  • 39.离散化与哈希
  • 数据结构:二叉树的遍历 (Binary Tree Traversals)
  • 杂记 03