第17讲:Python中元组的概念以及应用

news2024/12/28 2:03:22

文章目录

    • 1.元组的概念
    • 2.元组的基本使用
      • 2.1.定义一个元组
      • 2.2.定义一个空元组
      • 2.3.元组的元素是不可变的
      • 2.4.当元组中的元素是一个列表时列表中的元素可变
      • 2.5.当元组中只定义一个元素时的注意事项
    • 3.列表的所有操作同样适用于元组
    • 4.就是想修改元组中的某个元素

1.元组的概念

Python中的元组和列表很相似,元组也是Python语言提供的内置数据结构之一,可以在代码中直接使用。

元组和列表就像是一个孪生兄弟,表现形式和使用上都大差不差,但是两者又有非常明显的区别:

  • 元组是用小括号表示的,列表的小括号还可以直接省略,而列表是使用中括号表示的,列表的中括号必须存在。
  • 元组的对象是不可变类型的,也就是说,一旦定义了元组,元组中的数据时不能进行更改的。
  • 列表中的对象是可变类型的,定义了列表之后,可以对列表中的数据进行增删改。

一个元组中也会定义很多个数据元素,每个数据元素也都可以通过索引的方式获取,也有正数、负数索引一说。

当一个元组中的数据元素是一个列表时,对于元素是不允许修改的,但是元素中列表的数据时可以被修改的,有种多维列表的概念,这个列表在元组中相当于一个子列表,这种情况在下面的操作中会进行演示。

问题来了,既然元组和列表那么的相似,为什么还要设计元组这种数据结构呢?

其实也并不难理解,元组的对象是不可变类型的,一旦创建了元组这种不可变类型的对象,对象中的所有数据将不能修改,也能够避免由于修改数据从而引发的Bug错误,此外,对于不可变类型的对象值,在多并发的环境下是不需要加锁的,因为它的数据不可能会被改变,因此多并发的时候就不需要加锁,从而避免并发1修改了数据并发2依旧是旧数据。

因此在程序中我们也要尽量使用不可变类型的对象。

当元组中存在一个列表对象时,为什么列表中的元素可以被修改?不是说元组的对象是不可变类型吗?

因为一个元组中有很多个元素,列表呢只属于其中的一个元素,对应一个索引,对于元组而言存储的是引用元素所在内存中的地址,存储引用的内存地址是不会被改变的,也就意味着元组中的元素定义好之后,不能再添加、删除元组中的对象元素,但是列表只是元组中的一个元素,即使修改列表的数据也不会对元组中的对象元素有改动,根据列表的特点以及列表有自己的数据结构,就可以对元组中元素为列表的对象进行修改。

2.元组的基本使用

在前面说了那么多的理论,例如元组用小括号表示,元组的特性等等,在本小结,我们通过案例来是验证。

2.1.定义一个元组

元组用小括号定义。

#定义一个元组
mytuple = ("jiangxl", 123, "python")
print(mytuple)

#输出结果:('jiangxl', 123, 'python')

定义元组时小括号可以省略。

mytuple = "jiangxl", 123, "python"
print(mytuple)

#输出结果:('jiangxl', 123, 'python')

image-20220731111547171

2.2.定义一个空元组

可以使用()表示一个空元组,也可以使用tuple()函数定义一个空元组

mytuple = ()
print(mytuple)

print(tuple())

image-20220731111933582

2.3.元组的元素是不可变的

元组中的对象元素是不可变的,已定义好的元组,其中的元素是不能被修改的,如下所示:

mytuple = ("jiangxl", 123, "python")

#尝试修改索引为1的元素
mytuple[1] = 678

直接回抛出错误:TypeError: ‘tuple’ object does not support item assignment

image-20220731113740690

2.4.当元组中的元素是一个列表时列表中的元素可变

当一个元组中的元素是一个列表时,这个列表相当于元组的一个元素,面向一个索引,此时这个列表相当于多维列表中子列表的概念,有自己的索引分布,因此当元组中的元素是列表时,这个列表中的元素可以改变。

元组会存储元素在内存中的地址,这个地址是不能被修改的,因此可以保证元素在元组中不会改变,但是列表是元组中的一个元素,这个元素对象不变就可以,至于元素中的元素就受列表的特性控制了。

#定义一个元组,其中索引1对应的元素是[1, 2, 3]列表
mytuple2 = ("jiangxl", [1, 2, 3], "python")

#修改[1, 2, 3]列表中1元素为123
'''
    首先找到[1, 2, 3]列表所在元组中的元素对应的索引:mytuple2[1]
    然后在找到元素1对应在列表中的索引:mytuple2[1][0]
'''
mytuple2[1][0] = 123

#打印元组的内容观察是否被修改
print(mytuple2)

#输出结果:('jiangxl', [123, 2, 3], 'python')

2.5.当元组中只定义一个元素时的注意事项

当在元素中只定义一个元素时,有一些注意事项,即使是只定义一个元素,也要在元组中至少包含一个逗号,否则Python就认为我们定义的并非是元组,只是一个字符串。

1)定义元组中只有一个元素且不加逗号

当定义的元组中只有一个元素时,并且没有加逗号,此时Python认为这并不是一个元组,只是一个字符串,()括号也被认为是数学中的括号。

#元组中只有一个元素,且不添加逗号
mytuple = ("jiangxl")

#打印这个元组中的元素
print(mytuple)
#输出结果:jiangxl

#竟然只输出了一个字符串,并不是元组的形式,我们打印这个数据的类型
print(type(mytuple))
#输出结果:<class 'str'>
#发现只是一个字符串类型,并不是元组

2)定义元组中只有一个元素且加逗号

在元组()中只要有一个逗号,Python就认为这是一个元组。

mytuple = ("jiangxl",)

image-20220731133302282

3.列表的所有操作同样适用于元组

元组和列表很类似,几乎一样,只不过元组是不可变的类型,列表能实现的操作,也同样适用于元组。

理论就不再叙说了,不明白的去看前面列表这类操作的理论,说的非常明白了。

1)元组的切片

#元组的切片
mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc")
print(mytuple[1:4])                 

#输出结果; (123, 'python', 111)

2)查询元组中某个元素的索引

#查询元组中某个元素的索引
mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc")
print(mytuple.index(123))           

#输出结果;1

3)使用乘法运算符操作列表

#使用乘法运算符操作列表
mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc")
mytuple2 = mytuple * 2
print(mytuple2)     

#输出结果:('jiangxl', 123, 'python', 111, 22, 45, 'abc', 'jiangxl', 123, 'python', 111, 22, 45, 'abc')

4)使用加法运算符操作列表

#使用加法运算符操作列表
mytuple3 = ("abc", "k8s", "jenkins")
mytuple4 = (123, 456, 789, 111)
print(mytuple3 + mytuple4)         

#输出结果:('abc', 'k8s', 'jenkins', 123, 456, 789, 111)

5)元组之间的比较

元组的比较也是基于元组中的所有元素都是数字的情况下,才能进行比较。

#元组的比较
mytuple5 = (1, 2, 3, 4)
mytuple6 = (1, 2, 5, 8, 9)
print(mytuple5 < mytuple6)

#输出结果:True

6)元组的反转

元组是不可变的类型,不能通过方法reverse实现元组的反转,因为调用类方法会修改元组本身的元素,所以只能通过reversed函数实现反转。

mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc")
print(list(reversed(mytuple)))            

#输出结果:['abc', 45, 22, 111, 'python', 123, 'jiangxl']

7)元组的排序

元组是不可变的类型,不能通过方法sort实现元组排序,因为调用类方法会修改元组本身的元素,所以只能通过sorted函数实现排序。

元组进行排序时,如果元组中存在字符串类型的元素,那么其他所有的元素无论什么类型,都需要单独用引号引起来,否则不能排序,会抛出错误。

mytuple = (1, 2, 5, 8, 9)
##升序
print(sorted(mytuple))                      
#输出结果:[1, 2, 5, 8, 9]

##降序
print(sorted(mytuple, reverse=True))            
#输出结果:[9, 8, 5, 2, 1]

4.就是想修改元组中的某个元素

元组的对象是不可变类型的,不允许增、删、改,但是我们就是想改元组的对象元素,也是有办法的。

  • 重新声明元组,对元素进行增删改
  • 使用切片截取元组中需要的元素,然后是还有加法运算符拼接新的对象元素。

第一种方法无需演示,懂得都会,重点看第二种方法。

这种方法的核心思想就是:利用切片(保留元组中想要的元素)+拼接(将多个切片的元组合并)的方式即可对元组中的元素改变。

需求:

​ (“jiangxl”, 123, “python”, 111, 22, 45, “abc”)

有一个元组,对象元素如上所示,我想删掉元组中的“22”和“45”这两个对象元素。

实现思路:

  • 我们都知道元组是不可变的类型,不允许修改其中的元素,但是我们就要反其道而行之,运用所学的知识实现这个需求。
  • 想删掉元组中的“22”和“45”这两个对象元素,可以使用切片的方式将这两个元素之外的元素从列表中切出来。
  • 由于这两个元素前后都有其他元素,一个切片截取22元素之前的其他元素,一个切片截取45元素之后的其他元素。
  • 最后通过加法运算符将两个切片合并在一起,形成一个新的元组,此时这个元组中就不包含22”和“45”这两个对象元素。
  • 通过切片+拼接的方法就可以将元组中的元素进行删除操作,如果是修改也是同样的方法:切片+拼接。

代码如下:

#定义初始元组
'''
    定义好初始元组后,突然想修改元组中的元素了,但是又不想去调整初始元组,故而通过切片+拼接的方法产生一个新的元组,也就相当于对元组的元素进行改变了。
    需求:删掉元组中的“22”和“45”这两个对象元素
'''
mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc")


'''
    使用切片截取22元素之前的其他元素,无需指定起始索引,从第一个元素处开始截取,指定结束索引为4
    索引4是元素22的索引,指定结束元素是4,结束元素不会被纳入切片
'''
mytuplestart = mytuple[:4]

'''
    22元素之前的全部元素都截取出来后,还要对45之后的元素进行截取,因为我们只是不想要22和45了,45之后还有其他的元素
    指定开始索引为6,索引为6的元素是abc,完美避开了22和45这两个元素,不指定结束索引,一直切片到最后一个元素
'''
mytuolestop = mytuple[6:]

'''
    使用加法运算符将两个切片拼接在一起,形成新的元组
'''
mytuplenew = mytuplestart + mytuolestop
print(mytuplenew)

#输出结果:('jiangxl', 123, 'python', 111, 'abc')

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

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

相关文章

CVE-2022-33980 Apache Commons Configuration 远程命令执行漏洞分析

漏洞描述 7月6日&#xff0c;Apache官方发布安全公告&#xff0c;修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞&#xff0c;漏洞编号&#xff1a;CVE-2022-33980&#xff0c;漏洞威胁等级&#xff1a;高危。恶意攻击者通过该漏洞&#xff0c;可在目标…

3. 其他数仓/BI架构解析

文章目录1. 独立数据集市架构2. 辐射状企业信息工厂Inmon架构范式建模维度建模3. 混合辐射状架构与Kimball架构目前&#xff0c;经过长时间的演进&#xff0c;各种数仓架构之间的区别变得越来越小&#xff0c;且不论哪种数仓架构&#xff0c;都会涉及维度建模。下面是几种常见的…

《项目管理精华》读书笔记

《项目管理精华》读后感 《项目管理精华》书中用实例讲解了项目管理的基本流程及一些项目管理技巧&#xff0c;通俗易懂且让人有读下去的欲望。本书按照项目管理的五大过程组的顺序逻辑加上一些作者认为项目管理中比较有价值的内容来介绍的&#xff0c;十大知识领域穿插在这些…

nodejs+vue+elementui在线水果商城购物网站vscode项目

摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 系统开发环境 5 2.1 Vue技术介绍 5 端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 系统分为不同的层次&#xff1a;视图层&#…

哪个室内导航地图好用?画地图用什么软件好?

在互联网服务中&#xff0c;所有互联网巨头均斥巨资布局C端的地图服务&#xff0c;喜闻乐见的地图形式极大地方便了人们在日常生活中的查询位置、了解环境、导航等应用需求&#xff0c;因此取得了巨大的成功。但目前这些地图服务数据的颗粒度基本仅到城市级&#xff1b;园区、景…

CVE-2022-32532 认证绕过漏洞分析

前言 结合自身经历&#xff0c;在使用正则表达式去匹配流量特征时&#xff0c;由于正则表达式中元字符“.”不匹配换行符&#xff08;\n、\r&#xff09;导致一直提取不上所需的流量。而如今&#xff0c;之前踩过的坑却出现在了Apache Shiro框架之中… 漏洞描述 6月29日&…

《MySQL实战45讲》——学习笔记24 “Master/Slave主备同步机制“

binlog可以用来归档&#xff0c;也可以用来做主备同步&#xff0c;binlog在MySQL的各种高可用方案上扮演了重要角色&#xff1b;本篇主要介绍MySQL主备&#xff08;M-S结构&#xff09;的基本原理、不同格式binlog的优缺点和设计者的思考、MySQL双主结构和循环复制问题&#xf…

关于 Linux 系统

个人主页:ζ小菜鸡 大家好我是ζ小菜鸡&#xff0c;小伙伴们&#xff0c;让我们一起来学习Linux系统。 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 目录 一、Linux系统的组成 二、Linux 命令行的操作 三、Linux 目录结构 四、文件基本操作 五、用户及文件权限管…

jspssm小型药店药品管理系统

目 录 第一章 概述 1 1.1 研究背景 1 1.2开发意义 1 1.3 研究现状 1 1.4 研究内容 2 1.5论文结构 2 第二章 开发技术介绍 3 2.1 系统开发平台 3 2.2 平台开发相关技术 3 2.2.1 JSP技术介绍 3 2.2.2 Mysql数据库介绍 3 2.2.3 B/S架构 …

excel排名技巧:万能透视表加筛选找出销售冠军

在一组数据中统计单项排名第一的人员名单&#xff0c;如果用函数&#xff0c;我们需要考虑不同项目业绩相等的查找问题&#xff0c;需要考虑同项目业绩相等的查找问题。但如果用数据透视表加筛选&#xff0c;一切就很简单了。最后要么逐条地复制粘贴&#xff0c;要么用技巧合并…

ChatGPT 逆天测试,结局出乎预料

目录一、数学解题能力二、编程能力三、日常生活咨询四、问一些离谱的问题&#xff0c;它有啥反应&#xff1f;五、逆天大测试一、数学解题能力 据说 ChatGPT 会做数学题&#xff0c;给他几个条件不充分的问题&#xff0c;看看他是否真的会思考。 这家伙心理素质真好&#xff…

Uniswap 解析:恒定乘积做市商模型Constant Product Market Maker Model 的Vyper 实作

大纲 一. 前言 二. 恒定乘积做市商模型Constant Product Market Maker Model 1. 计入手续费 2. 程式码结构 3. 演算法核心与实作 4. 段落小结 三. 流动性Liquidity 1. 第一笔流动性注入、决定k值 2. 除了第一笔以外的情况 四. 结语 一. 前言 暨上一篇开始接触了Vyper 后&…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(2)-初识Fiddler让你理性认识一下

1.前言 今天的理性认识主要就是讲解和分享Fiddler的一些理论基础知识。其实这部分也没有什么&#xff0c;主要是给小伙伴或者童鞋们讲一些实际工作中的场景&#xff0c;然后隆重推出我们的猪脚&#xff08;主角&#xff09;-Fiddler。 1.1工作场景 做app测试&#xff0c;你是…

SpringMVC的工作原理

SpringMVC的工作原理图&#xff1a; SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&#xff0c;生成处理器对象及处…

二叉树29:二叉搜索树中的插入操作

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;701.二叉搜索树中的插入操作 题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入…

苏嵌实训——day19

文章目录一、数据库1.1 在ubuntu中安装数据库1.2 数据库的操作1.2.1 数据库命令的分类1.2.2 常用的系统命令1.2.3 数据中的常用的语句1.3 sqlite数据库中常用api1. sqlite3_open2. int sqlite3_close(sqlite3 * db)3. sqlite3_exec4 sqlite3_get_table5 void sqlite3_free_tabl…

JavaEE12-Spring MVC程序开发

目录 1.什么是Spring MVC? 1.1.MVC定义 1.1.1.Model&#xff08;模型&#xff09; 1.1.2.View&#xff08;视图&#xff09; 1.1.3.Controller&#xff08;控制器&#xff09; 1.2.MVC和Spring MVC的关系 2.为什么要学Spring MVC? 3.怎么学Spring MVC? 3.1.Spring …

LeetCode——2319. 判断矩阵是否是一个 X 矩阵

一、题目 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩阵。如果 grid 是一个 X 矩阵 &#xff0c…

Linux的shell入门和版本控制(五)

0、前言 这部分简单介绍了Linux系统中的shell编程 1、服务监听 在Linux中的服务监听&#xff0c;相当于在windows中的任务管理器。常用指令&#xff1a; 示例一&#xff1a;查询进程 ps -aux|grep 要查询的程序名&#xff1a;这样查询会连带这条查询指令的进程一起查询出来。…

【深度学习笔记】LSTM的介绍及理解

问题 LSTM是深度学习语音领域必须掌握的一个概念,久仰大名,现在终于要来学习它了,真是世事无常,之前以为永远不会接触到呢,因此每次碰到这个就跳过了。 前言 LSTM (Long short-term memory,长短期记忆) 是一种特殊的RNN,主要是为了解决长序列训练过程中梯度消失与梯度…