【Python】Python可变参数*args **kwargs

2023-11-05

可变参数*args 和 **kwargs

作为函数定义时:收集未匹配参数组成tuple或dict对象

*参数也就是*args收集所有未匹配的位置参数组成一个tuple对象,局部变量args指向此tuple对象
**参数也就是**kwargs收集所有未匹配的关键字参数组成一个dict对象,局部变量kwargs指向此dict对象

def temp(*args,**kwargs):
    pass

作为函数调用时:解包功能

*参数用于解包tuple对象的每个元素,作为一个一个的位置参数传入到函数中

my_tuple = ("w","y","z")
 
temp(*my_tuple)
#---等同于---#
temp("w","y","z")

**参数用于解包dict对象的每个元素,作为一个一个的关键字参数传入到函数中

my_dict = {"name":"wangyuanwai","age":32}
 
temp(**my_dict)
#----等同于----#
temp(name="wangyuanwai",age=32)

定义函数时候,参数*args在前,**kwargs在后,*args和**kwargs组合起来可以传入任意的参数。

Python函数 — 位置参数和关键字参数

*args例子

*args作为参数 定义函数 收集所有未匹配的参数,封存在一个list里

def print_str(first, *second):
    print(first)
    print(second)
# 定义一个函数,*second作为不定参数

此时我们只传入一个参数

print_str("hello")

输出会是

hello
()

传入的第一个字符串参数"hello"打印出来了,没有传入参数的*second则打印的是一个tuple对象的字符串表示形式,即一个括号"()" 。 注意:()表示含有0个元素的tuple对象!

函数调用时的 *args 进行解包

调用print_str()函数时,直接传入一个 *参数会发生什么?

def print_str(first, *second):
    print(first)
    print(second)
numbers_strings = ("1","2","3","4","5")
print_str(*numbers_strings)

输出结果为:

1
('2', '3', '4', '5')

*numbers_strings出现在函数调用时,称为解包(一个“*”字符后面紧挨着1个tuple对象),numbers_strings自身是一个tuple对象,所以也称为元组的解包,tuple中的元素解包成一个一个的位置参数传入到函数中,所以才有下面两个语句的相等性!

**kwargs例子

函数定义中,参数名称前有两个** 收集所有未匹配的参数,封存在一个字典里

在这里插入图片描述
定义一个函数,这里用到了*args 和 **kwargs

def printStr(first,second,*args,**kwargs):
    print(first)
    print(second)
    print(args)
    print(kwargs)

然后进行函数的调用,

printStr('first','second','third','fourth',fifth = '5')

输出结果为:

first
second
('third', 'fourth')
{'fifth': '5'}

kwargs字典收集了{‘fifth’: ‘5’}这个键值对。当然,在写函数的时候,如果需要取得这个’fifth’: ‘5’,使用字典的get()方法比较好。
在这里插入图片描述

函数调用时,传入的关键字参数有匹配的位置参数时,则位置参数优先使用(匹配)这些关键字参数,剩余所有未使用(未匹配)的关键字参数会在函数内组装进一个dict对象中,组装后dict对象会赋值给变量名anything,此时局部变量anything指向一个dict对象

注意:**参数只收集未匹配的关键字参数

函数调用时使用字典解包功能(dict对象前加**)

def printStr(first, **dict):
    print(str(first) + "\n")
    print(dict)

传入一个字典,用**进行解包

printDic = {"name": "tyson", "age":"99"}
printStr(100, **printDic)

相当于

printDic = {"name": "tyson", "age":"99"}
printStr(100, name = "tyson", age = "99") 

又一个例子

my_dict = {"name":"wang","age":32}
 
temp(**my_dict)
#----等同于----#
temp(name="wang",age=32)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】Python可变参数*args **kwargs 的相关文章

随机推荐

  • 并查集平摊代价分析

    并查集平摊代价分析 1 并查集链表 Linked list representation of disjoint sets 1 1 最糙的链表 链表的每个结点有三个域 分别是head rep tail head是个指针 指向这个集合的第一个
  • GnuTLS recv error (-110): The TLS connection was non-properly terminated 解决(linux)

    原理是重新编译安装git 在linux终端按照下面命令一步一步执行即可 sudo apt get install build essential fakeroot dpkg dev y sudo apt get build dep git
  • 小程序开发完整教程

    微信使用的开发语言和文件很 特殊 小程序所使用的程序文件类型大致分为以下几种 WXML WeiXin Mark Language 微信标记语言 WXSS WeiXin Style Sheet 微信样式表 JS Java 小程序的主体 在语言
  • js断点和调试学习总结3

    使用Chrome调试JavaScript的断点设置和调试技巧 你是怎么调试 JavaScript 程序的 最原始的方法是用 alert 在页面上打印内容 稍微改进一点的方 法是用 console log 在 JavaScript 控制台上输
  • 插入方法(Insert Methods)

    进入MongoDB中文手册 4 2版本 目录 MongoDB提供了以下将文档插入到集合中的方法 方法 说明 db collection insertOne 将单个文档插入集合中 db collection insertMany 将多个 文档
  • 单元测试时间机器

    没有单元测试 您怎么称呼重构 任何人 是 这是一个技巧问题 不是吗 没有单元测试的重构不称为重构 这称为更改代码 甚至可以称其为破坏代码 随手添加测试 当您需要更改未经测试的代码时 添加单元测试很有用 您实际上可以添加两种类型 一个明显的用
  • STM32全国研讨会:且看Python 和OpenMV如何在 STM32 MCU上运行AI 2020-09-15 07:10 预计 24 分钟读完

    What is the state of machine learning at the edge today What tools can help engineers collect data and run inferences Wh
  • Rust学习笔记(三)——注释

    Rust学习笔记 三 注释 单行注释 多行注释 和大多数高级语言一样 Rust同样支持单行注释和多行注释 单行注释 单行注释是 或 开头的注释内容 Rust会将 或 到其后的第一个换行符之间的内容作为注释内容 所不同的是 以三个反斜杠 开头
  • 【安装教程】夜神模拟器+抓包工具mitmproxy

    夜神模拟器官网下载 应用商城搜索 小红书 下载软件即可 python 安装 mitmproxy 1 安装Microsoft Visual buildtools 链接 https pan baidu com s 1GyLNOOydBoOtNB
  • class from quick

    原文链接 http www jianshu com p 9587fffc7d8f 创建一个类 lua 定义名为 Shape 的基础类 local Shape class Shape ctor 是类的构造函数 在调用 Shape new 创建
  • OGG流媒体文件格式分析

    摘自 http www studa net yingyong 080505 16283240 html 摘 要 流媒体文件格式在流媒体系统中占有重要地位 设计合理的文件格式是提高流媒体服务器工作效率最直接和最有效的办法 该文在剖析常用流媒体
  • mac笔记本怎么外接显示屏_苹果MAC笔记本怎么外接显示屏

    苹果MAC笔记本外接显示器设置方法 步骤 1 如果要在 Mac 上外接显示器的话 首先是要考虑采用什么样的接口 一般我们是通过 VGA 或 HDMI 来外接显示器的 如果 Mac 电脑上没有可以外接显示器的 VGA 或 HDMI 接口的话
  • Anoconda安装open3d

    非虚拟环境安装需指定 user选项 pip install user open3d
  • 恐怖谷效应

    恐怖谷效应 Uncanny Valley 是仿真机器人领域中的一个理论 是指一个机器人的外貌或行为越来越逼真的过程中 观察者的心态会从认同到不适 再到认同这样一种现象 数学上X轴为接近度 Y轴为亲近感 则会出现一段山谷曲线 所以命名为恐怖谷
  • Nmap的介绍、安装 并进行网络扫描

    Nmap概述 Nmap Network Mapper 网络映射器 是一个网络连接端扫描软件 用来扫描网上电脑开放的网络连接端 确定哪些服务运行在哪些连接端 并且推断计算机运行哪个操作系统 这是亦称 fingerprinting 它是网络管理
  • K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

    原文 http www cnblogs com yixuan xu p 6272208 html K means聚类算法的三种改进 K means ISODATA Kernel K means 介绍与对比 一 概述 在本篇文章中将对四种聚类
  • 独立服务器的优点

    独立服务器有哪些优势 独立服务器的优势 1 稳定性好 一个人独享 拥有专业技术人员维护 2 独立服务器支持自动更新系统 自主设置安全策略以及系统环境是独立的 因此更加安全可靠 2 独立服务器操作系统中的http ftp ssh都是独立的 供
  • 判断两个List<Map>是否相同以及其他类操作

    根据自身的业务 搞了个list 是否相等的方法 较笨拙 有更好的方法 欢迎各位大佬指教 仅根据自身业务编写 如需改动请自便 改动也好改动 注释很详细 import com google common collect Maps import
  • [非线性控制理论]1_Lyapunov直接方法

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • 【Python】Python可变参数*args **kwargs

    可变参数 args 和 kwargs 作为函数定义时 收集未匹配参数组成tuple或dict对象 参数也就是 args收集所有未匹配的位置参数组成一个tuple对象 局部变量args指向此tuple对象 参数也就是 kwargs收集所有未匹