【Python】`*args` 和 `**kwargs`的用法【最全详解】

2023-11-18

*args**kwargs的用法

猛滴打开博客,发现实在有段时间没更新了。又刚好用到了**kwargs 。
遂想起了许久之前总结的这篇博客,夸张点说也算是自己的一个呕心沥血之作吧。

相信不少同学在看大神的程序时,总会看见 *args, **kwargs 这样的写法,但你知道这种写法的含义是什么吗?

对于大部分Python初学者而言,*args 和 ``kwargs` 这两个魔法变量需要花费大量时间来解释。别被这些语句所绊倒。其实这些并不是什么超级特殊的参数,也并不奇特,只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字参数。 接下来我们就来一起了解他们的用法**,以及在什么情况下使用?·

首先你要明白的是:

  • 其实并不是写成 *args**kwargs ,只有前面的 * (星号)才是必须的。
  • 向python传递参数的方式有两种:
    位置参数(positional argument)
    关键词参数(keyword argument)

现在我们再来看 *args 与 **kwargs 的区别,两者都是 python 中可变的参数
*args 表示任何多个无名参数, 他本质上是一个 tuple
** kwargs 表示关键字参数, 它本质上是一个 dict

同时使用时必须要求 *args 参数列要在** kwargs 前面 【因为位置参数在关键字参数的前面。】

Splat 运算符

* 常常与乘法运算,C语言中的指针 有关,但在python中,则是 splat 运算符的 两倍。且 splat运算符需要更强大的类比

a = [1,2,3]
b = [*a,4,5,6]
b 
# ----------------- 输出结果 -----------------
# [1, 2, 3, 4, 5, 6]
# ----------------- 总结 -----------------
# 将a的内容移入(解包)到新列表b中。

*args 的用法

* args 和 ** args 主要用于函数定义,你可以将不定数量的参数传递给一个函数。

这里不定的意思是: 预先并不知道,函数使用者会传递多少个参数给你,所在在这个场景下使用这两个关键字。 * args 是用来发送一个 非键值 的可变数量的参数列表给一个函数。

Case 1

def test_var_args(f_arg, *argv):
    print("first normal arg:",f_arg)
    for arg in argv:
        print("another arg through *argv:",arg)
test_var_args('yasoob','python','eggs','test')

输出结果:

first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

Case 2 定义一个打印的函数,传入任意参数即可

def print_func(*args):
    print(type(args))
    print(args)
print_func(1,2,'python希望社',[])

输出结果

<class 'tuple'>
(1, 2, 'python希望社', [])

Case 3 在打印函数的参数处,新增 x 和 y 变量

def print_func(x,y,*args):
    print(type(x))
    print(x)
    print(y)
    print(type(args))
    print(args)
print_func(1,2,'python希望社',[])

输出结果

<class 'int'>
1
2
<class 'tuple'>
('python希望社', [])

Case4 将 *args 放在参数最前面

def print_func(*args,x,y):
    print(type(x))
    print(x)
    print(y)
    print(type(args))
    print(args)

输出结果

TypeError: print_func() missing 2 required keyword-only arguments: 'x' and 'y'

可以看出,打印函数 print_func找不到关键词参数 xy

所以若 *args 不是在最后,则需要在参数传入时,明确定义 *args后面的变量参数名,如下:

# 改正的代码
def print_func(*args,x,y):
    print(type(x))
    print(x)
    print(y)
    print(type(args))
    print(args)
print_func(1,2,'python希望社',[],x='x',y='y')

输出结果

<class 'str'>
x
y
<class 'tuple'>
(1, 2, 'python希望社', [])

Case 5 将*args 放在中间

进一步滴我们可以考虑 将*args 放在中间,结果如何。就让大家自己来动手看看吧?

** kwargs 的用法

**kwargs允许你将不定长度的 【键值对 key-value 】,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数,你应该使用**kwargs

Case 1

def print_func(**kwargs):
    print(type(kwargs))
    print(kwargs)
print_func(1, 2, 'python希望社', [])

输出结果:

TypeError: print_func() takes 0 positional arguments but 4 were given

直接报错了,大致意思是需要给出四个参数! 改正:

def print_func(**kwargs):
    print(type(kwargs))
    print(kwargs)

print_func(a=1, b=2, c='呵呵哒', d=[])

输出结果:

<class 'dict'>
{'a': 1, 'b': 2, 'c': '呵呵哒', 'd': []}

总结: 入参时,多添加了关键词。可以看到打印时,kwargs本身是字典类型,将传入的参数以字典形式呈现出来。

Case 2

def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))
greet_me(name="yasoob")

输出结果

name == yasoob

现在你可以看出我们怎样在一个函数里,处理了一个【键值对 key-value 】参数了

组合使用 args,*args**kwargs 来调用函数

Case 1

arg,*args,**kwargs ,三者是可以组合使用的,但是组合使用需要遵循一定的语法规则,即顺序为王。

需要按照:

arg,*args,**kwargs 作为函数参数的顺序。

def print_func(x, *args, **kwargs):
    print(x)
    print(args)
    print(kwargs)

print_func(1, 2, 3, 4, y=1, a=2, b=3, c=4)

输出结果

1
(2, 3, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

Case 2

那现在我们将看到怎样使用*args**kwargs 来调用一个函数。假设,你有这样一个小函数

def test_args_kwargs(arg1,arg2,arg3):
    print("arg1:",arg1)
    print("arg2:",arg2)
    print("arg3:",arg3)

你可以使用 *args**kwargs 来给这个小函数传递参数。 下面是怎样做得:

# 首先你可以使用 *args
args = ("two",3,5)
test_args_kwargs(*args)

#-------- 得到输出结果如下所示:----------------------
# arg1: two
# arg2: 3
# arg3: 5
# ---------------------------------------------------
#  现在使用 **kwargs
kwargs = {"arg3": 3,"arg2":"two","arg1":5}
test_args_kwargs(**kwargs)

#-------- 得到输出结果如下所示:----------------------
# arg1: 5
# arg2: two
# arg3: 3
# ---------------------------------------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】`*args` 和 `**kwargs`的用法【最全详解】 的相关文章

随机推荐

  • [Vue warn]: Error in render: “TypeError: Cannot read properties of undefined(reading“toString“)

    描述 在我们写了大量的标签但是实际上却出现了无任何东西 一查看控制台就出现了这样的错误提示 解决思路 渲染错误 TypeError 无法读取未定义的属性 读取 toString 全局搜友toSrtring 无变量toString 但是有一个
  • 数据链路层相关协议

    网络类型 根据数据链路层协议进行划分 MA 多点接入网络 BMA广播型 NBMA非广播型 P2P 点到点的网络 以太网协议 需要使用MAC地址对不同的主机设备进行区分和标识 主要因为利用以太网组件的二层网络可以包含 两个和两个以上 的接口
  • 学完责任链之后,逻辑思维上升了一个段位,我马上写了一个月薪3万的简历,HR看了让我去上班

    经过上一篇的文章 我们学习了责任链模式和策略模式 设计模式相对重要 对架构 项目拓展性 移植性要求比较高 下面我会说到简历 对于开发来说 简历是程序员的第二生命 技术是第一生命 简历第二生命 学历第三生命 简历到底是什么 简历是你的第二生命
  • js密码验证

    js密码验证
  • Paper Reading:《LISA: Reasoning Segmentation via Large Language Model》

    目录 简介 目标 创新点 方法 训练 实验 总结 简介 LISA Reasoning Segmentation via Large Language Model 基于大型语言模型的推理分割 日期 2023 8 1 v1 单位 香港中文大学
  • python函数参数里面带*是什么意思

    文章参考 https blog csdn net jiangkejkl article details 121346940 1 函数参数定义中使用独立的符号 在函数定义时 使用了一个独立的符号 这表示在符号后面的参数 调用函数时 必须使用k
  • NAPI机制分析

    NAPI机制分析 NAPI 的核心在于 在一个繁忙网络 每次有网络数据包到达时 不需要都引发中断 因为高频率的中断可能会影响系统的整体效率 假象一个场景 我们此时使用标准的 100M 网卡 可能实际达到的接收速率为 80MBits s 而此
  • 解决 IDEA中springboot项目 修改页面无法生效问题

    解决 IDEA中springboot项目 修改页面无法生效问题 之前网上找了很多解决办法 都是无效的 所以找到解决办法后 先发个博客说一下 至此就完成了springboot 无需重启则对html修改生效 如出现偶尔无效时 请刷新浏览器 之前
  • Linux下使用Git上传和更新代码

    一 上传代码 1 去github上根据网站的提示来创建自己的远程Repository 仓库 2 建立本地git仓库 git init 注意 此指令本地源码根目录执行 执行成功后 会在当前目录生成一个隐藏的名字为 git 的目录 所有对本地仓
  • 【ClickHouse数据库】如何在Win10的Ubuntu上通过ClickHouse存取行情数据

    如何在Win10的Ubuntu上通过ClickHouse存取行情数据 前言 一 ClickHouse是什么 二 如何在Ubuntu上安装ClickHouse 三 添加用户并设置密码 四 使用 1 使用DBeaver操作数据库 2 向Clic
  • 计算机图形学方向和前景&&3D

    我是刚入坑计算机图形学的小菜鸟 在百度上搜索计算机图形学方向和前景和3D 几乎不能搜到什么有用的东西 google还能搜到些有用的 但是需要翻墙 恰好前几天山大承办的games 北京大学陈宝权老师提出了图形学的新疆界 10个左右的国内图形学
  • vue 如何获取input中光标位置,并且点击按钮在当前光标后追加内容

    1 第一步 监听输入框的鼠标失焦事件
  • (原创)c++11中的日期和时间库

    c 11提供了日期时间相关的库chrono 通过chrono相关的库我们可以很方便的处理日期和时间 c 11还提供了字符串的宽窄转换功能 也提供了字符串和数字的相互转换的库 有了这些库提供的便利的工具类 我们能方便的处理日期和时间相关的转换
  • linux服务器管理与维护,linux服务器管理与维护速训..ppt

    linux服务器管理与维护速训 入门级命令 1990年秋天 Linus在芬兰首都赫尔辛基大学学习操作系统课程 因为上机需要排队等待 Linus买了台PC机 开发了第一个程序 程序包括两个进程 分别向屏幕上写字母A和B 然后用定时器来切换进程
  • mysql必考知识_可能是全网最好的MySQL重要知识点 !面试必备

    标题有点标题党的意思 但希望你在看了文章之后不会有这个想法 这篇文章是作者对之前总结的 MySQL 知识点做了完善后的产物 可以用来回顾MySQL基础知识以及备战MySQL常见面试问题 Python资源共享群 484031800 什么是My
  • 在GPU上实现光线跟踪

    include cuda h include book h include cpu bitmap h define DIM 1024 生成图像的大小 DIM DIM define SPHERES 20 生成的图像中球体的个数 define
  • Laplace smoothing in Naïve Bayes algorithm(拉普拉斯平滑)

    在这里转载只是为了让不能够科学搜索的同学们看到好文章而已 个人无收益只是分享知识 顺手做个记录罢了 原网址 https towardsdatascience com laplace smoothing in na C3 AFve bayes
  • 走进计算机的0和1

    一 计算机的产生在历史的长河中 人类发明和创造了许多算法与计算工具 在我国商朝时期就有算珠 春秋战国时期的算表 唐宋时期的算盘 欧洲在16世纪也发明了许多的计算工具 经过一系列的发展 知道1946年一月 世界上第一台计算机诞生 计算机比较笨
  • matlab 神经网络设计多层隐含层_【MATLAB深度学习】多层神经网络

    多层神经网络 对于多层神经网络的训练 delta规则是无效的 因为应用delta规则训练必须要误差 但在隐含层中没有定义 输出节点的误差是指标准输出和神经网络输出之间的差别 但训练数据不提供隐藏层的标准输出 真正的难题在于怎么定义隐藏节点的
  • 【Python】`*args` 和 `**kwargs`的用法【最全详解】

    args 和 kwargs的用法 猛滴打开博客 发现实在有段时间没更新了 又刚好用到了 kwargs 遂想起了许久之前总结的这篇博客 夸张点说也算是自己的一个呕心沥血之作吧 相信不少同学在看大神的程序时 总会看见 args kwargs 这