10、Python之写出更加Pythonic的代码:unpacking拆包机制

引言

有些小伙伴有其他编程语言的学习、使用的经验,然后迁移到Python。一般会比完全的新手小白,更快速地把Python用起来。这是他们的优势,但也是他们的劣势。
之所以这么说,是因为从其他编程语言带过来的,除了相通的编程思维、框架性的东西,还有编程语言的使用习惯。
而这些其他编程语言中的使用习惯,就会导致他们写出来的Python代码不是那么的Pythonic,当然,这是一种感觉。
虽说我们首要追求的是能用、够用。但是,偶尔也要稍微留意一下。就好像学习英语一样,虽然不追求能操着一口正宗的英伦腔,但也不应该对自己的chinglish迷之自信。
此外,故步自封于其他编程语言中的编程习惯,也可能限制我们更加灵活、便捷地发挥Python中的强大特性。

变量值交换

其他语言中,如果需要交换两个变量,通常需要引入一个中间变量,比如:

a = 5
b = 10
c = b
b = a
a = c

在Python中还这样写,就显得有些冗余、不够地道了。
其实,在Python中有一种更加简便的写法:

x = 5
y = 10
x, y = y, x

不需要引入中间变量,直接完成变量值的交换。我看有些地方把Python中的这种变量值交换,称之为unpacking机制。所以,我在今天的这篇讲解unpacking机制的文章中提到了这一点。

但是,也许是Python不同版本、Python解释器实现的差异,在我的Python3.11、CPython解释器的环境下,查看对应的字节码,发现并没有用到unpacking机制,而是Python中提供了一个用于进行栈顶两个值交换的swap指令。对应的字节码指令及解释,如下图所示:感兴趣的可以自行查看自己环境中变量值交换的实现。

基础unpacking机制

接下来,说回今天的主题,unpacking机制。
既然是unpacking,有些地方翻译为拆包,自然首先要有包可拆。这里所谓的拆包,其实是针对容器/集合类型的数据结构来说的。

通常情况下,我们把一个列表、元组或者是字典中的元素取出来,可以使用下标索引的方式。
比如,有如下场景:
我们有一些人员信息存放在一个列表中,每个列表元素是一个元组,元组中的元素,分别是姓名、年龄、性别。
现在,我们需要遍历人员信息的这个列表,然后将人员信息进行格式化打印输出。
使用下标索引的方式,可以这样实现:

persons = [('张三', 18, '女'), ('小红', 23, '男')]
for p in persons:
    name = p[0]
    age = p[1]
    gender = p[2]
    print(f"姓名: {name}, 年龄: {age}, 性别: {gender}")

但是,这样的写法,不够地道,没有使用Python给我们提供的更加好用的写法。
接下来,我们用unpacking的方式重新写一下:

# unpacking
persons = [('张三', 18, '女'), ('小红', 23, '男')]
for p in persons:
    name, age, gender = p
    print(f"姓名: {name}, 年龄: {age}, 性别: {gender}")

这样写下来,用到了Python中的unpacking,首先代码行数减少了。
是否真的应用到了unpacking机制,还是说跟变量值交换一样,也是人云亦云,我们可以看下对应的字节码序列:

字节码指令序列的其他指令可以不用关心,我们重点看源码第4行的对应指令序列,可以看到:
1、确实触发了unpacking机制;
2、UNPACK_SEQUENCE指令,用于将栈顶的集合变量进行拆包的操作,拆为多少个,指令有一个操作数,此时是3,由操作数决定;
3、拆包指令实现的结果是,栈顶集合变量出栈,按照操作数拆分,然后依次入栈。

unpacking的机制,看似好用,但是,细心的你,可能立马会发现一个问题,如果集合中元素有很多个,此时,我们只需要其中的一部分,怎么办呢。

解决的方法,就是我们在前面的文章中提到过的占位符_的用法。
比如,我们当前,只需要姓名、性别,可以这样改写:

# unpacking
persons = [('张三', 18, '女'), ('小红', 23, '男')]
for p in persons:
    name, _, gender = p
    print(f"姓名: {name}, 性别: {gender}")

所有我们不需要的元素,都可以用占位符进行舍弃,但是,占位符_只是省去了我们给变量取名的麻烦,不需要的元素比较多的时候,似乎还是不太方便,反而不如索引操作方便,好在Python中提供了对应的解决方案。

扩展的unpacking

的变量,在Python中为可扩展的变量。
如下,为带
的unpacking的写法:

# * unpacking
persons = [('张三', 18, 190, '女'), ('小红', 23, 165, '男')]
for p in persons:
    name, *others, gender = p
    print(others)
    print(type(others))
    print(f"姓名: {name}, 性别: {gender}")

代码中,会将除了name接收的第一个元素,以及gender接收的最后一个元素,之外的所有元素,封装为一个列表,由others接收。
从对应的字节码,可以看出有些不同:

首先,翻译为字节码指令序列时,多了EXTENDED_ARG指令,用于扩展变量others;其次拆包的指令,从之前的UNPACK_SEQUENCE变成了UNPACK_EX。

注意,关于带星号定义的可扩展变量,可以理解为不定长列表,可以接收零个或者多个值,后续在函数的定义中也会用到。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gamma生成ppt替代软件推荐!这3款AI工具不容错过!

在各类信息层出不穷的当下,让信息以最有效的方式传递,已成为我们面临的一大挑战。而PPT作为一种广泛使用的信息展示工具,其设计和制作更是影响信息传递效果的关键。 想要制作出既吸引人又具有专业感的PPT,却发现这并非易事&#…

一站式短视频矩阵开发,高效托管!

短视频矩阵系统源码SaaS解决方案提供全面的开发服务,包括可视化视频编辑、矩阵式内容分发托管以及集成的多功能开发支持。 短视频矩阵:引爆您的数字营销革命 短视频矩阵系统是一套多功能集成解决方案,专为提升在短视频平台上的内容创作、管理…

职升网:考取中专文凭的途径主要有三种!

考取中专文凭的途径主要有三种:成人高考、网络教育和自学考试。以下是针对每种途径的详细解释和说明: 成人高考 适合人群:适合已经工作的成年人,特别是希望在工作之余提升学历的人群。 报考层次:可以选择高起专或高…

Transformer中的编码器和解码器结构有什么不同?

Transformer背后的核心概念:注意力机制;编码器-解码器结构;多头注意力等; 例如:The cat sat on the mat; 1、嵌入: 首先,模型将输入序列中的每个单词嵌入到一个高维向量中表示&…

python3 ftplib乱码怎么解决

其实很简单。ftplib.FTP里面有个参数叫encoding。 如上图最后一行。所以在使用FTP时,主动指定编码格式即可。 ftp ftplib.FTP() ftp.encoding "utf-8" 再使用就可以了。

阻尼振动的可视化 包括源码和推导

阻尼振动的可视化 包括源码和推导 flyfish 牛顿第二定律(加速度定律) 胡克定律(Hooke‘s Law) 阻尼振动是指在振动系统中,由于阻力或能量损耗导致振动幅度随时间减小的现象。 左边为无阻尼,右边为有阻尼…

怎么将几首音乐合并在一起?这四种合并方法大家都在用!

怎么将几首音乐合并在一起?在音乐的海洋中遨游时,我们是否曾被音乐的海洋所淹没?在享受旋律的流转中,我们是否频繁地在不同的曲目间穿梭,仿佛迷失在无尽的音符之中?但音乐数量的繁多,不仅带来了…

思维+并查集,1670C - Where is the Pizza?

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1670C - Where is the Pizza? 二、解题报告 1、思路分析 考虑两个数组a,b的每个位置只能从a,b中挑一个 不妨记posa[x]为x在a中位置,posb同理 我们假如位置i挑选a[i]&a…

NISP证书备考指南与经验分享

在信息安全领域,NISP(国家信息安全水平考试)作为衡量专业能力的重要标尺,不仅是职场晋升的敲门砖,更是个人技能提升的关键一步。面对这一挑战,如何高效备考,成为众多学员关注的焦点。今天,为您精心打造这份…

大语言模型垂直化训练技术与应用

在人工智能领域,大语言模型(Large Language Models, LLMs)已经成为推动技术进步的关键力量,垂直化训练技术逐渐成为研究的热点,它使得大模型能够更精准地服务于特定行业和应用场景。本文结合达观数据的分享&#xff0c…

一次零基础 自“信息收集“到“权限维持“的渗透测试全程详细记录

一、渗透总流程 1.确定目标: 在本靶场中,确定目标就是使用各种扫描工具进行ip扫描,确定目标ip。 2.信息收集: 比如平常挖洞使用fofa,天眼查,ip域名等进行查,在我们这个靶场中比如使用Wappalyz…

pdf容量大小怎么改,pdf容量太大怎么变小

在数字化时代,pdf文件因其稳定性和跨平台兼容性而成为工作、学习和生活中不可或缺的文件格式。然而,随着文件内容的丰富,pdf文件的体积也日益增大,给存储和传输带来了不少困扰。本文将为你详细介绍多种实用的pdf文件压缩方法&…

Java文件操作和IO的小案例

文章目录 案例1案例2案例3 案例1 要求: 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。 代码实现: package shixun;import java.io.File; import…

【python学习】快速了解python基本数据类型

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 整数(int)2. 浮点数(float)3. 布尔值(bool&#xf…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言: 问题一:关于string的\0问题讨论 问题二:C标准库中的string内存是分配在堆上面吗? 问题三:string与vector的capacity大小设计的特点 问题四:string的流提取问题 问题五:迭代器失…

运筹说 第118期|存储论奠基人——肯尼斯·约瑟夫·阿罗

1.导读 前面我们已经了解了存储论的相关内容,相信大家一定也有所收获,下面我们将带着大家继续了解存储论的相关内容,在本次文章中我们将一起走近存储论的奠基人之一——肯尼斯约瑟夫阿罗Kenneth J.Arrow,希望能给大家…

In Search of Lost Online Test-time Adaptation: A Survey--论文笔记

论文笔记 资料 1.代码地址 https://github.com/jo-wang/otta_vit_survey 2.论文地址 https://arxiv.org/abs/2310.20199 3.数据集地址 1论文摘要的翻译 本文介绍了在线测试时间适应(online test-time adaptation,OTTA)的全面调查,OTTA是一种专注于使机器学习…

科技创新引领水利行业升级:深入分析智慧水利解决方案的核心价值,展望其在未来水资源管理中的重要地位与作用

目录 引言 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心价值 1. 精准监测与预警 2. 优化资源配置 3. 智能运维管理 4. 公众参与与决策支持 三、智慧水利在未来水资源管理中的重要地位与作用 1. 推动水利行业转型升级 2. 保障国家水安全 3. 促进生态文明建设…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤: ① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL; ② 我们还要断言一下,指定的…

智慧灌区信息化系统完整解决方案

一、背景 随着科技的快速发展,智慧灌区信息化系统正逐渐成为提高农业灌溉效率、优化水资源配置的重要手段。本文将详细介绍智慧灌区信息化系统的完整解决方案,包括系统、功能、应用以及优势分析等方面,旨在为灌区的现代化和高效管理提供有力…