【python】*与** 参数问题

2023-05-16

原文地址:https://www.cnblogs.com/paulwinflo/p/5764748.html


可变参数


在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。


我们以数学题为例子,给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……。


要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下:


def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
但是调用的时候,需要先组装出一个list或tuple:


>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84
如果利用可变参数,调用函数的方式可以简化成这样:


>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
所以,我们把函数的参数改为可变参数:


def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
定义可变参数和定义list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:


>>> calc(1, 2)
5
>>> calc()
0
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:


>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:


>>> nums = [1, 2, 3]
>>> calc(*nums)
14
这种写法相当有用,而且很常见。


关键字参数


可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:


def person(name, age, **kw):
    print 'name:', name, 'age:', age, 'other:', kw
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:


>>> person('Michael', 30)
name: Michael age: 30 other: {}
也可以传入任意个数的关键字参数:


>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。


和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:


>>> kw = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=kw['city'], job=kw['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
当然,上面复杂的调用可以用简化的写法:


>>> kw = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **kw)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
参数组合


在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。


比如定义一个函数,包含上述4种参数:


def func(a, b, c=0, *args, **kw):
    print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。


>>> func(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> func(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> func(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> func(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
最神奇的是通过一个tuple和dict,你也可以调用该函数:


>>> args = (1, 2, 3, 4)
>>> kw = {'x': 99}
>>> func(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}
所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。


小结


Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。


默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!


要注意定义可变参数和关键字参数的语法:


*args是可变参数,args接收的是一个tuple;


**kw是关键字参数,kw接收的是一个dict。


以及调用函数时如何传入可变参数和关键字参数的语法:


可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));


关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。


使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

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

【python】*与** 参数问题 的相关文章

  • 烧写自定义ArduPilot到自定义的开发板

    写在前面的话 xff1a 本篇章内容参看 怒飞垂云 的资料 将APM固件移植到自制硬件 实际操作过程中 xff0c 需要如下几个步骤 xff1a 先在ardupilot中的 waf distclean 完成清理 xff0c 主要删除了bui
  • 跨域资源共享CORS的那些事(二)

    跨域资源共享CORS的那些事 xff08 二 xff09 最近在为高性能开源API网关apisix写跨域插件 xff0c 发现该功能对协议要求要比较熟悉 xff0c 借此机会重新复习下跨域协议 xff0c 以及简要写下跨域功能的设计 文章目
  • 宅家学习,如何进行Kubernetes Ingress控制器的技术选型?

    导语 xff1a 在Kubernetes的实践 部署中 xff0c 为了解决 Pod 迁移 Node Pod 端口 域名动态分配等问题 xff0c 需要开发人员选择合适的 Ingress 解决方案 面对市场上众多Ingress产品 xff0
  • Linux下connect()函数的错误代码对应含义

    Linux下connect 函数的错误代码对应含义 windows和linux下的connect系统接口有自己的一套返回码以及返回含义 Linux EBADF xff1a 参数socket未指定一个合法的描述符ENOTSOCK 参数sock
  • git设置用户名密码

    git设置用户名密码 设置git用户名 xff0f 邮箱 span class hljs comment git span span class hljs comment config span span class hljs litera
  • 'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    python 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 我将python安装在D盘之后 xff0c 输入python xff0c 显示如下问题 span class hljs keyword D span gt pyt
  • git pull时遇到error: cannot lock ref 'xxx': ref xxx is at (一个commitID) but expected的解决办法

    git pull时遇到error cannot lock ref xxx ref xxx is at xff08 一个commitID xff09 but expected的解决办法 在执行git pull时遇到如下错误 xff1a spa
  • tar.gz和tar.bz2解压命令

    tar gz和tar bz2解压命令 网络上下载到linux源码包主要是tar gz和tar bz2压缩格式的 xff0c 有一部分是zip 解压tar gz命令是 tar zxvf xx tar gz 解压tar bz2的命令是 tar
  • 使用VS CODE+PlantUML高效画图

    使用VS CODE 43 PlantUML高效画图 自从发现了plantuml写脚本画图的方式之后 xff0c 爱上了画图 环境 xff1a MAC 前言 本文多数内容引用自官网文档和其他人的教程 xff0c 并非本人原创 xff0c 也谈
  • CMake多工程最小实现

    背景 xff1a 最近团队的新项目开始基于CMake作为工程管理 xff0c 结合VSCode作为IDE进行开发 xff0c 一个原因当然是为了可支持跨平台 原来我们的开发环境是使用VS系列IDE进行开发 xff0c 在底层框架完全改为CM
  • c++ aggregate 'std::stringstream ss' has incomplete type and cannot be defined

    c 43 43 aggregate std stringstream ss has incomplete type and cannot be defined 这个问题是使用了stringstream这个类 xff0c 但没有包含头文件ss
  • 阿里巴巴的“达摩院”,必是一场闹剧

    阿里巴巴的 达摩院 xff0c 必是一场闹剧 今天上午 xff0c 阿里巴巴成立 达摩院 xff0c 引入顶尖科学家3年研发投入将超千亿 的文章在网上刷屏了 在我看来 xff0c 马云在挑战科技规律 xff0c 这必是一场闹剧 前几年 xf
  • 一种解耦非线性优化的高效VI-SLAM系统-Snake-SLAM

    摘要 Snake SLAM 是一种可在低功率航空设备上稳定运行的VI SLAM 自主导航系统 跟踪前端具有地图复用 闭环 重定位功能 xff0c 并支持单目 立体和 RGBD 输入 该系统通过图论算法来减少关键帧并提出一种 延时地图 的方法
  • 关于视觉三维重建colmap 一期课程,我想说点什么

    为什么开colmap这门课 2019年硕士毕业进入驭势科技从事高精度地图算法职位 xff0c 闲暇时间便开启自己在B站上分享技术的历程 xff0c 如下早期视频 xff1a 但是发完这几次视频后 xff0c 发现每次录制的时候总会遗漏自己想
  • 关于视觉重定位(VPS)的工作经验分享

    在AR领域也呆了不短时间了 xff0c 也一直在做视觉定位相关的工作 xff0c 这里分享一下有意思的工作方向 xff0c 感兴趣的可以讨论或者联系我即可 首先简单区分AR和VR的区别 xff0c VR 属于虚拟现实 xff0c 即是由实入
  • python调用百度地图API 实现单点沿线轨迹运动

    百度地图API 可以做很多好玩的事情 xff0c 自己闲来无事 xff0c 先是照着一些资料做了热力图 xff0c 然后借助pyqt5做了一个简单的界面 xff0c 实现gps单点沿线 xff08 行车 xff09 的轨迹 先上程序界面和效
  • python 在测绘作业中的一些小应用(与cad交互)-1

    虽然笔者已经基本上告别了本科的测绘工程专业 xff0c 但是笔者的本科同学他们在实际作业中难免会遇到一些批量化 重复性劳动问题 xff0c 如果会编程 xff0c 写上一个小脚本 xff0c 无疑会提高工作效率 下面是笔者本科同学处理测量数
  • 阴影检测(shadow detect)

    不管是无人机影像或者其它方式摄取的图像 xff0c 由于光照 xff0c 难免会存在阴影 xff0c 笔者这篇文章介绍检测阴影一种简单的方式 参考论文 xff1a 1 Damaged Building Detection in Aerial
  • Scipy 和opencv 计算凸包(convexHull)

    凸包 xff1a 在数学中 xff0c 在实向量空间 V 中的一组点 X 的凸包或凸包络是包含 X 的最小凸集 来自 Wikipedia 通俗的来说就是包围一组散点的最小凸边形 在 scipy spatial 和 opencv 分别有计算凸
  • python 两个小技巧将字典写入txt或者json 文件

    1 不用 json 包 先来看一个 Python 的奇淫技巧 i 61 100 s1 61 str i 这样输出的不会是 100 xff0c 毫不疑问 但是 s1 61 43 str i 43 这样输出的结果 61 str i 于是看这一条

随机推荐

  • 时间序列预测——ARIMA模型

    文章链接 xff1a 时间序列预测 Prophet模型 https blog csdn net beiye article details 123353123 spm 61 1001 2014 3001 5502 SPSS软件实操 ARIM
  • 基本矩阵F和本质矩阵E的详细推导

    基本矩阵F E在计算机视觉中是提纯匹配点 恢复相机位姿的一个法宝 但是它是如何得到的 下面笔者做其简单的推导 如图下图 xff0c 两视几何图 其中C和C 分别代表左 右摄影中心 xff0c x和x 代表同名像点 xff0c e和e 代表极
  • [ubuntu]安装并使用python 3.6及与2.7的切换

    当前使用ubuntu14 04 1 添加python3 6安装包 xff0c 并安装 xff08 也可以去官网下载安装包 xff09 linux 报错E Unable To Locate Package Software propertie
  • Python + Requests 模拟登陆(含验证码)

    其实模拟登陆非常简单 xff0c 只要在打开网站的同时提交数据就可以了 下面通过登陆超星网来举例说明如何一步步实现模拟登陆 1 获取需要提交的数据 使用chrome的Network或者fiddler可以很轻易的得到我们想要的数据 xff0c
  • Cmake实现递归cpp和h

    为解决获取编译链所有C 43 43 源文件和头文件 Cmake实现递归目录 编程心得 拾随小笺
  • 鉴权 前后端常见的几种鉴权方式

    https juejin cn post 6844903927100473357 鉴权 xff08 authentication xff09 是指验证用户是否拥有访问系统的权利 传统的鉴权是通过密码来验证的 这种方式的前提是 xff0c 每
  • curl指令模拟postman发json数据,发本地文件

    菜鸟curl指令介绍 xff1a https www coonote com linux linux cmd curl html post formdata多个参数 多个参数可以使用 F进行串接 curl span class token
  • 最全的HTTP(get post)请求示例, 包括post模拟get请求

    public class HttpRequest private static SimpleDateFormat sdf 61 new SimpleDateFormat 34 yyyyMMddHHmmss 34 private static
  • python爬虫——模拟登陆

    参考链接 xff1a https blog csdn net weixin 39875941 article details 109878457 模拟登陆 Python网络爬虫应用十分广泛 xff0c 但是有些网页需要用户登陆后才能获取到信
  • vector数组 传递 引用 指针 参数

    一 一维 span class hljs stl container span class hljs built in vector span lt span class hljs keyword int span gt span vec
  • Oracle # 字符串匹配函数(Oracle、SQLSERVER、Excel)

    引言 xff1a 当数据库设置字段的时候 xff0c 会设置1表XXX xff1b 0表示XXX 查询的时候怎么显示汉字呢 xff1f Oracle数据库 xff1a 普通查询数据 xff1a select from U ORANGEZAT
  • 时间序列预测——Prophet模型

    文章链接 xff1a 时间序列预测 ARIMA模型 https blog csdn net beiye article details 123317316 spm 61 1001 2014 3001 5502 1 Propht模型概述 Pr
  • 机器人导航——路径跟踪

    要完成一套完整的机器人路径规划 xff0c 并完成其物理实验并非一件简单的事情 参考 xff1a http wenku baidu com link url 61 n11mP6EDlM78NZYZ4yQYXzmzPeBV6BeLNOUjIv
  • python 读取txt出现\xef\xbb\xbf…的问题

    用python读取txt文件 xff0c 文件的内容是一列数如下 xff1a 1883 1886 1900 1900 1897 1897 1897 1897 1906 1917 1910 1910 但是读取的时候第一个元素为 xef xbb
  • (算法)判断两个区间是否重叠

    题目 xff1a 判断两个区间是否重叠 思路 xff1a 假设区间表示为 start end xff0c 先存在两个区间A B 两个区间的关系有两种 xff1a 重叠与不重叠 重叠的情况有4种 xff0c 两种相交 xff0c 两种包含 x
  • python ctrl+c 退出while True:

    写了一个死循环 xff0c 类似 xff1a def function while True my code 程序运行后想用ctrl 43 c按键停止程序 xff0c 可是终止不了 以下为解决办法 xff1a 第一步 xff1a 加入sys
  • python二维字典

    感谢原文 xff1a http www jb51 net article 83108 htm 本文实例讲述了Python的 二维 字典 two dimension dictionary 定义与实现方法 分享给大家供大家参考 xff0c 具体
  • ros安装出现依赖问题

    http www liuxiao org 2015 10 ros E5 9C A8 ubuntu 14 04 E7 B3 BB E7 BB 9F E4 B8 8A E5 AE 89 E8 A3 85 ros indigo 0 安装环境 xf
  • KMP算法介绍

    参考 xff1a https www cnblogs com c cloud p 3224788 html 前言 之前对kmp算法虽然了解它的原理 xff0c 即求出P0 Pi的最大相同前后缀长度k xff1b 但是问题在于如何求出这个最大
  • 【python】*与** 参数问题

    原文地址 xff1a https www cnblogs com paulwinflo p 5764748 html 可变参数 在Python函数中 xff0c 还可以定义可变参数 顾名思义 xff0c 可变参数就是传入的参数个数是可变的