精通Python函数,深入了解*args和**kwargs

大家好,如果能在Python中创建适应不同场景的函数,而无需每次都重写它们,会使得操作简洁方便,这就是*args**kwargs的魔力所在。就像为函数准备了一个神奇的袋子,可以装下任意多的参数——使代码更整洁、更灵活。

为了帮助大家更好地理解Python中的*args**kwargs,接下来展示一下如果没有这些概念,代码将会是什么状态。

这里展示一个简单的函数simple_sum,用于将两个数字相加:

def simple_sum(a, b):return a + bresult = simple_sum(3, 7)
print(result)

想象一下如果想创建一个将三个数字相加的函数,最终可能会以如下方式重写这个函数:

def simple_sum_three(a, b, c):return a + b + cresult_three = simple_sum_three(3, 7, 5)
print(result_three)

如果想将更多的数字相加,不得不为每种情况创建新函数,这既不优雅也不灵活。为了解决这个问题,有一个称为“参数打包”的概念,可以在函数定义语句中使用*符号,将一个参数转换为超级参数,它可以作为一个袋子,并在调用函数时容纳/打包传递它的所有值,存储在一个变量中。

同样,符号*也可以用于解包数据结构,具体取决于它的使用方式,本文将在后面介绍如何做到这一点。

1.使用*args进行参数打包

在Python中,当在函数定义中看到一个星号(*)紧跟在一个参数前面时,这是参数打包的信号。这意味着可以向函数传递任意数量的参数,它们将被整洁地打包成一个元组。就像为函数准备了一个神奇的袋子,使它能够适应不同的情况,而无需不断地重写函数。

def magic_sum(*args):result = sum(args)return result# 三个数字相加
result1 = magic_sum(3, 7, 5)
print("Result 1:", result1)  # 预期输出:15(3+7+5)# 五个数字相加
result2 = magic_sum(1, 2, 3, 4, 5)
print("Result 2:", result2)  # 预期输出:15(1+2+3+4+5)# 相加更多数字
result3 = magic_sum(10, 20, 30, 40, 50, 60)
print("Result 3:", result3)  # 预期输出:210(10+20+30+40+50+60)

在这个示例中,magic_sum函数使用*args进行参数打包。可以使用不同数量的参数调用这个函数,它会将这些参数整洁地打包成一个元组进行加法运算。在这种情况下,变量args就变成了一个元组。就像有了一个可以处理任意数量输入的计算器,而无需更改其公式。

2.参数解包

另一方面,在调用函数时,可以使用星号(*)表示正在解包一个值序列(元组、列表、集合、字符串),并将其元素作为单独的值传递。这种方法适用于将数据保存在集合(例如元组)中,但希望从集合中提取每个值,并将其作为单独参数传递给函数的情况。

def display_values(a, b, c):print("Value of a:", a)print("Value of b:", b)print("Value of c:", c)# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values) # 等同于 display_values(7, 14, 21)

可以使用此方法从多个集合类型数据中提取值:

def display_values(a, b, c):print("Value of a:", a)print("Value of b:", b)print("Value of c:", c)# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values)  # 等同于 display_values(7, 14, 21)# 解包一个列表
list_values = [30, 40, 50]
display_values(*list_values)  # 等同于 display_values(30, 40, 50)# 解包一个字符串(每个字符成为单独的参数)
string_values = "XYZ"
display_values(*string_values)  # 等同于 display_values('X', 'Y', 'Z')# 解包一个集合
set_values = {60, 70, 80}
display_values(*set_values)  # 顺序可能会有变化,等同于 display_values(60, 70, 80)# 解包一个范围
range_values = range(3, 6)
display_values(*range_values)  # 等同于 display_values(3, 4, 5)

还可以将函数定义部分的abc更改为values以接收可变数量的参数。values将成为传递的所有参数的元组。这可以理解为同时进行打包和解包。

def display_values(*values): # 将数值打包到一个变量中。print("Values:", values)# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values)

3.使用**进行关键字参数打包

接下来,本文将使用双星号(**),这是Python的一个运算符,它将字典的打包和解包引入其中。当一个函数参数以“**”为前缀时,它表示相应的参数应该是键值对,并整齐地打包成一个字典。这与元组参数的打包相同,但用于函数参数为关键字参数的情况。

def display_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")# 在函数调用中直接传递关键字参数
display_info(name='Alice', age=25, city='Wonderland')

4.关键字参数解包

解包字典,并将其内容作为单独的关键字参数传递给函数。这种方法适用于将数据保存在字典中,但又想从字典中提取每个键值对,并将其作为单独的关键字参数传递给函数的情况:

def display_person_info(name, age, city):print("Name:", name)print("Age:", age)print("City:", city)# 解包一个包含预期键值对的字典
person_info = {'name': 'Alice', 'age': 25, 'city': 'Wonderland'}
display_person_info(**person_info)

5.结合使用*args**kwargs

结合*args**kwargs的力量,将它们分别视为长度可变的位置参数列表和关键字参数列表。

def display_information(*args, **kwargs):print("Positional Arguments (*args):")for arg in args:print(arg)print("\nKeyword Arguments (**kwargs):")for key, value in kwargs.items():print(f"{key}: {value}")# 使用位置参数和关键字参数的混合调用函数
display_information(1, 'apple', name='Alice', age=25, city='Wonderland')

在此示例中,display_information函数接收*args以处理任意数量的位置参数,接收**kwargs以处理任意数量的关键字参数,然后该函数分别打印每种类型的参数。

6.一次性进行多次解包

Python中的另一个有趣功能是能够在单个函数调用中执行多次解包。

def display_values(*args):for value in args:print(value)# 在单个函数调用中进行多次解包
list_values = [1, 2, 3]
tuple_values = (4, 5, 6)
set_values = {7, 8, 9}display_values(*list_values, *tuple_values, *set_values)

在此示例中,display_values函数使用多次解包以单行方式调用三种不同的可迭代类型(列表、元组和集合)。在函数调用期间,通过多次解包(*list_values*tuple_values*set_values)收集所有值,存储在单个args参数中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ、kafaka、rocketmq等消息队列MQ消息堆积如何解决

文章目录 概述解决方案消息堆积如何处理如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办? 概述 1.产生背景: 生产者投递消息的速率与我们消费者消费的速率完全…

项目管理软件:如何确保项目启动顺利?

对所有项目经理来说,了解如何启动项目是最关键的技能之一。项目都是从小事开始,逐渐发展为更大型、更复杂的。好的开始是成功的一半,对项目管理来说更是如此。 启动项目的 10 个简单步骤 即使是最复杂的项目,也可以分解成简单的…

爬虫练习:获取某网站的房价信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(房天下数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [名称, 地点,价格,总价,联系电话]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer.writeheader…

计算机丢失msvcp140.dll是什么意思,电脑自带dll修复安装下载

在使用电脑的过程中那个大家是不是有遇到过电脑丢失某个文件,导致电脑的程序不能继续运行,那么出现这样的问题有什么办法可以解决呢?其实解决办法还是有很多的!今天这篇文章就教大家如果电脑丢失的msvcp140.dll文件那么该怎么办&a…

基于PHP的餐厅管理系统APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 MVC 3 1.2 ThinkPHP 3 1.3 MySQL数据库 3 1.4 uni-app 4 1.5 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 7 2.3 非功能需求 8 2.4 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 3.2 系统详细设计 10 3.3 本章小…

qt如何配置ros环境

在Qt5.7的版本可以使用bash -i -c来启动qt,让Qt自己识别系统环境,不知道为什么Qt在之后的版本,这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator,感觉失去了一些灵活性。 自己测试…

C语言简单题(2)水仙花数、素数问题、斐波那契数列问题、回文数问题、求阶乘、一元二次方程的解、统计字符个数

/* 水仙花数&#xff1a;输入一个三位数&#xff0c;判断是否为水仙花数 水仙花数指一个三位数&#xff0c;各位数的立方和等于其本身&#xff0c;如 153 1*1*1 5*5*5 3*3*3 #include<stdio.h> int main(){ int n; printf("请输入一个三位数n&q…

学c还行,学Python很累,还有其他语言适合我吗?

学c还行&#xff0c;学Python很累&#xff0c;还有其他语言适合我吗&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&a…

mysql的其他问题

1.MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f; a. 设计良好的数据库结构&#xff0c;允许部分数据冗余&#xff0c;尽量避免join查询&#xff0c;提高效率。 b. 选择合适的表字段数据类型和存储引擎&#xf…

基于SSM的网络教学系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 B/S架构技术 3 1.2 Ajax技术 3 1.3 JavaScript 4 1.4 jQuery 4 1.5 SSM框架 4 1.5.1 Spring 5 1.5.2 Spring MVC 5 1.5.3 MyBatis 5 1.6 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 系统用例分析 8 2.3 非功能需求分析 …

最全软件测试面试问题和回答,适合全文背诵

求职&#xff0c;类似于打仗&#xff0c;是一场挑战自己的战斗&#xff0c;也是一场跟用人单位的博弈&#xff0c;更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了&#xff1a;"知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&a…

精通SpringBoot单元测试

引言 单元测试是软件开发中不可或缺的一部分&#xff0c;它对保障代码质量和软件的可靠性起着至关重要的作用。而SpringBoot作为一个流行的Java框架&#xff0c;为开发高效、易于部署的微服务提供了强大的支持。 单元测试的重要性&#xff1a; 确保代码正确性&#xff1a;通过…

安全知识分享域渗透

内网渗透思维导图 密码相关域渗透攻击思路DACL的应用NTLM 中继攻击滥用 ACE 内网渗透思维导图 专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; 密码相关 域渗透攻击思路 常见攻击手法&a…

Paimon新版本核心特性和生产实践解读

最近Apche Paimon发布了最新版本0.7.0&#xff0c;在这个版本中&#xff0c;Paimon对一些新特性进行了增强。 Paimon在数据湖领域发展迅速&#xff0c;未来会在整个数据开发领域占有很重要的地位&#xff0c;今天我们来盘点一下当前能力的特点以及在生产环境中的使用情况。 Loo…

fastgpt本地详细部署以及配置

目录 一、Docker部署1、docker安装2、docker启动3、添加用户到 docker 组:4、验证 Docker 安装:二、one_api 本地部署1、linux系统部署2、windows系统部署三、向量模型部署(m3e)四、chatglm2模型本地部署五、fastgpt模型本地部署1、下载配置文件2、文件配置--docker-compos…

Windows环境编译webots遇到报错:‘gbk‘ codec can‘t decode byte 0x93 in position 547

Windows环境下编译webots的官方说明在 https://github.com/cyberbotics/webots/wiki/Windows-installation/ &#xff0c;概括起来就是&#xff1a;先安装MYSYS2&#xff0c;然后git clone --recurse-submodules -j8 https://github.com/cyberbotics/webots.git &#xff0c;最…

finalize方法做什么用的?

在Java中&#xff0c;finalize() 方法是一个被垃圾回收器调用的特殊方法&#xff0c;用于执行对象在被回收之前的清理操作。当Java虚拟机确定某个对象没有被任何引用引用时&#xff0c;会将其标记为垃圾对象&#xff0c;接着在适当的时间由垃圾回收器回收这些对象。在回收对象之…

大数据赋能,能源企业的智慧转型之路

在数字洪流中&#xff0c;大数据已经成为推动产业升级的新引擎。特别是在能源行业&#xff0c;大数据的应用正引领着一场深刻的智慧转型。今天&#xff0c;我们就来探讨大数据如何在能源企业中发挥其独特的魅力&#xff0c;助力企业提效降本&#xff0c;实现绿色发展。 动态监控…

BK7231+字库+LCD显示

1、BK7231有2M flash&#xff0c;可以保存1个16*16汉字字库 2、驱动1个8位并口屏&#xff0c;将字库中的汉字中显示出来 一、将gb2312_80.bin打包到烧录镜像中。 1、bk7231u_rtt_sdk\OTAPackage\beken_packager中修改config.json文件&#xff1a; {"magic": "…

_note_26

1.介绍一下 MyBatis MyBatis是一个开源的持久层框架&#xff0c;它提供了一种简单且强大的方式来管理数据库访问。MyBatis允许开发者使用XML或注解的方式来配置SQL映射&#xff0c;以及提供了灵活的参数绑定和结果映射功能。它与数据库交互的方式是通过SQL语句直接与数据库进行…