联想说 Python 基础 11 - 元祖

复合数据类型

目标:掌握几种复合数据类型的格式,以及基本运用。

以后常用。

前面的文章中,有看到一些特殊的数据类型,但是我们没有细致说明的。比如在函数这一节的最后讲可变参数的时候,他们的值就不太一样,分别是这样的:

  • *args 的值

    (1, 2, 3, 4, 5, 6)
    
  • **kwargs

    {'name': 'alice', 'age': 0, 'sex': 'yao'}
    

这些我们可以统称为复合数据类型(为了和前面的基本类型区分开,其实它们也是基本类型),除了这两种外还有(暂且不表)。

有没有人对为什么要有复合数据类型的数据有疑惑的?

如果有,你就想象一下你抱着一箱水(有箱子),和抱着 24 瓶水,哪个更舒服。

复合数据类型就相当于给这一堆水加了箱子,方便批量使用。

元祖

形如 (元素1, 元素2.....) 这样的,就是 元祖 了,所以上面看到的 *args 的值就是元祖类型。

为什么叫元祖?可能因为它圆(括号)吧 (¬‿¬)。

前面好像说过有一个函数可以查看数据类型的吧,这里我们分别用 type 函数查看一下元祖是用什么表示的,以及它的结果是怎么显示的。

元祖类型

格式

咱们先定义一个元祖赋值给一个变量,然后分别查看其值和类型:

yz = (1, 2, 3, 4, 5, 6)
print(yz)
print(type(yz))

结果:

(1, 2, 3, 4, 5, 6)
<class 'tuple'>

从结果可以看出元祖的值和定义的是一模一样的,以后看到用小括号括起来的值,基本上就是元祖了(没说绝对哈,因为它也有可能是字符串)。

再看其类型的表示,打印得到的结果是 <class 'tuple'>,其中引号里面的 tuple 就是它的类型了,它就代表了 元祖(关键字)。

特点

  1. 不可变:元组是不可变的,即元组中的元素不可以增加、删除或修改,只能访问
  2. 有序:元祖是有序的,有顺序和位置,从0开始
  3. 有多个成员数据:成员之间用逗号隔开
  4. 可以是任意数据类型:元素可以是数字、字符串等
  5. 数据可以重复:元祖中的元素可以重复

因为它相对来说不是很灵活的原因,所以相对来说,人们更愿意用一些比较灵活的,比如列表。

注意:当元组中只有一个元素时,需要在元素后面加逗号。

元祖常用方法

查询

索引

什么是索引?

索引 就是 元素所在的位置,比如:

0,1,2,3,4,5,6,7,8,9

数字 1 所在的位置是 2,但是在编程中,索引是从 0 开始算的,所以数字 1 真实的索引值应该是 1

再看元素:

a,b,c,d,e,f,g

请问,d 的索引是什么?答案是 3。

索引不仅可以从左往右算,还可以从右往左算哦!

如果从右往左算,则是从 -1(表示最后一个) 开始,越往左,值越小。

根据索引获取元祖元素

首先给一个元祖,后面演示的过程中,没有特别的都会使用这个元祖演示:

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

要通过索引获取元祖中的某个元素,可以通过 元祖名称[索引] 来获取。

那么,要获取索引值为 6 的元素的写法如下:

tp_idx = tp[6]
print(tp_idx)

最后得到的结果为 7。

切片

切片与索引类似,不过使用切片一般是范围获取。它的格式如下:

元祖名称[开始索引:结束索引]

需要注意的是,切片包左不包右,也就是说包含开始索引的值,但是不包含结束索引的值。

那这段代码执行后得到的结果是什么呢?

tp_sli = tp[0:1]
print(tp_sli)

结果:(1,)

为什么叫切片?

把元祖中的每个元素否切分开成一片一片的,你要那片拿那片,所以叫切片。

切片的其他用法

比如 :

  • [1:] 表示从索引 1 开始获取,直到结束(包括最后一个元素)

    结果:(2, 3, 4, 5, 6, 7, 8, 9)
    

    同理,开始索引不提供,则表示结束索引之前的都要。

  • [-2:-1] 表示从倒数第二个到最后一个,但是不包含最后一个

    结果:(8,)
    
  • [1:6:2] 表示从索引 1 开始获取,到索引 6 每 2 个元素获取

    2 表示 步长,也就是每两个元素获取一个:

    结果:(2, 4, 6)
    

索引和切片,在后面也会用到,概念也都一样。

其他方法

以下方法相对简单,就不再一一详细说明了,给个例子自己体会

  1. len():获取目标长度

    print(len(tp))  # 9 
    
  2. in:判断元素是否在目标中

    与 in 类似的还有 not in,写法基本一样,作用刚好相反

    print(1 in tp)  # True
    print(10 in tp)  # False
    

len 和 in 并非元祖独有,在其他复合数据类型中也可以使用。

  1. count():统计元素个数

    print(tp.count(1))  # 1  个
    
  2. index():获取元素索引

    print(tp.index(1))  # 0  索引值
    

遍历

遍历,翻译一下就叫全部经历一遍。

就拿元祖来说,遍历某个元祖就是对元祖中的每个元素都 宠幸 一遍

很遗憾的是,Python 并没有特地提供专门用来遍历的语法,那怎么办?

再看看遍历的含义,是对目标中的每个元素都访问一遍。循环不就是来干这苦活累活的吗?

一般说遍历都会和循环一起使用,对上面的元祖遍历则可以这样:

print("-------------------")
i = 0
while i < len(tp):
    print(tp[i])
    i += 1

print("-------------------")
for i in range(0, len(tp)):
    print(tp[i])

print("-------------------")
for t in tp:
    print(t)

任意一个随便选,我还是喜欢第三个。

嵌套

还记得前面说的嵌套吗,既然元祖里面可以放东西,那能不能继续放元祖?

答案是可以的,就像这样:

tps = (1, 2, 3, (4, 5, 6))

名为 tps 的元祖中存在整型和元祖类型的元素,而元祖类型元素的索引是 3,也就是 tps[3]。

也就是说 tps[3] 还是一个元祖,那么要获取这个内层元祖中的第一个元素怎么获取?

像这样:tps[3][0]

不管某个东西套了多少层,只用管获取到的是什么类型的数据,然后根据这个类型获取就可以了。

后面几种复合类型也可以嵌套,咱就不特别说明了。

posted @ 2023-10-09 19:06  笔锋微凉~~  阅读(71)  评论(0)    收藏  举报