矿 仔

V1

2023/01/02阅读:15主题:默认主题

Python四:列表、切片、元祖

列表

继续前一篇列表的主题,本篇还包含一些列表其他的操作。

遍历列表

列表中包含很多的元素,当需要对列表中元素都执行相同的操作时,可以利用遍历。遍历这一操作也很常见,在Python中使用for循环。

定义一个players的列表,遍历其中的player。

从本节开始,开始使用编辑器来敲python代码,这里使用VS Code,下篇单独写一篇使用教程。

players = ['messi','kobe','kd']

这时,我想打印其中的每一个元素,通过遍历来进行,代码结构为

输出为:

这里的使用方式为

for 单个元素 in 列表: 即代码中的

for player in players:

注意,如果是处理遍历中每个列表中的元素,下一行的代码注意缩进,表示的是在遍历代码块的作用域内,完整的代码即

players = ['kobe','kd','messi']
for player in players:
    print(player)

值得注意的是,上面的单个元素我用的是player来表示,实际上这个名字是可以随意起的,但是起一个能准确表示元素含义的名字,会让代码的可读性更好,比如在players列表中,每个元素都是一个player。

循环这种概念也很重要,它是计算机自动完成重复动作的方式之一,不论列表中有多少元素,它都会一个一个的执行,直到没有元素了才会执行后面的代码

事实上,上面的打印是最简单的一种方式,在遍历的过程中,也同样可以对元素做更多的操作,比如打印一条个性化的消息,如下

players = ['kobe','kd','messi']
for player in players:
    print(f"{player} is a great player. ")

通过上面的一些例子知道了,缩进中的代码块会随着遍历进行执行重复的操作,如果在循环之后的代码不包含缩进,相当于从循环中出来了,比如在循环之后输出一条消息:

Python会根据缩进来判断代码行与前一个代码行的关系,也可以理解为这段代码属于哪块作用域内的。

如果缩进了不必要的缩进,Python会报错提示:

创建数值列表

数值列表即存储的都是数值元素,Python提供了一些工具用来高效的处理,比如range函数

print(range(1,5))

range函数会输出从第一个数开始,到第二个数停止,也就是到5的时候停止不输出,所以range(1,5)输出的就是1、2、3、4

range也可以指定一个参数,这样的话范围就是从0开始,比如range(5)返回的就是0-4

还可以通过range直接创建列表,利用到list函数。

numbers = list(range(1,5))
print(numbers)

range函数也可以指定第三个参数,步长,即后一个元素与前一个元素相差几。

例如打印1-10的偶数

numbers = list(range(2,11,2))
print(numbers)

这里从2开始,每一个都加2,直到达到11时停止。

有几个函数支持数值列表的统计计算。

min: 列表中最小值

max: 列表中最大值

sum: 列表元素的和

使用示例:

numbers = list(range(1,11))
min(numbers)
max(numbers)
sum(numbers)

列表解析

假设目前有个需求,定义一个1-10的平方和的列表,常规的做法是怎样的

squares = []
for value in list(range(1,11)):
    squares.append(value ** 2)

print(squares)

列表解析是什么?将for循环和添加元素的操作集合到一行代码上,用列表解析表示就是

squares = [value ** 2 for value in list(range(1,5))]

注意,这里的for循环没有冒号,定义的格式即

用一个变量接收 = 左方括号 要存储元素的操作方式 for循环遍历到的元素 右方括号,结合下来就是上面的表达式。

直白点理解就是,左右方括号中[]定义了元素的处理方式,然后通过遍历一个一个的填进去。

切片

Python中将使用列表的部分元素称之为切片。

定义一个列表players

players = ['kobe','kd','messi','mine','tom']

要创建切片,可以使用第一个元素和最后一个元素的索引,和range一样,到最后一个索引停止,不包含最后一个。

表达方式是:列表[start:end]

上面这个players列表,我要定义一个索引0-3的切片,写法为

players[0:3]

切片中包含的元素是0、1、2,也就是第一个,第二个,第三个的意思。

定义第二到第四个元素的切片

players[1:4]

如果没指定第一个元素的索引,从头开始取

print(players[:4])

这里应该展示的是索引0、1、2、3的元素。

如果想要切片取的元素到达末尾,可以不指定第二个元素,写法

players[1:]

这里就是从索引1取到最后的元素,如下:

同样可以利用负数索引取倒数的元素。比如

players[-2:]

这里表示从倒数第二个元素取到最后。

也可以在切片的取值中添加第三个参数,表示步长,隔几步一取。

players[0:5:2]

表示从第一个元素开始,隔两个元素取一个。

全切的话相当于复制整个列表,可以不指定开始和结束的元素,写法

players[:]

也可以进行遍历切片,写法与for循环类似,只是把列表换成切片即可。

列表与切片

在操作列表与切片的时候,底层对于元素的操作还是有些不同的。比如现在定义一个hobbys的列表

my_hobbys = ['抽烟','喝酒','烫头']
friend_hobbys = my_hobbys[:]

我的爱好抽烟、喝酒、烫头,朋友的爱好直接做了个整切,相当于搞了个副本。

看下输出先:

现在两个人都有了新的爱好,添加到对应的列表中去。

my_hobbys = ['抽烟','喝酒','烫头']
friend_hobbys = my_hobbys[:]

my_hobbys.append('滑板')
friend_hobbys.append('打游戏')

print(f"我的爱好 {my_hobbys}")
print("\n")
print(f"朋友爱好 {friend_hobbys}")

可以看出,两个人都添加了各自的爱好。假设不是用切片的方式,而是直接复制一份列表的话,再给各自添加一个爱好,会产生什么样的现象。

实验一下,代码略微改动:

my_hobbys = ['抽烟','喝酒','烫头']
friend_hobbys = my_hobbys

my_hobbys.append('滑板')
friend_hobbys.append('打游戏')

print(f"我的爱好 {my_hobbys}")
print("\n")
print(f"朋友爱好 {friend_hobbys}")

结果:

这里我本来是给自己添加一个滑板的爱好,给朋友添加一个打游戏的爱好,但是看结果发现,这两个爱好两个人都添加了一遍。

这是因为这种方式两个变量关联的是同一份数据,当其中一个变量修改时,另外一个也会跟着修改

元祖

列表是可以动态修改的,有时候需要创建一系列不可修改的元素,元祖可以满足这种需求。Python中将不可变的列表称为元祖。

元祖和列表在表达方式上有区别,列表使用方括号[],元祖使用圆括号()。其余根据索引访问元素是一样的。

假设有一个不可变的矩形,将它的长宽存在一个元祖中。

dimensions = (100,50)
print(dimensions[0])
print(dimensions[1])

尝试修改其中一个元素的值:

dimensions[0] = 200

会报错,返回类型错误,尝试修改元祖的元素是禁止的。

元祖中的元素是用逗号分隔的,如果只有一个元素,后面也要跟上逗号。

遍历与列表一样的,都是利用for循环。

虽然不可以修改元祖中的元素,但是可以给元祖的变量赋值,这个是合法的。相当于关联一个新的变量。

dimensions = (300,100)
print(dimensions[0])
print(dimensions[1])

总结

本篇涉及到了五个内置函数,分别是min、max、sum、list、range。

参考

《Python编程:从入门到实践》 埃里克·马瑟斯著

分类:

后端

标签:

后端

作者介绍

矿 仔
V1