【Python学习手册(第四版)】学习笔记09.1-Python对象类型-元组

news2024/9/17 8:47:38

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。


目录

元组

元组操作

实际应用

元组的特殊语法:逗号和圆括号

转换、方法以及不可变性

index、count及其他方法

有了列表为什么还要元组


元组

元组(tuple)由简单的对象组构成。元组与列表非常类似,只不过元组不能在原处修改(它们是不可变的),并且通常写成圆括号(而不是方括号)中的一系列项。

元组不支持任何方法调用,但元组具有列表的大多数属性。

任意对象的有序集合

与字符串和列表类似,元组是一个位置有序的对象的集合(也就是其内容维持从左到右的顺序)。与列表相同,可以嵌入到任何类别的对象中。

通过偏移存取

同字符串、列表一样,在元组中的元素通过偏移(而不是键)来访问。它们支持所有基于偏移的操作。例如,索引和分片。

属于不可变序列类型

类似于字符串,元组是不可变的,它们不支持应用在列表中任何原处修改操作。与字符串和列表类似,元组是序列,它们支持许多同样的操作。

固定长度、异构、任意嵌套

元组是不可变的,在不生成一个拷贝的情况下不能增长或缩短。另一方面,元组可以包含其他的复合对象(例如,列表、字典和其他元组等)

对象引用的数组

与列表相似,元组最好看做是对象引用的数组。元组存储指向其他对象的存取点(引用),并且对元组进行索引操作的速度相对较快。

元组操作

元组编写为一系列对象(从技术上来讲,是生成对象的表达式),用逗号隔开,并且用圆括号括起来。一个空元组就是一对内空的括号。

实际应用

在表9-1中,元组没有方法(例如,append调用在这是不可用的)。然而,元组的确支持字符串和列表的一般序列操作。

>>> (1,2) + (3,4)
(1, 2, 3, 4)
>>> (1,2) * 4
(1, 2, 1, 2, 1, 2, 1, 2)
>>> t = (1,2,3,4)
>>> t[0],t[1:3]
(1, (2, 3))

元组的特殊语法:逗号和圆括号

如果圆括号里的单一对象是元组对象而不是一个简单的表达式,需要对Python进行特别说明。如果确实想得到一个元组,只要在这一单个元素之后、关闭圆括号之前加一个逗号就可以了。

作为特殊情况,在不会引起语法冲突的情况下,Python允许忽略元组的圆括号。

>>> x = 40
>>> x
40
>>> type(x)
<class 'int'>

>>> y = 40,
>>> y
(40,)
>>> type(y)
<class 'tuple'>

>>> z = (40,)
>>> z
(40,)
>>> type(z)
<class 'tuple'>

对初学者而言,最好的建议是一直使用圆括号,这可能会比弄明白什么时候可以省略圆括号要更简单一些。许多程序员也发现圆括号有助于增加脚本的可读性,因为这样可以使元组更加明确,尽管你的使用经验可能会有所不同。

转换、方法以及不可变性

除了常量语法不同以外,元组的操作(表9-1的中间行)和字符串及列表是一致的。值得注意的区别在于“+”、“*”以及分片操作应用于元组时将返回新元组,并且元组不提供字符串、列表和字典中的方法。

例如,如果你想对元组进行排序,通常先得将它转换为列表并使其成为一个可变对象,才能获得使用排序方法调用的权限,或者使用sorted内置方法,它接受任何序列对象(以及更多):

>>> t = ('a','z','c','b')
>>> tmp = list(t)
>>> tmp
['a', 'z', 'c', 'b']
>>> tmp.sort()
>>> tmp
['a', 'b', 'c', 'z']

>>> tu = tuple(tmp)
>>> tu
('a', 'b', 'c', 'z')

>>> sorted(t)
['a', 'b', 'c', 'z']
>>> t
('a', 'z', 'c', 'b')

这里的列表和元组内置函数用来将对象转换为列表,之后返回为一个元组。实际上,这两个调用都会生成新的对象,但结果就像是转换。

列表解析(List comprehension)也可用于元组的转换。

例如,下面这个由元组生成的列表,过程中将每一项都加上20:

>>> t1 = (1,2,3)
>>> l1 = [x + 20 for x in t1]
>>> l1
[21, 22, 23]

列表解析是名副其实的序列操作——它们总会创建新的列表,但也可以用于遍历包括元组、字符串以及其他列表在内的任何序列对象。

列表解析甚至可以用在某些并非实际储存的序列之上——任何可遍历的对象都可以,包括可自动逐行读取的文件

注意元组的不可变性只适用于元组本身顶层而并非其内容。例如,元组内部的列表是可以像往常那样修改的。

>>> t[1] = 'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

>>> t[1][0] = 'a'
>>> t
(1, ['a', 3], 4)

对多数程序而言,这种单层深度的不可变性对一般元组角色来说已经足够了。

index、count及其他方法

index和count就像对列表一样工作,但是,它们也针对元组对象定义了:

>>> t2 = (1,2,3,4,5,11,22,33,1,2)

>>> t2.index(1)    #查询出第一次出现的偏移量 
0
>>> t2.index(33)
7
>>> t2.index(2,2)    #查询出第二次出现的偏移量
9
>>> t2.index(33,2)
7
>>> t2.index(33,3)
7
>>> t2.index(1,2) 
8
>>> t2.count(1)    #统计总数
2
>>> t2.count(33)
1
>>> t2
(1, 2, 3, 4, 5, 11, 22, 33, 1, 2)
>>> len(t2)    #长度
10
>>> min(t2)    #最小
1
>>> max(t2)    #最大
33
>>> del t2    #删除
>>> t2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 't2' is not defined

有了列表为什么还要元组

初学者学习元组的时候,这似乎总是第一个出现的问题——既然已经有列表了,为什么还需要元组?

历史性原因是:Python的创造者接受过数学训练,并提到过把元组看做是简单的对象组合,把列表看成是随时间改变的数据结构。实际上,单词“元组”就借用自数学领域,它通常用来指关系数据库表的一行。

最佳答案似乎是元组的不可变性提供了某种完整性。这样你可以确保元组在程序中不会被另一个引用修改,而列表就没有这样的保证了。

元组的角色类似于其他语言中的“常数”声明,然而这种常数概念在Python中是与对象相结合的,而不是变量。

元组也可以用在列表无法使用的地方。例如,作为字典键。一些内置操作可能也要求或暗示要使用元组而不是列表,尽管这样的操作往往已经通用化了。

总的来说:列表是定序集合的选择工具,可能需要进行修改,而元组能够处理其他固定关系的情况

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化目标检测算法推理部署(二)YOLOv8模型图像推理

在先前的RT-DETR中&#xff0c;博主使用ONNX模型文件进行了视频、图像的推理&#xff0c;在本章节&#xff0c;博主打算使用YOLOv8模型进行推理&#xff0c;因此&#xff0c;我们除了需要获取YOLOv8的ONNX模型文件外&#xff0c;还需要进行一些额外的操作&#xff0c;如NMS后处…

PHP在线加密系统源码

历时半年&#xff0c;它再一次迎来更新[飘过] 刚刚发的那个有点问题&#xff0c;重新修了一下 本次更新内容有点多 1. 更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09; 2. 适配php56-php74 3. 取消批量加…

【机器学习西瓜书学习笔记——神经网络】

机器学习西瓜书学习笔记【第四章】 第五章 神经网络5.1神经元模型5.2 感知机与多层网络学习感知机学习率成本/损失函数梯度下降 5.3 BP神经网络&#xff08;误差逆传播&#xff09;5.4 全局最小与局部极小5.5 其他常见神经网络RBF网络RBF 与 BP 最重要的区别 ART网络 第五章 神…

【Linux】进程间通信 —— 管道与 System V 版本通信方式

目录 为什么有进程间通信&#xff1f;进程间通信的目的是什么&#xff1f; 管道 匿名管道 父子进程共享管道 命名管道 共享内存 概念 原理 共享内存和内存映射&#xff08;文件映射&#xff09;的区别 使用 消息队列 概念 使用 信号量 概念 使用 IPCS 命令 S…

【人工智能专栏】Cross Entropy 交叉熵损失解析

Cross Entropy 交叉熵 信息熵 在信息世界中我们所有的信息都可以抽象为“情况”,用二进制 bit 来表达,正因为每个 bit 都有 0 1 两种“情况”,所以 n n n 个 bit 可以编码 2 n 2^n 2

Java----代理

什么是代理&#xff1f; 在Java中&#xff0c;代理是一种用于创建一个或多个服务的中间层&#xff0c;它可以拦截并处理程序对实际服务对象的请求。代理模式是一种设计模式&#xff0c;属于结构型模式&#xff0c;它允许程序员在不修改实际对象代码的情况下&#xff0c;增强或控…

PHP反序列化漏洞从入门到深入8k图文介绍,以及phar伪协议的利用

文章参考&#xff1a;w肝了两天&#xff01;PHP反序列化漏洞从入门到深入8k图文介绍&#xff0c;以及phar伪协议的利用 前言 本文内容主要分为三个部分&#xff1a;原理详解、漏洞练习和防御方法。这是一篇针对PHP反序列化入门者的手把手教学文章&#xff0c;特别适合刚接触PH…

杭州等保测评的备案流程

杭州等级保护备案和测评&#xff0c;构筑了一座坚实的数字安全桥梁&#xff0c;其过程和条件清楚而又重要。这篇文章会详细介绍一些必要的步骤&#xff0c;以帮助你顺利地完成信息系统的安全和合规。 1. 系统识别与自评 在此基础上&#xff0c;首先要明确信息系统所承载的业务…

Zabbix配置监控参考

1 添加host 配置-主机-创建主机 添加主机名&#xff0c;IP&#xff0c;端口 2 添加监控项 配置-主机-监控项 打开后&#xff0c;点击右上角添加监控项&#xff08;进去后。配置想要的监控项目&#xff09; 3 添加CPU监控项 需求&#xff1a;CPU使用率 实现&#xff1…

【基础篇】Docker 容器操作 FOUR

嘿&#xff0c;小伙伴们&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。在上一篇文章中&#xff0c;我们探讨了 Docker 镜像管理的相关知识。今天&#xff0c;让我们一起深入了解一下 Docker 容器的操作吧&#xff01; &#x1f4e6; 运行、停止和删除容器 Docker…

归并排序 python C C++ 代码及解析

一&#xff0c;概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff…

商家转账到零钱开通最快捷径

商家转账到零钱存在一定的捷径&#xff0c;这一捷径将放在文章最后。如果商家希望自行开通&#xff0c;可以按照以下步骤进行申请&#xff1a; 1. 确认主体资格&#xff1a;申请主体必须是公司性质&#xff08;有限公司类型&#xff09;&#xff0c;个体工商户暂不支持申请&…

企业级Linux系统防护

一、企业级Linux系统防护概述 一&#xff09;企业级Linux系统安全威胁 企业级Linux系统安全威胁列表 解决的主要安全威胁安全威胁牵涉到的人员及操作文件系统防护避免有意/无意的文件篡改、越权访问&#xff0c;根用户&#xff08;root&#xff09;权限泛滥企业内部用户误操作、…

【Golang 面试 - 基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

Linux虚拟化技术KVM

文章目录 虚拟化基础什么是虚拟化虚拟化优势虚拟机虚拟机的主要特征Hypervisor类型类型1&#xff1a;裸金属型类型2&#xff1a;宿主型 KVM概述KVM体系结构KVM模块载入后的系统运行模式KVM集中管理和控制宿主机环境准备 安装KVM工具包libvirt包功能libvirt结构图安装KVM相关包C…

SEO优化 prerender-spa-plugin工具使用 踩坑记录

安装prerender-spa-plugin yarn add prerender-spa-plugin 或 npm install prerender-spa-plugin初始配置 后面记录踩的坑 配置路由 const routes [{path: /,redirect: {path: /HomeView},},{path: /home,redirect: {path: /HomeView},},{ path: /HomeView,component: HomeV…

postgresql密码复杂度验证和有效期

前言 为了数据库安全以及应对等保测评等要求&#xff0c;我们需要设置密码复杂度。我们通过passwordcheck模块实现复杂度检测功能。 启用密码复杂度验证 找到自己安装pg库的配置文件目录&#xff0c;修改postgresql.conf vim postgresql.conf修改如下内容 shared_preload_…

2023版IDEA安装通义灵码屡遭挫败:重复尝试,安装依旧失败

目录 背景: 过程: 第一步: 第二步: 第三步: 安装成功: 总结: 通义灵码的优点: 背景: 小编使用的是2023版本IDEA&#xff0c;在安装通义灵码的时候出现了一件很让人头痛的问题&#xff0c;我在IEDA中的插件中心里面去下载&#xff0c;但是当我我安装的进度条加载完成之…

命令行创建git仓库

方法1&#xff1a;初始化自己的仓库 git init创建完成之后可以用ls -a查看是否存在.git文件 如果不想要git仓库&#xff0c;可以使用rm -rf .git删除仓库 方法2&#xff1a;克隆别人的仓库 git clone [http][http]是仓库网址 总体流程 可以看到文件分为四种状态&#xff0c…

windows无法打开添加打印机原因分析及解决方法

在日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;有时在添加打印机的过程中&#xff0c;经常会遇各种问题。今天有个小伙伴问我windows无法打开添加打印机怎么回事&#xff1f;今天就教大家windows无法打开添加打印机原因分析及解决方法。 添加打打…