Python *args 用法笔记
整理自《Effective Python 编写高质量 Python 代码的 59 个有效方法》第 18 条。
1. 定义、用法
在 def 语句中使用 *args,即可令函数接受数量可变的位置参数。
比如确定一个函数接收 message 信息参数和 values 值参数,但不确定 values 有几个值,解决方法可以把 values 定义成列表,有数据就塞入列表,无数据就空列表,得到如下函数代码:
def log(message,values):if not values:print(message)else:value_str = ", ".join(str(x) for x in values)print(f"{message}: {value_str}")log("My numbers are",[1,2])
log("Hi",[])
倘若不想使用列表,就想直接将 values 值一个个作为参数传入函数,可以在最后的位置参数前加 * 表示可以跟随任意数量的位置参数:
def log(message,*values):if not values:print(message)else:value_str = ", ".join(str(x) for x in values)print(f"{message}: {value_str}")log("My numbers are",1,2)
log("Hi")
此时就不需要将 values 做成列表来传入了,有数据就传,没数据就空着。
2. * 操作符分解序列
此外,我采用了刚 *values 的位置参数标注法,但我现在拿到的是个列表,想把列表中的元素作为参数传上去,这个要怎么处理,总不能再重写个函数吧?这里就要用到在列表前加星号了,看代码,函数定义不变,但调用函数传参数时给列表前加个星号:
def log(message,*values):if not values:print(message)else:value_str = ", ".join(str(x) for x in values)print(f"{message}: {value_str}")log("My numbers are",1,2)
log("Hi")
# 看这里
log("My numbers are",*[1,2,3,4,5])
这种 *[1,2,3,4,5] 的形式就是对列表拆解,将其中元素拿出来当参数使用
3. 可能耗尽内存并崩溃
变长参数传给函数时,总是要先转化成元组。那么当我们把刚刚 *[1,2,3,4,5] 要拆解的列表换成个生成器,把它当参数传入函数时,Python 就必须把该生成器完整迭代一轮将所有生成的值放入元组,这就有可能消耗大量内存并导致程序崩溃。
使用 *args 来表示任意参数主要是为了简化程序员编码工作,并使代码更加易读。
4. 可能产生难以排查的 bug
对于已经使用 *args 位置参数的函数,如果以后要给函数添加新的位置参数,那就必须修改原来调用该函数的旧代码。若只在参数列表前添加新的位置参数,而不更新现有的调用代码,则可能会产生难以调试的错误。
例如我们在刚刚代码基础上添加个 sequence 参数:
def log(sequence,message,*values):if not values:print(message)else:value_str = ", ".join(str(x) for x in values)print(f"{sequence}:{message}: {value_str}")# 正常
log(1,"My numbers are",1,2)
# 错误,但不报错
log("My numbers are",7,33)
添加了新参数、但仍按之前某种方式调用时,参数混乱配置,但没抛出异常仍是正常运行。
为了彻底避免此类情况,我们应该使用只能以关键字形式指定的参数(keyword-only argument) 来扩展这种接受 *args 的函数。
Python *args 用法笔记相关推荐
- python基本使用-python基本用法笔记合集
PYTHONPATH PYTHONPATH是python moudle的搜索路径.即import xxx会从$PYTHONPATH寻找xxx. 中文编码问题 coding=utf-8 查看导入的包的路 ...
- python *args用法_python函数参数*args**kwargs用法实例
#coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...
- 【Tools】python环境操作笔记
python环境操作笔记 1.安装Python虚拟环境 2.python pip 添加清华镜像 3.Ubuntu卸载python后出现系统崩溃以及各种问题的解决方法 4.Python下关于 tkint ...
- Python基础入门笔记(二)
前言 本文主要为 Python基础入门笔记(一)内容的补充. 一.迭代器和生成器 1.1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元 ...
- python模块学习笔记
python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...
- python小甲鱼笔记
提示:python小甲鱼笔记 文章目录 前言 〇.函数 1.常用基本函数 2.常用表函数 3.常用子函数 4.输入.输出 5.字符串函数 5.快捷键 一.常用函数案例 1.文本输出 2.猜数 if 实 ...
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- python 慕课课程笔记(一)
python 慕课课程笔记 1.python 是动态语言,而 java 是静态语言.动态语言变量本身的类型时不固定的,而静态语言在变量定义时就必须指定变量的类别. 2. 在python 代码中书写 a ...
- Python 网络爬虫笔记9 -- Scrapy爬虫框架
Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...
最新文章
- 【100题】第五十九题 用C++编写不能被继承的类
- enkey java_近期的Java项目(前端)
- linux 下mysql5.7+使用group by、order by报错ONLY_FULL_GROUP_BY不修改配置文件
- kubeadm部署k8s集群(1.9.2)
- php imagemagick psd,Centos下ImageMagick处理CR2, ARW, EPS, PSD, TIFF,AI等其他RAW格式图片的使用方法...
- PTAM(parallel Tracking and Mapping)
- Vue 自定义指令里面获取Vue实例 实现v-copy与i18n结合。
- kindle不能接收qq邮箱超大附件
- Acwing-4454. 未初始化警告
- 华为服务器cpu型号,服务器cpu型号 数字
- Dynamics CRM: 权限问题之SecLib::AccessCheckEx2 failed
- YouBank数字钱包
- AndroidTagView 云标签
- android学习笔记之磁场传感器制做指南针
- 感知算法-超声波三角定位测量方法
- 剑指offer中使用辅助栈方法的题目的整理(待更)
- switch 语句的参数类型
- windows dos 常用指令
- Unity 判断是否为预制体的根节点
- proxmox换源_Proxmox VE 5.4升级到Proxmox VE 6(中国源加速)
热门文章
- 写一个学生类,属性:学生姓名、性别、考试成绩、年龄;写一个班级类,属性:班级名、班主任名字、所有的学生(数组)。 班级类有方法: (一)获得班级所有学生的平均年龄; (二)获得班级的所有学生总成
- SQL Server常见面试题
- 1996亚特兰大奥运会闭幕歌曲《The Power Of The Dream》铃声 ...
- 新闻集团正式对《泰晤士报》网络版收费
- 重量级ORM框架--持久化框架Hibernate【基础入门】
- 【三十六】Python全栈之路--MySQL
- 通过PHP调用天市数据的全国交通违章查询接口
- 中年程序员跳槽常见的6个原因!
- Android调用相机时找不到android.support.v4.content.FileProvider unresolved package 'content'
- 《故障诊断与python学习》学习资料记录