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

【Python】*args和**kwargs

【Python】*args和**kwargs

  • 一、*args: 接收不定数量的位置参数
    • 示例1:简单的加法计算器
    • 示例2:转发参数给另一个函数
  • 二、**kwargs: 接收不定数量的关键字参数
    • 示例3:创建用户配置文件
    • 示例4:合并多个字典
  • 三、组合使用*args和**kwargs
    • 示例5:构建RESTful API请求
  • 四、结论
  • 五、相关链接

一、*args: 接收不定数量的位置参数

在Python中,函数定义时可以通过*args接收任意数量的位置参数。
这里的星号(*)告诉解释器将所有额外的位置参数打包成一个元组传递给函数。
这使得函数可以处理比预期更多的输入,而不必提前确定参数的数量。

示例1:简单的加法计算器

def add_numbers(*args):"""计算传入的所有数字之和"""return sum(args)print(add_numbers(1, 2, 3))        # 输出: 6
print(add_numbers(10, 20, 30, 40)) # 输出: 100

在这个例子中,add_numbers函数能够接受任意数量的整数作为参数,并返回它们的总和。
这里的关键点在于*args允许我们不必为每个可能的参数都定义一个变量名,从而使函数更加通用。

示例2:转发参数给另一个函数

有时候你可能会有一个函数A需要调用另一个函数B,并且希望把所有接收到的参数直接传递给B
这时就可以使用*args

def wrapper_function(*args):print("Calling the wrapped function with:", args)result = wrapped_function(*args)  # 解包参数传递给wrapped_functionprint("Result from wrapped function:", result)return resultdef wrapped_function(*args):print("Inside wrapped_function with arguments:", args)return sum(args)wrapper_function(1, 2, 3)

这段代码展示了如何通过*args将一组未知长度的位置参数从一个函数传递到另一个函数中。
注意,在调用wrapped_function时,我们使用了*args来解包参数列表,确保每个元素都被当作单独的参数传递过去。

二、**kwargs: 接收不定数量的关键字参数

*args不同,**kwargs用于接收关键字参数,并将它们存储在一个字典里。
这意味着你可以通过键值对的形式向函数传递参数,而不仅仅是按照位置顺序。

示例3:创建用户配置文件

假设我们要创建一个函数来生成用户的个人信息卡片,该卡片可以根据提供的信息动态调整内容:

def create_user_profile(**kwargs):"""根据提供的信息创建用户资料"""profile = {}for key, value in kwargs.items():profile[key] = valuereturn profileuser_info = create_user_profile(name="Alice", age=30, city="Beijing")
print(user_info)  # 输出: {'name': 'Alice', 'age': 30, 'city': 'Beijing'}

这里,create_user_profile函数接收了多个关键字参数,并将它们保存到了名为profile的字典中。
这种方式非常适合处理那些具有可选字段的数据结构,如用户配置文件或API请求参数等。

示例4:合并多个字典

如果我们想要合并两个或更多个字典,也可以借助**kwargs来简化操作:

def merge_dicts(dict1, **kwargs):"""将多个字典合并为一个新的字典"""merged = dict1.copy()merged.update(kwargs)return mergeddict_a = {"a": 1, "b": 2}
dict_b = {"c": 3, "d": 4}merged_dict = merge_dicts(dict_a, **dict_b)
print(merged_dict)  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

此例中,merge_dicts函数首先复制了第一个字典的内容,然后使用update()方法添加了来自其他字典的所有键值对。
**kwargs在这里起到了关键作用,因为它允许我们将第二个字典的内容作为关键字参数传递给函数。

三、组合使用*args和**kwargs

当同时需要支持位置参数和关键字参数时,可以在同一个函数签名中同时包含*args**kwargs
不过要注意的是,*args总是应该出现在**kwargs之前,因为位置参数总是优先于关键字参数进行解析。

示例5:构建RESTful API请求

考虑一个模拟发送HTTP GET请求的函数,它既可以接收查询字符串形式的参数(位置参数),也可以接收表单数据或JSON负载(关键字参数):

import requestsdef make_api_request(url, *query_params, **payload):"""构建并发送API请求"""response = requests.get(url, params=query_params, json=payload)return response.json()response_data = make_api_request("https://api.example.com/data",("page", 1),("limit", 10),page_size=50,sort_by="date"
)
print(response_data)

在这个例子中,make_api_request函数既能处理URL后面的查询参数(如分页信息),也能处理POST/PUT请求体中的数据(如果有的话)。
这种灵活性对于构建复杂的Web服务接口非常有用。

四、结论

通过对*args**kwargs的理解,我们可以写出更加健壮、易于维护的Python代码。
这两个特性不仅提高了函数的复用性和适应性,还减少了硬编码参数列表带来的限制。
然而,正如前面提到的那样,过度依赖这些特性可能导致代码难以理解和调试。
因此,在设计API或公共接口时,应当权衡是否真的需要如此高的灵活性,以及这样做是否会牺牲代码的清晰度。

最后,值得注意的是,虽然**kwargs是标准做法,但在某些情况下你可能会看到有人使用**args。
实际上,**args并不是官方推荐的写法,它会引发混淆,因为它违背了约定俗成的命名规范。
始终建议使用**kwargs来表示关键字参数的收集。

五、相关链接

参考文章:

argparse — 用于命令行选项、参数和子命令的解析器

相关文章:

【Python】回调
【Python】argparse模块
【Python】request函数
【Python】yield函数
【Python】Uvicorn服务器
【Python】SSE(Server-Sent Events)
【Python】pydantic库
【Python】pip用法
【Python】Starlette框架
【Python】pip用法

相关文章:

【Python】*args和**kwargs

【Python】*args和**kwargs 一、*args: 接收不定数量的位置参数示例1:简单的加法计算器示例2:转发参数给另一个函数 二、**kwargs: 接收不定数量的关键字参数示例3:创建用户配置文件示例4:合并多个字典 三、组合使用*args和**kwar…...

使用正则表达式提取PDF文件页数的实现方案

文章目录 背景介绍实现原理代码实现1. 基础函数结构2. 页数提取逻辑3. 使用示例 正则表达式解析优点与局限性优点局限性 错误处理建议性能优化建议最佳实践建议总结参考资源 背景介绍 在Web应用开发中,我们经常需要获取上传PDF文件的页数信息。虽然可以使用pdf.js等第三方库,但…...

Android实现RecyclerView边缘渐变效果

Android实现RecyclerView边缘渐变效果 1.前言: 是指在RecyclerView中实现淡入淡出效果的边缘效果。通过这种效果,可以使RecyclerView的边缘在滚动时逐渐淡出或淡入,以提升用户体验。 2.Recyclerview属性: 2.1、requiresFading…...

springboot443旅游管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统旅游管理系统信息管理难度大,容错率低&#…...

利用git上传项目到GitHub

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一…...

Rust之抽空学习系列(四)—— 编程通用概念(下)

Rust之抽空学习系列(四)—— 编程通用概念(下) 1、函数 函数用来对功能逻辑进行封装,能够增强复用、提高代码的可读 以下是函数的主要组成部分: 名称参数返回类型函数体 1.1、函数名称 在Rust中&…...

K-Means 聚类:数据挖掘的瑞士军刀

引言 在数据科学领域,聚类算法是一种非常重要的无监督学习方法,它能够帮助我们发现数据中的自然分组或模式。其中,K-Means 聚类算法因其简单高效而成为最常用的聚类算法之一。无论是市场细分、社交网络分析,还是图像分割等领域&a…...

项目练习:若依-前端项目的目录结构介绍

文章目录 一、目录截图二、目录讲解 一、目录截图 二、目录讲解 1、首先,我们可以看到,这个VUE项目,只有一个App.vue,所以,它是一个单页面系统。 这个App.vue是根组件,root组件。 2、public目录 在Vue 3.…...

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献(CAJPDF)批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件,格式为es6文件,需使用知网研学软件打开,故需先安装该…...

设计模式期末复习

一、设计模式的概念以及分类 二、设计模式的主题和意图 三、面向对象程序设计原则,记住名字,还要理解它的使用场景以及如何用? 四、松耦合、紧耦合、强关联、弱关联、静态复用、动态复用的概念,还有静态委派,动态委…...

CentOS7源码编译安装nginx+php+mysql

1.安装nginx 安装依赖 yum -y install gcc gcc-c wget automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl openssl-devel 创建一个不能登录的nginx运行用户 groupadd www-data useradd -s /sbin/nologin -g www-d…...

linux CentOS系统上卸载docker

一、停止Docker服务 首先,需要停止Docker服务。使用systemctl命令来停止Docker服务: bash复制代码sudo systemctl stop docker二、卸载Docker软件包 接下来,使用CentOS的包管理器yum来卸载Docker软件包。根据安装的Docker版本和组件&#…...

css中相对定位的应用场景

元素位置微调 文本与图标组合微调&#xff1a;在网页设计中&#xff0c;经常会有文本和图标的组合&#xff0c;比如一个带有搜索图标的搜索框。可以使用相对定位来微调图标在搜索框内的位置。例如&#xff0c;有以下HTML结构&#xff1a; <input type"text" class…...

Android 获取屏幕物理尺寸

注&#xff1a;编译 sdk 需要使用 30 因为引入了 WindowMetrics、uild.VERSION_CODES.R 新 sdk 才存在的类和属性 某些场景处理 view &#xff0c;对 view 显示的位置要求比较精确&#xff0c;通常我们使用context.getResources().getDisplayMetrics().widthPixels 获取到的宽、…...

C缺陷与陷阱 — 8 编译与链接

目录 1 程序的编译过程 2 动态链接的优缺点 2.1 动态链接的优点 2.2 动态链接的缺点 2.3 只使用动态链接 3 函数库链接的5个特殊秘密 4 警惕Interpositioning 5 产生链接器报告文件 1 程序的编译过程 程序的编译过程是将源代码转换成计算机可以执行的机器代码的过程。…...

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…...

Springboot 整合DL4J 打造智能写作助手(文本生成)

项目准备 环境要求: Java 1.8或以上 Maven 或 Gradle&#xff08;用于项目管理&#xff09; Spring Boot框架 DL4J库&#xff08;DeepLearning4J&#xff09; 创建 Spring Boot 项目 使用 Spring Initializr 来生成一个新的 Spring Boot 项目。选择合适的依赖&#xff0c;例如…...

SPL06 基于stm32F103 HAL库驱动(软件模拟IIC)

talk is cheap, show you my code SPL06.c #include "SPL06.h"//*************全局变量*************// Factor_List* b_list; //存储过采样率对应的系数KP&#xff0c;KT COEF_ValueStruct Coefficient { 0 }; //存储校准系数…...

【C#】List求并集、交集、差集

值类型List List<int> intList1 new List<int>() { 1, 2, 3 };List<int> intList2 new List<int>() { 3, 4, 5 };var result intList1.Union(intList2);Console.WriteLine($"并 {string.Join(,,result)}");result intList1.Intersect(in…...

YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍ONNX Runtime的原理以及使用其进行推理加速&#xff0c;使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...