整理自《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 用法笔记相关推荐

  1. python基本使用-python基本用法笔记合集

    PYTHONPATH PYTHONPATH是python moudle的搜索路径.即import xxx会从$PYTHONPATH寻找xxx. 中文编码问题 coding=utf-8 查看导入的包的路 ...

  2. python *args用法_python函数参数*args**kwargs用法实例

    #coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...

  3. 【Tools】python环境操作笔记

    python环境操作笔记 1.安装Python虚拟环境 2.python pip 添加清华镜像 3.Ubuntu卸载python后出现系统崩溃以及各种问题的解决方法 4.Python下关于 tkint ...

  4. Python基础入门笔记(二)

    前言 本文主要为 Python基础入门笔记(一)内容的补充. 一.迭代器和生成器 1.1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元 ...

  5. python模块学习笔记

    python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...

  6. python小甲鱼笔记

    提示:python小甲鱼笔记 文章目录 前言 〇.函数 1.常用基本函数 2.常用表函数 3.常用子函数 4.输入.输出 5.字符串函数 5.快捷键 一.常用函数案例 1.文本输出 2.猜数 if 实 ...

  7. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  8. python 慕课课程笔记(一)

    python 慕课课程笔记 1.python 是动态语言,而 java 是静态语言.动态语言变量本身的类型时不固定的,而静态语言在变量定义时就必须指定变量的类别. 2. 在python 代码中书写 a ...

  9. Python 网络爬虫笔记9 -- Scrapy爬虫框架

    Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

最新文章

  1. 【100题】第五十九题 用C++编写不能被继承的类
  2. enkey java_近期的Java项目(前端)
  3. linux 下mysql5.7+使用group by、order by报错ONLY_FULL_GROUP_BY不修改配置文件
  4. kubeadm部署k8s集群(1.9.2)
  5. php imagemagick psd,Centos下ImageMagick处理CR2, ARW, EPS, PSD, TIFF,AI等其他RAW格式图片的使用方法...
  6. PTAM(parallel Tracking and Mapping)
  7. Vue 自定义指令里面获取Vue实例 实现v-copy与i18n结合。
  8. kindle不能接收qq邮箱超大附件
  9. Acwing-4454. 未初始化警告
  10. 华为服务器cpu型号,服务器cpu型号 数字
  11. Dynamics CRM: 权限问题之SecLib::AccessCheckEx2 failed
  12. YouBank数字钱包
  13. AndroidTagView 云标签
  14. android学习笔记之磁场传感器制做指南针
  15. 感知算法-超声波三角定位测量方法
  16. 剑指offer中使用辅助栈方法的题目的整理(待更)
  17. switch 语句的参数类型
  18. windows dos 常用指令
  19. Unity 判断是否为预制体的根节点
  20. proxmox换源_Proxmox VE 5.4升级到Proxmox VE 6(中国源加速)

热门文章

  1. 写一个学生类,属性:学生姓名、性别、考试成绩、年龄;写一个班级类,属性:班级名、班主任名字、所有的学生(数组)。 班级类有方法: (一)获得班级所有学生的平均年龄; (二)获得班级的所有学生总成
  2. SQL Server常见面试题
  3. 1996亚特兰大奥运会闭幕歌曲《The Power Of The Dream》铃声 ...
  4. 新闻集团正式对《泰晤士报》网络版收费
  5. 重量级ORM框架--持久化框架Hibernate【基础入门】
  6. 【三十六】Python全栈之路--MySQL
  7. 通过PHP调用天市数据的全国交通违章查询接口
  8. 中年程序员跳槽常见的6个原因!
  9. Android调用相机时找不到android.support.v4.content.FileProvider unresolved package 'content'
  10. 《故障诊断与python学习》学习资料记录