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介绍 的相关文章

  • Python 和 Numpy 是 nan 和 set

    我在使用 Python 的 Numpy set 和 NaN 非数字 时遇到了不可预测的行为 gt gt gt set np float64 nan np float64 nan set nan nan gt gt gt set np flo
  • Tkinter:消息小部件中锚点选项的正确值是多少?

    我一直在学习 tkinterTkinter 中的消息小部件 https python course eu tkinter message widget in tkinter php at Python 课程和教程 https python
  • 如何指定聚类的距离函数?

    我想对给定距离的点进行聚类 奇怪的是 似乎 scipy 和 sklearn 聚类方法都不允许指定距离函数 例如 在sklearn cluster AgglomerativeClustering 我唯一可以做的就是输入一个亲和力矩阵 这将非常
  • 如何在python中附加两个字节?

    说你有b x04 and b x00 你如何将它们组合起来b x0400 使用Python 3 gt gt gt a b x04 gt gt gt b b x00 gt gt gt a b b x04 x00
  • 尝试从网页Python和BeautifulSoup获取编码

    我试图从网页检索字符集 这会一直改变 目前我使用 beautifulSoup 来解析页面 然后从标题中提取字符集 这工作正常 直到我遇到一个网站 到目前为止 我的代码以及与其他页面一起使用的代码是 def get encoding soup
  • 如何使用 Homebrew 在 Mac 上安装 Python 2 和 3?

    我需要能够在 Python 2 和 3 之间来回切换 我如何使用 Homebrew 来做到这一点 因为我不想弄乱路径并陷入麻烦 现在我已经通过 Homebrew 安装了 2 7 我会用pyenv https github com yyuu
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • 使用标签或 href 传递 Django 数据

    我有一个包含链接的表 当单击该链接进行更多操作时 我想将一些数据传递给我的函数 my html table tbody for query in queries tr td value a href internal my func que
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • Discord.py 嵌入中禁用按钮/冻结按钮

    I m trying to make a replica of this bot in which when I press any of the buttons below it shows a dropdown menu and you
  • 基于值而不是类型的单次调度

    我在 Django 上构建 SPA 并且有一个庞大的功能 其中包含许多功能if用于检查我的对象字段的状态名称的语句 像这样 if self state new do some logic if self state archive do s
  • PyInstaller“ValueError:源代码字符串不能包含空字节”

    我得到了一个ValueError source code string cannot contain null bytes执行命令时pyinstaller main py在具有和不具有管理员权限的cmd中 Traceback most re
  • 使用 selenium 和 python 来提取 javascript 生成的 HTML?萤火虫?

    这里是Python新手 我遇到的是数据收集问题 我在这个网站上 当我用 Firebug 检查我想要的元素时 它显示了包含我需要的信息的源 然而常规源代码 没有 Firebug 不会给我这个信息 这意味着我也无法通过正常的 selenium
  • 高效创建抗锯齿圆形蒙版

    我正在尝试创建抗锯齿 加权而不是布尔 圆形掩模 以制作用于卷积的圆形内核 radius 3 no of pixels to be 1 on either side of the center pixel shall be decimal a
  • 如何在 scikit 中加载 CSV 数据并将其用于朴素贝叶斯分类

    尝试加载自定义数据以在 Scikit 中执行 NB 分类 需要帮助将示例数据加载到 Scikit 中 然后执行 NB 如何加载目标的分类值 使用相同的数据进行训练和测试 或使用完整的数据集进行测试 Sl No Member ID Membe
  • 描述符“join”需要“unicode”对象,但收到“str”

    代码改编自here http wiki geany org howtos convert camelcase from foo bar to Foo Bar def lower case underscore to camel case s

随机推荐

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

    最近搞了电网的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