Python 中的 *args 和 **kwargs

在阅读 Python 代码的过程中,不时会看到 *args 和 **kwargs ,它们究竟表示什么?又该如何使用呢?

首先要明确,这里的 * 并不是乘法运算符也不是序列重复操作符,**也不是指数运算符也不是幂运算符。

  • * 出现在列表变量前时,表示将列表元素解包,可将列表元素分配给多个变量;
  • ** 出现在字典变量前时,表示将字典解包,可将字典中的键值对生成以键名称为变量名称的变量值对;

它们的名称中都包含字符 "args",表示它们都与函数参数传递相关。

我们先来看一下 Python 函数参数传递方法。

在定义 Python 函数时,通常情况下参数数量和参数类型和名称都是确定的。参数可分为位置参数命名参数

位置参数:参数的含义和参数的位置密切相关。比如在下面的网络连接函数定义中,第一个参数表示要连接的目标主机名称,第二个参数表示目标端口,第三个参数表示用户名称,第四个参数表示用户密码。

def net_connect(host, port, user, pass):

用户在调用上面的函数时,必须按照上面定义的顺序传入相应的参数,否则就会导致错误。

 net_connect('login.example.com', 8888, 'guest', 'guest')

命名参数:参数有名称,传递参数值时需要指定参数的名称。

将上面示例中的函数按命名参数,可重新定义如下:

def net_connect(host='localhost', port=8888, user='guest', pass='guest') 

通过命名参数,可以设定参数的默认值,即在调用函数时,如果没有显式指定参数,则使用默认值。 下面的调用方式都是等价的。

net_connect()

net_connect(host='localhost')

net_connect(port=8888)

net_connect(user='guest')

net_connect(pass='guest')

使用命名参数后,参数位置可以互换。下面的调用方式都是等价的。

net_connect(port=80, pass='guest', user='guest', host='localhost')

net_connect(pass='guest', user='guest', host='localhost', port=80)

net_connect(user='guest', pass='guest', host='localhost', port=80)

net_connect(user='guest', host='localhost', pass='guest', port=80)

位置参数和命名参数可以同时出现,但位置参数必须在所有命名参数左侧。

上面的示例函数改写如下:

def net_connect(host, port, user='guest', pass='guest')

讲了这么多,那 *args 和 **kwargs 又该如何使用呢?

在调用函数时,可以通过对列表解包和字典解包来传递参数。

target = ['localhost', 8888]

credential  = {'user':'guest', 'pass':guest'}

net_connect(*target, **credentail)

特别是参数数量会根据实际情况变动时,我们可以根据条件构造字典项,然后在调用函数时将字典解包即可,这样就可以避免复杂的条件判断给函数传递不同的参数。

在对已有函数进行封装时,通常利用 *args 和 **kwargs 向目标函数传递参数。

def target_func(....):

...

def my_func(arg1, arg2, arg3, *args, **kwargs) :

      ...

      target_func(*args, **kwargs)

如果函数定义时使用了列表解包或字典解包,我们可以分别通过 list 和 dict 来遍历参数。

def func_name(*args, **kwargs):

      for item in args:

          ...

      for k, v in kwargs.items():

          ...

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

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

相关文章

JS继承与原型、原型链

在 JavaScript 中,继承是实现代码复用和构建对象关系的重要概念。本文将讨论原型链继承、构造函数继承以及组合继承等几种常见的继承方式,并提供相应的示例代码,并分析它们的特点、优缺点以及适用场景。 在开始讲解 JavaScript 的继承方式之…

基于javassmJSP的家用电器销售网站

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

day31 算法 贪心算法1

455 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有…

软件质量保证计划书

1 概述 2 质量目标 3 项目基本情况 4 资源 4.1 人员 4.1.1 组织结构 4.1.2 职责 4.2 工具及设施 5 质量保证的主要工作 6 质量保证工作量估算 7 质量保证工作提交的产物 8 变更管理 9 评价标准 10 形成的记录 软件全资料获取进主页或者本文末个人名片直接获取。

Spring/SpringBoot/SpringCloud Mybatis 执行流程

在后续分析Mybatis 流程中代码的可能会用到IDEA debug 技巧: 条件断点 代码断点,右键 勾选弹窗 Condition : 写入表达式 回到上一步: Java动态代理实现 InvocationHandler接口: package com.lvyuanj.core.test;…

Unity:2D SpriteShape

1.1 简介 Sprite Shape 可以很灵活的更改sprite的轮廓。比如: 它由两部分组成:Sprite Shape Profile、Sprite Shape Controller,需要导入2D Sprite Shape Package. 1.1.1 Sprite导入要求 Texture Type - ‘Sprite (2D and UI)’.Sprite Mo…

备战蓝桥杯---刷二分与前缀和题

刷点题~ 1.二分多路归并算法 对于每一个技能,我们把它看成一个等差数列,我们把所有可能都放到一个集合里,排个序,取前m个大即可,现在考虑优化,假如m不是很大,我们直接用优先队列即可&#xff0…

python写文件怎么读出来

python中对文件的操作大概分为三步:打开文件、操作文件(读、写、追加写入)、关闭文件。 1、无论对文件做哪种操作,操作前首先要保证文件被打开了,即需要一个打开的操作。 例:open(XXX.txt) 打开文件的同…

python函数练习2

找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) def func():for i in range(1,50):if (i % 5 0 or i % 6 0 ):if i % 5 0 and i % 6 0:continue #利用continue跳过能被5和6整除的数print(i) func()写一个方法,计算…

【DevOps工具篇】Keycloak安装配置及脚本化

目录 脚本化要求步骤步骤1:安装并启动Keycloak服务器 [](#step-1-installing-and-starting-the-keycloak-server)分发文件进行安装Docker映像进行安装在OpenShift内的Docker映像中安装步骤2:连接管理CLI [](#step-2-connecting-the-admin-cli)步骤3:配置 [](#step-3-configu…

C#智慧手麻系统源码 医院手术麻醉系统源码 支持三甲医院评级需求 可提供演示

C#智慧手麻系统源码 医院手术麻醉系统源码 支持三甲医院评级需求 可提供演示 手术麻醉管理系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期,对病人进行全程跟踪与信息管理,自动集成病人HIS、LIS、RIS、PACS信息,采…

Autosar工具链配置 CanNM

CAN网络管理filter 网管报文范围0x600~0x6FF repeat message time 超时时间 接收到主动唤醒源,网管报文快发周期,次数;正常周期发送时间 网管报文btye设置:1、重复消息请求位设置 2、ECU地址 wait bus-sleep 定时设置以及网管报…

华为云1核2G免费使用一年

个人用户专享云服务器、云数据库产品每天上午9:30开抢,其他产品每天0点开放领取,企业用户所有产品每天0点开放领取; 云产品体验名额有限,领完即止。详情:https://www.vpspick.com/vps/591.html 通用入门型 T6 云服务…

将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件

实现文件流PDF不需要预览直接调用打印机打印实现方案就是,将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件。源码地址

2024免费Mac苹果解压压缩包软件BetterZip5

在2024年,对于Mac电脑用户来说,如果你想要无需解压就能快速查看压缩文档的内容,BetterZip是一个极佳的选择。这款软件不仅支持多种格式的压缩和解压,如zip、rar、7z、tar等,还具备丰富的功能和设置,包括预览…

Vue后台管理系统常用组件的优缺点分析

以下是Vue后台管理系统常用组件的优缺点分析: Element UI 优点: 丰富的组件库:Element UI 提供了大量的组件,包括表单、表格、弹窗、导航等,可以满足各种后台管理系统的需求。易于使用:Element UI 的组件…

数据结构面试题(含答案)

1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5.下列关于栈的叙述正确的是(D) A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出…

QT-QPainter

QT-QPainter 1.QPainter画图  1.1 概述  1.1 QPainter设置  1.2 QPainter画线  1.3 QPainter画矩形  1.4 QPainter画圆  1.5 QPainter画圆弧  1.6 QPainter画扇形 2.QGradient  2.1 QLinearGradient线性渐变  2.2 QRadialGradient径向渐变  2.3 QConicalGr…

二、GitLab相关操作

GitLab相关操作 一、组、用户、项目管理1.创建组2.创建项目3.创建用户并分配组3.1 创建用户3.2 设置密码3.3 给用户分配组 二、拉取/推送代码1.配置ssh(第一次需要)1.1 创建一个空文件夹1.2 配置本地仓账号和邮箱1.3 生成ssh公钥密钥1.4 gitlab配置公钥 2.拉取代码3.推送代码3.…

Ubuntu系统进行深度学习时查看GPU、CPU实时使用情况等

文章目录 静态查看GPU使用情况动态查看GPU使用情况查看CPU使用情况 主要用到了 nvidia-smi和 top命令。 静态查看GPU使用情况 nvidia-smi动态查看GPU使用情况 -n后面的数字是更新的时间间隔: watch -n 1 nvidia-smi-n 1代表每隔1秒刷新一次,ctrlc退…