Python3中参数*args和**kwargs介绍

2023-11-15

      在Python中,我们可以使用两种特殊符号将可变数量的参数传递给函数:*args和**kwargs。你可以使用任何单词代替args和kwargs,但通常做法是使用args和kwargs。

      *args允许函数接受任意数量的位置参数(positional arguments)

      **kwargs收集所有未明确定义的关键字参数。因此,它执行与*args相同的操作,但针对关键字参数。**kwargs允许函数接受任意数量的关键字参数。默认情况下,**kwargs是一个空字典。每个未定义的关键字参数都作为键值对存储在**kwargs字典中

      Python不允许位置参数跟在关键字参数之后

      位置参数(positional arguments)和关键字参数(key word arguments)区别:位置参数仅由名称声明;关键字参数由名称和默认值声明。调用函数时,必须给出位置参数的值,否则会得到一个error。如果我们没有为关键字参数指定值,它将采用默认值。

      我们可以在函数中同时使用*args和**kwargs,但*args必须放在**kwargs之前。

      我们可以使用*args和**kwargs打包和解包(pack and unpack)变量。

      以上内容和以下测试代码主要参考:https://towardsdatascience.com/10-examples-to-master-args-and-kwargs-in-python-6f1e8cc30749


# https://towardsdatascience.com/10-examples-to-master-args-and-kwargs-in-python-6f1e8cc30749
var = 8
if var == 1:
    # *args允许函数接受任意数量的位置参数
    def addition(*args):
        result = 0
        for i in args:
            result += i
        return result

    # 传递给此addition函数的参数存储在一个元组中,因此可以迭代args变量
    print("addition():", addition())
    print("addition(1, 4):", addition(1, 4))
    print("addition(1, 7, 3):", addition(1, 7, 3))
elif var == 2:
    def arg_printer(a, b, *args):
        print(f"a is {a}")
        print(f"b is {b}")
        print(f"args is {args}")

    # 前两个值被赋予a和b,其余值存储在args元组中
    arg_printer(3, 4, 5, 8, 3)

    # Python希望将关键字参数放在位置参数之后
    # 如果为位置参数赋值,它就成为关键字参数.由于它后面是位置参数,因此会得到一个SyntaxError
    #arg_printer(a=4, 2, 4, 5) # SyntaxError: positional argument follows keyword argument
elif var == 3:
    def addition(a, b, *args, option=True): # option是关键字参数
        result = 0
        if option:
            for i in args:
                result += i
            return a + b + result
        else:
            return result

    print(addition(1,4,5,6,7)) # 23
    print(addition(1,4,5,6,7, option=False)) # 0
elif var == 4:
    # **kwargs允许函数接受任意数量的关键字参数,它收集所有未明确定义的关键字参数,默认**kwargs是一个空字典,每个未定义的关键字参数都作为键值对存储在**kwargs字典中
    def arg_printer(a, b, option=True, **kwargs):
        print(a, b) # 3 4
        print(option) # True
        print(kwargs) # {'param1': 5, 'param2': 6}

    arg_printer(3, 4, param1=5, param2=6)
elif var == 5:
    # 我们可以在函数中同时使用*args和**kwargs,但*args必须放在**kwargs之前
    def arg_printer(a, b, *args, option=True, **kwargs):
        print(a, b) # 1 4
        print(args) # (6, 5)
        print(option) # True
        print(kwargs) # {'param1': 5, 'param2': 6}

    arg_printer(1, 4, 6, 5, param1=5, param2=6)
elif var == 6:
    # 我们可以使用*args打包和解包(pack and unpack)变量
    def arg_printer(*args):
        print(args)

    lst = [1,4,5]
    # 如果我们将一个列表传递给arg_printer,它将作为一个元素存储在args元组中
    arg_printer(lst) # ([1, 4, 5],)
    # 如果我们在lst之前放一个星号,列表中的值将被解包(unpack)并单独存储在args元组中
    arg_printer(*lst) # (1, 4, 5)
    tpl = ('a','b',4)
    # 我们可以传递多个可迭代对象与单个元素一起解包(unpack),所有值都将存储在args元组中
    arg_printer(*lst, *tpl, 5, 6) # (1, 4, 5, 'a', 'b', 4, 5, 6)
elif var == 7:
    # 我们也可以使用关键字参数(keyword argument)进行打包和解包(pack and unpack),
    # 但是作为关键字参数传递的迭代必须是一个映射,比如字典
    def arg_printer(**kwargs):
        print(kwargs)

    dct = {'param1':5, 'param2':8}
    arg_printer(**dct) # {'param1': 5, 'param2': 8}

    # 如果我们还将额外的关键字参数与字典一起传递,它们将组合并存储在kwargs字典中
    arg_printer(param3=9, **dct) # {'param3': 9, 'param1': 5, 'param2': 8}
elif var == 8:
    # reference: https://www.geeksforgeeks.org/args-kwargs-python/
    def myFun(arg1, arg2, arg3):
        print(f"arg1: {arg1}, arg2: {arg2}, arg3: {arg3}")

    args = ("Geeks", "for", "Geeks")
    myFun(*args) # arg1: Geeks, arg2: for, arg3: Geeks

    kwargs = {"arg1" : "Geeks", "arg2" : "for", "arg3" : "Geeks"}
    myFun(**kwargs) # arg1: Geeks, arg2: for, arg3: Geeks

print("test finish")

      GitHubhttps://github.com/fengbingchun/Python_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3中参数*args和**kwargs介绍 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐

  • 将文本按指定数量字符分割

    最近搞了电网的I1协议 其中涉及图片数据 包比较大 分了20包 每包5K大小 远程写的解析代码 没有连接真实设备测试 所以要了一些报文 奈何报文全是16进制字符紧挨在一起 没有合适的分割工具 只好自己写个了 工具功能 将文本按指定数量字符分
  • 提供下载地址的情感数据库大全(涵盖音视频生理图像文本)

    情感识别数据集大全 一 公开多模态数据集 1 MIT BIH 2 Aubt 3 Multi ZOL 4 SAVEE 5 eNTERFACE05 二 文本情感数据集 1 Stanford Twitter Sentiment STS 2 Ama
  • 第十四章 Spring CLoud+Hystrix+Ribbon+commandProperties 信号量隔离

    传播安全上下文或使用Spring范围 首先 当大多数人在使用Tomcat时 多个HTTP服务会共享一个线程池 假设其中一个HTTP服务访问的数据库响应非常慢 这将造成服务响应时间延迟增加 大多数线程阻塞等待数据响应返回 导致整个Tomcat
  • 北京时间与UTC时间转换

    UTC时间也称为世界标准时间 或协调世界时 英语 Coordinated Universal Time 北京时间是东八区 领先UTC 8个小时 UTC 时区差 本地时间 时区差东为正 西为负 即 北京时间 UTC时间 8小时 我们转化时主要
  • 查看Linux磁盘空间

    在 Linux 系统中 可以使用以下命令来查看磁盘空间的使用情况 1 df 命令 df h 该命令会列出当前系统所有挂载的文件系统以及它们的使用情况 包括总容量 已用空间 可用空间 使用百分比等信息 2 du 命令 du sh path t
  • 【金三银四】Spring Cloud面试题(2021最新版)

    目录 前言 一 什么是微服务架构 1 什么是微服务架构 2 为什么需要学习Spring Cloud 3 Spring Cloud 是什么 4 SpringCloud的优缺点 5 SpringBoot和SpringCloud的区别 6 Spr
  • WPS 配置MathType

    注 先找到 自己安装的 MathType 和 WPS 的安装目录 最简单的方式就找到快捷方式查看 目标 以我为例我的安装软件是32位 1 进入 MathType 目录 在 MathPage 和 Office Support目录下找到对应 位
  • stm32相关知识笔记

    keil公司是为51 arm芯片提供软件开发IDE的公司 2005年被ARM收购 Keil MDK ARM是美国Keil软件公司 现已被ARM公司收购 出品的支持ARM微控制器的一款IDE 集成开发环境 MDK ARM包含了工业标准的Kei
  • Python3,使用openpyxl进行excel数据对比,反手一个赞。

    openpyxl技能 1 引言 2 代码实战 2 1 安装 2 2 代码实战 2 2 1 思路 2 2 2 代码示例 3 总结 1 引言 小屌丝 鱼哥 我最近在对搞数据对比 你有什么便捷的方法 小鱼 斗胆问一句 数据量多少 小屌丝 不多不多
  • Activiti启动流程实例,runtimeService.startProcessInstanceByKey

    启动流程实例 添加进businessKey 本质 act ru execution表中的businessKey的字段要存入业务标识 public class BusinessKeyAdd public static void main St
  • oVirt 4.4.10三节点超融合集群安装配置及集群扩容(一)

    环境 oVrit版本 4 4 10 oVirt image https mirrors aliyun com ovirt ovirt 4 4 iso ovirt node ng installer 4 4 10 2022030308 el8
  • JAVA中的反射机制以及在Spring中的应用

    文章目录 一 反射机制 二 反射机制的使用 Class类 三 为什么要使用反射 3 1 静态编译 3 2 动态编译 3 3 反射的好处 3 4 反射的缺点 四 Spring IOC中的体现 4 1 Spring IOC的实现方式 4 2 代
  • linux内核知识图谱

    根据 深入linux内核架构 linux内核设计与实现 深入理解linux内核 得出linux内核的大类知识模块 进行后续主题式学习
  • 如何在react中使用websocket

    一 如何引用websocket npm install save react websocket 二 在组件中如何使用 1 先封装一个websocket组件 import React from react import Websocket
  • 在HTML页面中引用Markdown编辑器(Editor.md)

    目录 1 下载Ediotor md 2 引入Ediotor md 3 确定Ediotor md在哪里显示 最近写博客项目 用到了Markdown编辑器 这里介绍一款国内好用的Markdown编辑器 Editor md 下面介绍一下该编辑器以
  • ElementUI的表单效验问题 (一个页面两个form(数据相似))

    两个form 注意 两个表单必须绑定不同的 key key为字符串 否则 vue看两个表单数据大致相同就会将其上面的复用 导致效验不生效 rules
  • 论述GIS当前现状以及未来的发展前景

    GIS是空间技术和信息技术的交叉学科 相关领域的研究热点都有可能成为GIS的发展趋势 GIS的技术环节无外乎数据获取 数据分析 数据呈现三个方面 从近年的发展情况看 GIS可能在这三个方面都有着激动人心的前景 一 数据获取 数据是GIS的基
  • 警告:检测到时钟错误。您的创建可能是不完整的。

    问题 make 2 Warning File CMakeFiles MultiCol SLAM dir depend make has modification time 24688 s in the future make 2 警告 检测
  • 模式识别 - 名词解释整理

    模式识别 模式识别是指把对象根据其特征归到若干类别中适当的一类 模式识别也称为模式分类 模式 模式是指因素间存在确定性或随机性规律的对象 过程或事件的集合 识别 识别就是把对象分门别类地认出来 样本 sample 所研究对象的一个个体 样本
  • Python3中参数*args和**kwargs介绍

    在Python中 我们可以使用两种特殊符号将可变数量的参数传递给函数 args和 kwargs 你可以使用任何单词代替args和kwargs 但通常做法是使用args和kwargs args允许函数接受任意数量的位置参数 positiona