分享

UC头条:深挖 Python 元组 pt.1

 cnzrp 2023-10-09 发布于山西

哈喽大家好,我是咸鱼

好久不见甚是想念,2023年最后一次法定节假日已经结束了,不知道各位小伙伴是不是跟咸鱼一样今天就开始“搬砖”了呢?

我们知道元组(tuple)是Python的内置数据类型,tuple是一个不可变的值序列

tuple的元素可以是任何类型,一般用在存储异构数据(例如数据库记录)的场景

那么今天这篇文章将带大家深入了解一下tuple以及它们的主要功能和示例(原文较长,我分成几个部分去讲)

前言

tuple是不可变的,可以存储固定数量的元素(也可以叫项目,item)

例如可以通过tuple来表示笛卡尔坐标(x,y)、RGB颜色(red,green,blue)或者数据库表中的记录(name,age,job)

tuple的一些特点如下:

有序:里面的元素可以按照顺序排列

轻量级:与列表等其他序列相比,tuple消耗的内存要少

从零开始索引:可以从零开始索引访问里面的元素

不可变:不可以改变里面的元素

异构:可以存储不同数据类型的对象(包括可变对象)

可嵌套:tuple里面可以包含tuple

可迭代:能够遍历里面的元素

可切片:可以从元组中提取一系列元素

可组合:支持串联操作,可以使用串联运算符组合多个元组

可哈希:里面的元素都是不可变时可以用作字典的键

在python中,tuple是有序的,这意味着其元素保持原始插入顺序,这个顺序在tuple的生命周期内保持不变

可以按位置或索引访问元组中的元素(从零开始)

创建tuple

tuple是以逗号分隔的序列对象。要在元组中存储对象,需要一次创建包含其所有内容的元组对象

直接创建

#语法(item_0,item_1,...,item_n)

需要注意的是,括号不是必需的,逗号才是。但是在大多数情况下括号可以提高代码的可读性

尽管括号对于定义大多数tuple不是必需的,但在创建空tuple时必须包含它们:

因为tuple是不可变的,所以创建空tuple之后无法往里面添加元素。到这里有小伙伴可能会问:既然这样为什么还要创建一个空tuple?

例如现在有一个构建并返回tuple的函数,在一些情况下这个函数不会为生成的tuple创建元素,这样我们就需要返回一个空tuple。以此来使得函数的返回值类型保持一致

除此之外,下面的情况也需要使用到括号

当我们使用%进行格式化输出的时候:

第一种加括号:使用括在括号中的元组作为%运算符的右侧操作数,按预期工作

第二种没加括号:报错

我们创建单个元素的tuple

可以看到括号不是必需的,尾随逗号才是

使用tuple创建

还可以使用tuple从可迭代对象(列表、集合、字典或字符串)中创建tuple,默认生成一个空tuple

通过集合来创建tuple时需要注意集合是无序的,会影响生成tuple中的元素的最终顺序

如果我们从一个迭代器对象中创建一个tuple,那么tuple函数会使用迭代器逐个生成元素,然后将这些元素组合成一个元组并返回

my_list=[1,2,3,4,5]#可迭代对象my_iterator=iter(my_list)#转换为迭代器对象my_iteratormy_tuple=tuple(my_iterator)print(my_tuple)#输出结果为:(1,2,3,4,5)

又或者从生成器表达式中创建tuple,生成器是一种特殊的迭代器

>>>tuple(x**2forxinrange(10))(0,1,4,9,16,25,36,49,64,81)

tuple索引和切片

tuple中每一个元素都有一个整数索引,用于指定其在元组中的位置,索引从0开始

点击加载图片

用不同的索引为tuple建立索引,可以直接访问相关的值。如果使用大O符号表示时间复杂度,那么可以说索引是一个O(1)操作

这意味着tuple非常适合需要快速访问序列中的特定项的情况

len函数返回tuple长度

>>>len(jane)4

如果使用大于或等于tuple长度的索引,则会报错

>>>jane[4]Traceback(mostrecentcalllast):...IndexError:tupleindexoutofrange

还可以使用负索引,负索引从右端开始数起

负索引对于所有Python序列(例如列表和字符串)都是通用的

点击加载图片

如果使用负索引,则-len(tuple_object)将成为元组中的第一项。如果使用低于此值的索引,则会报错

>>>jane[-5]Traceback(mostrecentcalllast):...IndexError:tupleindexoutofrange

对于嵌套tuple,我们该如何访问到里面的元素?

>>>employee=(...'John',...35,...'PythonDeveloper',...('Django','Flask','FastAPI','CSS','HTML'),...)

答案是通过多层索引

tuple切片

和其他序列一样,tuple可以使用切片操作来提取其中的内容

#语法tuple_object[start:stop:step]

[start:stop:step]此构造的一部分称为切片运算符。它由一对方括号和三个可选索引组成:start、stop和step

其中第二个冒号不是必须的,如果step为1的话就可以省略

Index

Description

DefaultValue

start

指定要开始切片的索引(开区间)

0

stop

指定希望切片停止提取元素的索引(闭区间)

len(tuple_object)

step

提供一个整数值,表示切片在每个步骤中将跳过多少项

1

不可变特性

Python的tuple是不可变的,这意味着一旦你创建了一个tuple,你就不能就地更改或更新它的元素,只能创建新的tuple对象

tuple不可变的另一个含义是无法对其扩容缩容,与列表不同,元组没有.append、.extend.insert.remove和.clear方法

也不支持del语句

尽管tuple是不可变的,但是我们知道tuple里面可以存储任意类型的对象,包括可变对象

这意味着我们可以在tuple中存储列表、集合、字典等其他可变对象

>>>student_info=('Linda',18,['Math','Physics','History'])

student_info中前两个元素是不可变的,最后一个是列表(可变),所以我们可以对其进行更改

又因为tuple是不可变的(可哈希),所以可以用作字典中的key

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多