最小化python之列表

时启发 2024-05-15 20:55:58

按理说,前几篇聊过了不少基本数据类型的内容,仿佛啥都讲到了,其实又啥也没有讲到。所以,今天的文章就让我们回顾一下基础类型里的列表。虽说是回顾,但其实未必没有新的知识点。比如list在第一次赋值之后,如何添加新的元素,又如何修改或删除现有元素,再或者能否按大小个排个序,等等

这里先引入一个类和对象的概念。我的理解,类就是将一组有关联性的数据和相关的专属函数组合在一起的一段代码块。而对象,是按照类的定义,申请一个内存块用于存放专属数据和对应函数之后,得到的这块内存的入口(如果学过c/c++的话,可以理解为指向这块内存的指针),以便于程序后续的调用。这里有面向对象的知识需要了解。

python中所有类的基类是object。而基础类型同样也是类,是直接或间接继承自object的子类。不信的话可以试一试Python的内置函数issubclass(class,classinfo)。issubclass有两个参数,第一个参数class是要测试的类名,第二个参数classinfo是另外一个类名(可以先这样理解),然后判断class是否是classinfo的子类,如果是则返回True,否则,返回False。现在看一看字符串str、数值(int、float、complex)以及容器类(list、tuple、set、dict)等,他们是不是基类object的子类,见图1:

图1 基本类型是否为object的子类的判断

其实,当你明白所谓的基本类型也是面向对象的类的时候,基本类型的“基本”二字就快不存在了。

现在看一下列表的情况吧。

图2 列表的定义

既然是可变序列,那么可变序列又是啥,能做什么操作呢?见图3:

图3 可变序列及其可用操作

好的,也就是list是collections.abc.MutableSequence的子类:

图4 list是collections.abc.MutableSequence的子类

还是不懂也没有关系,可以理解collections.abc.MutableSequence这个类型能做的事情,它的子类list同样应该可以做。因此增加可以使用.append方法,删除可用del 某元素或.remove方法解决。等等。

于是,接下来,我们首先创建了一个元素包含1,2,3,4四个数值的列表,然后添加数值5到列表之中,接着删除了列表中i索引值为2的元素(注意注意,计算机中的索引绝大部分从0开始计,这里也不例外),然后在第1个索引位置添加了数值100,最后删除了索引位置为2的元素。逐项操作见下图5所示:

图5 列表的几个基本操作

然后,切片终于来了。切片到底是什么?我的理解,就是数据变量中的一部分数据。python对变量部分数据的获取,采用了切片的方法。如何能更容易理解,我们不妨从其中一个元素的获取开始:我们知道,对于列表a而言,访问索引值为i的数据,应当表示为a[i]。现在我们稍作修改,取索引值为i的数据切片。这时我们引入了一个冒号,冒号的两侧表示从小至大(不包含)的范围。所以,只取i索引位置的数据切片应当表示为a[i:i+1],见下图6:

图6 列表取索引位置为i处数据组成的切片

如果稍微细心些,你会发现i处的数据和i处数据组成的切片,好像是不同的表示!确实是这样的。上图的演示中,i=1时,a[i]=2,而a[i:i+1]=[2]。也就是说切片保持了原有的列表类型,而索引位置的元素保持的当然是元素的类型。

理解了只包含一个元素的切片,就不难理解包含更多元素的切片。取切片范围时,冒号左右两端分别是开始位置和终止位置(切分时不包含终止位置的元素)。所以,a[0:3]表示的是前三个元素。冒号左右两端的表索引的数值或变量可以省略,冒号左边省略,表示开始于索引位置为0的元素;冒号右边省略,表示终止于列表最后一个位置的后面位置(即将列表长度作为索引值时的那个位置,虽然是不存在的);如果索引位置采用了负数的形式,表示为倒数第几个元素,如:-1表示最后一个元素,-2表示倒数第二个元素。见图7:

图7 切片

如果能够理解列表的切片,现在考虑一下字符串的切片,有没有一种豁然开朗的感觉呢?

2 阅读:123

时启发

简介:读书笔记,编程经验,旅途见闻,人生感悟