当前位置:首页 > 科技  > 软件

深挖 Python 元组 pt.2

来源: 责编: 时间:2023-10-10 18:31:34 168观看
导读哈喽大家好,我是咸鱼在《深挖 Python 元组 pt.1》中我们了解 Python 元组的一些概念(索引和切片等),以及如何创建元组,最重要的是我们还介绍了元组的不可变特性那么今天我们来继续深挖 Python 元组打包&解包在 python 中,元

哈喽大家好,我是咸鱼eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

在《深挖 Python 元组 pt.1》中我们了解 Python 元组的一些概念(索引和切片等),以及如何创建元组,最重要的是我们还介绍了元组的不可变特性eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

那么今天我们来继续深挖 Python 元组eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

打包&解包

eXY28资讯网——每日最新资讯28at.com

在 python 中,元组可以被打包(packing )和解包(unpacking )eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

例如,point = x, y, z 将会把 x, y 和 z 的值打包到 point 中,于是创建了一个新元组eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

我们还可以执行反向操作(解包),将元组 point 的值解包为适当数量的变量eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到,x, y, z = point 神奇地将point的内容解压缩为三个变量。注意,值按顺序转到变量。(第一个值归第一个变量,第二个值归第二个变量,依此类推)eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

Python 3.5 扩展了元组解包语法,以处理各种可迭代对象eXY28资讯网——每日最新资讯28at.com

所以不单单元组可以解包,可迭代对象也可以解包eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

在常规解包中,变量的数量必须与要解包的值的数量相匹配。否则会报错eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

解包最常见的用例就是利用解包在变量之间交换值eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

没有解包的话使用常规赋值在两个变量之间交换值,必须使用临时变量eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

通过解包来交换变量值eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

解包还有一个用处是并行分配,比如说下面的操作:我们在进行赋值时需要知道对应的索引eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

如果通过解包来实现,则无需使用索引。这样能使代码更易阅读和理解,且不易出错eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

Python 还有一个打包和解包运算符 ( * ),我们可以使用它让解包(打包)操作更加灵活eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

例如当左边的变量数和右边元组的元素数量不匹配时,可以使用 *  使得单个变量接收多个值eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

关于这个操作符的更多用法,可以看我之前的文章:《python 星号 * 还能这么用》eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

函数返回元组

eXY28资讯网——每日最新资讯28at.com

在某些情况下,需要从函数返回多个值。所以可以构建一个带有逗号分隔的一系列参数的 return 语句,这样返回的是一个元组eXY28资讯网——每日最新资讯28at.com

我们还可以使函数返回值是列表,这样需要我们显式地使用方括号来构建列表eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

内置 divmod() 函数是返回多个值的函数的一个很好的例子。该函数接受两个数字,并在执行整数除法时返回一个包含商和余数的元组:eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

又或者我打算写一个函数,这个函数返回一组数的最大值和最小值eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到函数的返回值有两个:最大值、最小值。当用逗号分隔一系列值时,将创建一个元组。因此,此函数返回一个 tuple 对象eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

深拷贝&浅拷贝

eXY28资讯网——每日最新资讯28at.com

当需要转换数据时,通常需要复制对象,同时保持原始数据不变。在处理可变数据类型(如列表和字典)时,副本非常有用eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

副本可以在不影响原数据的情况下对数据进行更改eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

  • 直接赋值

我们先来看一个例子eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到,student_info、 student_profile 是对同一元组对象的引用。所以, student_profile 是 的 student_info 别名而不是副本eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

  • 浅拷贝

copy 模块中的 copy() 函数生成等效结果eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到,两个变量student_info、 student_profile 都包含对同一元组对象和相同元素的引用eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

上面的元组里面包含了一个列表元素,我们知道列表是可变的,我们来试着更改一下eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到,student_profile 更改会影响 student_info 中的原始数据eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

  • 深拷贝

下面的例子中, student_info 通过 deepcopy() 函数制作了student_profileeXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到,两个变量student_info、 student_profile 指向的元组对象不是同一个eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

如果我们对里面的列表元素进行更改eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

可以看到,对student_profile 的修改不会影响 student_info 中的数据eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

总结一下:eXY28资讯网——每日最新资讯28at.com

  • 元组的浅拷贝不会创建一个新的对象(副本)。
  • 元组的深拷贝创建一个新的元组对象
  • 对于元组内的不可变元素,它们仍然会共享相同的内存地址
  • 对于元组内的可变元素,则是创建了一个新的对象,不共享内存地址

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

其他操作

eXY28资讯网——每日最新资讯28at.com

  • 元组拼接和重复

在 Python 中连接两个元组,可以使用加号运算符 ( + )eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

需要注意的是,+ 左右两边必须都是元组,即只能将元组跟元组拼接。如果元组跟列表或其他对象拼接的话,会报错eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

元组使用重复运算符 ( * )将元素克隆多次eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

  • 元组反转和排序

内置 reversed() 函数将序列作为参数,并返回一个迭代器,该迭代器以相反的顺序从输入序列生成值。eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

使用元组作为参数进行调用 reversed() 时,将获得一个迭代器对象,该对象以相反的顺序生成项eXY28资讯网——每日最新资讯28at.com

eXY28资讯网——每日最新资讯28at.com

如果要对元组进行排序,可以使用内置 sorted() 函数,该函数将值的可迭代对象作为参数并以列表形式返回排序后的值eXY28资讯网——每日最新资讯28at.com

图片图片eXY28资讯网——每日最新资讯28at.com

如果元组里面的元素数据类型不一致(异构数据),则无法排序eXY28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12724-0.html深挖 Python 元组 pt.2

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: TIOBE 10 月榜单:Java 跌幅最大,C# 逼近 Java

下一篇: Spring Boot中实现订单30分钟自动取消的策略

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • .NET 程序的 GDI 句柄泄露的再反思

    .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 零售大模型“干中学”,攀爬数字化珠峰

    零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
Top