python元祖用法_Python序列(列表list和元组tuple)用法完全攻略

所谓序列,指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员。

Python 的常见序列类型包括字符串、列表和元组。前一章介绍过的字符串,其实就是一种常见的序列,通过索引访问字符串内的字符程序就是序列的示范程序。

本节介绍的序列主要是指列表和元组,这两种类型看起来非常相似,最主要的区别在于:元组是不可变的,元组一旦构建出来,程序就不能修改元组所包含的成员(就像字符串也是不可变的,程序无法修改字符串所包含的字符序列);但列表是可变的,程序可以修改列表所包含的元素。

在具体的编程过程中,如果只是固定地保存多个数据项,则不需要修改它们,此时就应该使用元组;反之,就应该使用列表。此外,在某些时候,程序需要使用不可变的对象,比如 Python 要求字典的 key 必须是不可变的,此时程序就只能使用元组。

简单讲,列表和元组的关系就是可变和不可变的关系。

创建列表和元组

创建列表和元组的语法也有点相似,区别只是创建列表使用方括号,创建元组使用圆括号,并在括号中列出元组的元素,元素之间以英文逗号隔开。

创建列表的语法格式如下:

[ele1,ele2,ele3,...]

创建元组的语法格式如下:

(ele1,ele2,ele3,...)

下面代码示范了在程序中定义列表和元组:

a_tuple = ('crazyit', 20, 5.6, 'fkit', -17)

print(a_tuple)

# 访问第1个元素

print(a_tuple[0]) # crazyit

# 访问第2个元素

print(a_tuple[1]) # 20

# 访问倒数第1个元素

print(a_tuple[-1]) # -17

# 访问倒数第2个元素

print(a_tuple[-2]) # -fkit

列表和元组切片

与前面介绍的字符串操作类似的是,列表和元组同样也可使用索引获取中间一段,这种用法被称为 slice(分片或切片)。slice 的完整语法格式如下:

[start : end : step]

上面语法中 start、end 两个索引值都可使用正数或负数,其中负数表示从倒数开始。该语法表示从 start 索引的元素开始(包含),到 end 索引的元素结束(不包含)的所有元素,这和所有编程语言的约定类似。

step 表示步长,因此 step 使用负数没有意义。

下面代码示范了使用 start、end 获取元组中间一段的用法:

a_tuple = ('crazyit', 20, 5.6, 'fkit', -17)

# 访问从第2个到倒数第4个(不包含)所有元素

print(a_tuple[1: 3]) # (20, 5.6)

# 访问从倒数第3个到倒数第1个(不包含)所有元素

print(a_tuple[-3: -1]) # (5.6, 'fkit')

# 访问从第2个到倒数第2个(不包含)所有元素

print(a_tuple[1: -2]) # (20, 5.6)

# 访问从倒数第3个到第5个(不包含)所有元素

print(a_tuple[-3: 4]) # (5.6, 'fkit')

如果指定 step 参数,则可间隔 step 个元素再取元素。例如如下代码:

b_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9)

# 访问从第3个到第9个(不包含)、间隔为2的所有元素

print(b_tuple[2: 8: 2]) # (3, 5, 7)

# 访问从第3个到第9个(不包含)、间隔为3的所有元素

print(b_tuple[2: 8: 3]) # (3, 6)

# 访问从第3个到倒数第2个(不包含)、间隔为3的所有元素

print(b_tuple[2: -2: 2]) # (3, 5, 7)

加法

列表和元组支持加法运算,加法的和就是两个列表或元组所包含的元素的总和。

需要指出的是,列表只能和列表相加;元组只能和元组相加;元组不能直接和列表相加。

如下代码示范了元组和列表的加法运算:

a_tuple = ('crazyit' , 20, -1.2)

b_tuple = (127, 'crazyit', 'fkit', 3.33)

# 计算元组相加

sum_tuple = a_tuple + b_tuple

print(sum_tuple) # ('crazyit', 20, -1.2, 127, 'crazyit', 'fkit', 3.33)

print(a_tuple) # a_tuple并没有改变

print(b_tuple) # b_tuple并没有改变

# 两个元组相加

print(a_tuple + (-20 , -30)) # ('crazyit', 20, -1.2, -20, -30)

# 下面代码报错:元组和列表不能直接相加

#print(a_tuple + [-20 , -30])

a_list = [20, 30, 50, 100]

b_list = ['a', 'b', 'c']

# 计算列表相加

sum_list = a_list + b_list

print(sum_list) # [20, 30, 50, 100, 'a', 'b', 'c']

print(a_list + ['fkit']) # [20, 30, 50, 100, 'fkit']

乘法

列表和元组可以和整数执行乘法运算,列表和元组乘法的意义就是把它们包含的元素重复 N 次(N 就是被乘的倍数)。

如下代码示范了列表和元组的乘法:

a_tuple = ('crazyit' , 20)

# 执行乘法

mul_tuple = a_tuple * 3

print(mul_tuple) # ('crazyit', 20, 'crazyit', 20, 'crazyit', 20)

a_list = [30, 'Python', 2]

mul_list = a_list * 3

print(mul_list) # [30, 'Python', 2, 30, 'Python', 2, 30, 'Python', 2]

当然,也可以对列表、元组同时进行加法、乘法运算。例如,把用户输入的日期翻译成英文表示形式,即添加英文的“第”后缀。对于 1、2、3 来说,英文的“第”后缀分别用 st、nd、rd 代表,其他则使用 th 代表。

为此,可使用如下代码来完成该转换:

# 同时对元组使用加法、乘法

order_endings = ('st', 'nd', 'rd')\

+ ('th',) * 17 + ('st', 'nd', 'rd')\

+ ('th',) * 7 + ('st',)

# 将会看到st、nd、rd、17个th、st、nd、rd、7个th、st

print(order_endings)

day = input("输入日期(1-31):")

# 将字符串转成整数

day_int = int(day)

print(day + order_endings[day_int - 1])

该程序中,同时对 ('th',) 元组使用了乘法,再将乘法得到的结果使用加法连接起来,最终得到一个元组,该元组共有 31 个元素。

可能有读者对 ('th',) 这种写法感到好奇,此处明明只有一个元素,为何不省略逗号?这是因为 ('th') 只是字符串加上圆括号,并不是元组,也就是说,('th') 和 'th' 是相同的。为了表示只有一个元素的元组,必须在唯一的元组元素之后添加英文逗号。

运行上面程序,可以看到如下运行结果:

输入日期(1-31):27

27th

从上面的运行结果可以看出,用户输入 27,程序通过元组为 27 添加了“th”后缀。

in 运算符

in 运算符用于判断列表或元组是否包含某个元素,例如如下代码:

a_tuple = ('crazyit' , 20, -1.2)

print(20 in a_tuple) # True

print(1.2 in a_tuple) # False

print('fkit' not in a_tuple) # True

长度、最大值和最小值

Python 提供了内置的 ten()、max()、min() 全局函数来获取元组或列表的长度、最大值和最小值。

由于 max()、min() 要对元组、列表中的元素比较大小,因此程序要求传给 max()、min() 函数的元组、列表的元素必须是相同类型且可以比较大小。例如如下代码:

# 元素都是数值的元组

a_tuple = (20, 10, -2, 15.2, 102, 50)

# 计算最大值

print(max(a_tuple)) # 102

# 计算最小值

print(min(a_tuple)) # -2

# 计算长度

print(len(a_tuple)) # 6

# 元素都是字符串的列表

b_list = ['crazyit', 'fkit', 'Python', 'Kotlin']

# 计算最大值(依次比较每个字符的ASCII码值,先比较第一个字符,若相同,继续比较第二个字符,以此类推)

print(max(b_list)) # fkit(26个小写字母的ASCII码为97~122)

# 计算最小值

print(min(b_list)) # Kotlin (26个大写字母的ASCII码为65~90)

# 计算长度

print(len(b_list)) # 4

在上面代码中,首先使用 3 个函数对元素都是数值的元组进行处理,可以看到程序获取元组的最大值、最小值等。程序后半部分使用 3 个函数对元素都是宇符串的列表进行处理,也可以看到程序获取列表的最大值、最小值等,这说明 Python 的字符串也是可比较大小的,即 Python 依次按字符串中每个字符对应的编码来比较字符串的大小。

序列封包和序列解包

Python 还提供了序列封包(Sequence Packing)和序列解包(Sequence Unpacking)的功能。简单来说,Python 允许支持以下两种赋值方式:

程序把多个值赋给一个变量时,Python 会自动将多个值封装成元组。这种功能被称为序列封包。

程序允许将序列(元组或列表等)直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等)。这种功能被称为序列解包。

下面代码示范了序列封包和序列解包的功能:

# 序列封包:将10、20、30封装成元组后赋值给vals

vals = 10, 20, 30

print(vals) # (10, 20, 30)

print(type(vals)) #

print(vals[1]) # 20

a_tuple = tuple(range(1, 10, 2))

# 序列解包: 将a_tuple元组的各元素依次赋值给a、b、c、d、e变量

a, b, c, d, e = a_tuple

print(a, b, c, d, e) # 1 3 5 7 9

a_list = ['fkit', 'crazyit']

# 序列解包: 将a_list序列的各元素依次赋值给a_str、b_str变量

a_str, b_str = a_list

print(a_str, b_str) # fkit crazyit

如果在赋值中同时运用了序列封包和序列解包机制,就可以让赋值运算符支持同时将多个值赋给多个变量。例如如下代码:

# 将10、20、30依次赋值给x、y、z

x, y, z = 10, 20, 30

print(x, y, z) # 10 20 30

上面代码实际上相当于如下执行过程:

#先执行序列封包

xyz = 10,20,30

#再执行序列解包

x,y,z = xyz

使用这种语法也可以实现交换变量的值,例如如下代码:

# 将y,z, x依次赋值给x、y、z

x, y, z = y, z, x

print(x, y, z) # 20 30 10

在序列解包时也可以只解出部分变量,剩下的依然使用列表变量保存。为了使用这种解包方式,Python 允许在左边被赋值的变量之前添加“*”,那么该变量就代表一个列表,可以保存多个集合元素。例如如下程序:

# first、second保存前2个元素,rest列表包含剩下的元素

first, second, *rest = range(10)

print(first) # 0

print(second) # 1

print(rest) # [2, 3, 4, 5, 6, 7, 8, 9]

# last保存最后一个元素,begin保存前面剩下的元素

*begin, last = range(10)

print(begin) # [0, 1, 2, 3, 4, 5, 6, 7, 8]

print(last) # 9

# first保存第一个元素,last保存最后一个元素,middle保存中间剩下的元素

first, *middle, last = range(10)

print(first) # 0

print(middle) # [0, 1, 2, 3, 4, 5, 6, 7, 8]

print(last) # 9

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

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

相关文章

IOC操作Bean管理XML方式(注入内部 bean 和 级联赋值)

目录 1.注入属性-内部 bean (1)一对多关系:部门和员工 (2)在实体类之间表示一对多关系 (3)在Spring 配置文件中进行配置 2.注入属性-级联赋值 (1)第一种写法类似外部…

单处理机系统的进程调度动态优先_操作系统复习笔记(王道)C2.1

进程与线程一、进程特征和概念前提:允许多个程序并发执行。1.概念PCB(process control block)进程控制块,系统利用 PCB 来描述进程的基本情况和运行状 态,进而控制和管理进程。PCB是进程存在的唯一标志。进程是进程实体的运行过程&#xff0c…

非线性动力学_非线性科学中的现代数学方法:综述

Ch0【引言】本文是作者的一个总结,力图在极度繁杂的数理知识体系中摘选出那些最广泛应用的核心工具及思想。本文主要关注的问题都是非线性的、动态的。具体地讲,主要涉及的是:微分动力系统、泛函的最优化初步(但不涉及最优控制及微…

IOC操作Bean管理XML方式(注入集合类型属性)

目录 IOC操作Bean管理XML方式(注入集合类型属性) (1)首先进行环境的搭建和准备 (2)创建一个类:用来完成集合类型属性注入 (3)在Spring 配置文件进行配置 &#xff0…

matlab 最小二乘法拟合_高中数学:最小二乘法与线性回归方程

1、怎样的拟合直线最好?——与所有点都近,即与所有点的距离之和最小。最小二乘法可以帮助我们在进行线性拟合时,如何选择“最好”的直线。要注意的是,利用实验数据进行拟合时,所用数据的多少直接影响拟合的结果&#x…

python多次循环输出_python循环

python_day_2一. 循环. while循环while 条件:代码块(循环体)执行流程:判断条件是否为真. 如果真. 执行代码块再次判断条件是否为真......当条件为假.执行else 跳出循环. 循环结束1.让计算机连续打印5次corn,每次延迟一秒:importtimecount 1while count <5:print("corn&…

预充电电路工作原理_LED触摸调光台灯控制电路板的工作原理

一款美观实用的台灯堪称书桌上的艺术品&#xff0c;看着书桌上精致美观的台灯&#xff0c;可能还会增加一些阅读的乐趣吧。那么触摸开关台灯的工作原理到底是怎么的呢?两按键触摸调光电路板工作原理:一、两按键触摸调光电路板&#xff0c;触摸芯片工作电压2.4-5.5V。输入也可用…

IOC操作Bean管理XML方式(FactoryBean)

目录 IOC操作Bean管理XML方式&#xff08;FactoryBean&#xff09; Spring 有两种类型的bean 第一种&#xff1a;是普通的 bean 第二种&#xff1a;工厂bean FactoryBean 第一步&#xff1a;创建类&#xff0c;让这个类作为工厂bean 第二步&#xff1a;在类中实现接口里面…

python中自定义类中的self_Python类和构造方法

1.面向对象介绍描述&#xff1a;是函数的一个变种,在Python中,有函数式编程和面向对象编程,java和C#之类只能把函数写到类里,没有函数式编程,所以只有面向对象,所以在Python中有了选择,可能就变得有点麻烦,但是在Python里,函数式编程是可以完成所有的功能的,人都是想把事情变得…

激光slam_机器人主流定位技术,激光SLAM与视觉SLAM谁更胜一筹

定位技术是机器人实现自主定位导航的最基本环节&#xff0c;是机器人在二维工作环境中相对于全局坐标的位置及其本身的姿态。目前SLAM (Simultaneous Localization and Mapping&#xff0c;即时定位与地图构建)是业内主流的定位技术&#xff0c;有激光SLAM和视觉SLAM之分。什么…

IOC操作Bean管理XML方式(bean的作用域)

目录 IOC操作Bean管理XML方式&#xff08;bean的作用域&#xff09; 1.在Spring 里面&#xff0c;设置创建 bean 实例是单实例还是多实例的方式 &#xff08;1&#xff09;在Spring 配置文件bean 标签里面有属性&#xff08;scope&#xff09;用于设置单实例还是多实例 &am…

bucket sort sample sort 并行_双调排序Bitonic Sort,适合并行计算的排序算法

双调排序是data-independent的排序&#xff0c; 即比较顺序与数据无关的排序方法&#xff0c; 特别适合做并行计算&#xff0c;例如用GPU、fpga来计算。1、双调序列在了解双调排序算法之前&#xff0c;我们先来看看什么是双调序列。 双调序列是一个先单调递增后单调递减&#x…

边缘检测后去除噪点_修图前vs修图后,原来那些网红“照骗”都是这样修出来的!...

如今手机上有许多功能强大的后期app都能帮助我们轻松实现一键修图我们也经常可以在网上看到各路大神们各显神通的手机修图作品无论是风景、人像还是创意修图前和修图后对比强烈、美若两图看到这里你是否想问为什么同样是用手机修图别人修的图总是比我好看到底是哪里出错了呢&am…

IOC操作Bean管理XML方式(bean 的生命周期)

目录 IOC操作Bean管理XML方式&#xff08;bean 的生命周期&#xff09; 1.bean 的生命周期&#xff08;在单例模式下的生命周期&#xff09; &#xff08;1&#xff09;通过构造器创建 bean 的实例&#xff08;执行类中无参构造方法去创建对象&#xff09; &#xff08;2&…

springboot listener_Springboot 全套面试提升宝典,为金三银四冲刺

简介&#xff1a;Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发…

IOC操作Bean管理XML方式(xml自动装配)

目录 IOC操作Bean管理XML方式&#xff08;xml自动装配&#xff09; 一.演示自动装配过程 &#xff08;1&#xff09;根据 属性名称 装配 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; &#xff08;2&#xff09;根据 属性类型 装配 &#xff08;2.1&#…

python 判断文件是否被占用_python 在删除文件的时候检测该文件是否被其他线程或者进程占用?...

永远不要忘记&#xff1a;跨平台特性是Python的血液和命脉。在Linux下进程正在使用的文件&#xff0c;是不妨碍其他进程去移动/删除/更名的。因为在Linux下由inode确定文件&#xff0c;inode和文件路径虽然存在对应关系&#xff0c;但本质上是分离的。删除了某进程正在使用的文…

python怎么索引json中的值_使用Python在JSON中查找值

我之前已经成功地解析了JSON文件中的数据&#xff0c;但现在我要实现的函数遇到了问题。我有一个JSON格式的姓名、身份证号码和出生日期列表。我想在Python中得到的是让用户输入一个名字并检索他的身份证号码和出生日期(如果有的话)。这是我的JSON示例文件&#xff1a;[{"…

python3 json模块_详解python 3.6 安装json 模块(simplejson)

JSON 相关概念&#xff1a; 序列化&#xff08;Serialization&#xff09;&#xff1a;将对象的状态信息转换为可以存储或可以通过网络传输的过程&#xff0c;传输的格式可以是JSON&#xff0c;XML等。反序列化就是从存储区域&#xff08;JSON&#xff0c;XML&#xff09;读取反…

IOC操作Bean管理XML方式(外部属性文件)

目录 IOC操作Bean管理XML方式&#xff08;外部属性文件&#xff09; 前情引入&#xff1a; 实验演示&#xff1a; 1.直接配置数据库信息 &#xff08;1&#xff09;配置德鲁伊连接池 &#xff08;2&#xff09;引入德鲁伊连接池jar包 &#xff08;3&#xff09;创建一个b…