四章 列表、元组以及如何设置代码格式
4.3 创建数值列表
4.3.3 对数字列表执行简单的统计计算
有几个专门用于处理数字列表的Python函数。比如指出列表中的最大值、最小值、求和以及数量等等。
#定义一个空的数值列表
numbers = [];
numbers.append(8);
numbers.append(6);
numbers.append(7);
numbers.append(61);
numbers.append(45);
numbers.append(12);
numbers.append(12)
print(numbers)
#获取列表numbers中的最大值
print(max(numbers));
#获取列表numbers中的最小值
print(min(numbers));
#对列表numbers进行求和
print(sum(numbers));
#获取列表numbers中的元素个数
print(len(numbers));
#得到列表的元素
[8, 6, 7, 61, 45, 12, 12]
#获取列表中的最大值
61
#获取列表numbers中的最小值
6
#对列表numbers进行求和
151
#获取列表numbers中的元素个数
7
4.3.4 列表解析
列表解析:将for循环和创建新元素的代码合并为一行,并自动附加新元素。
number = [i ** 2 for i in range(8,20,3)]
print(number)
#输出结果
[64, 121, 196, 289]
要使用这种语法,首先指定一个描述性的列表名,如上number;然后指定一个左方括号,并定义一个表达式,用于生成你要存储到列表中的值。在上面的事例中,使用range()函数帮我们创建8到20以内且步长为3的一个列表,然后进行平方运算后,得到了四个数,分别是8的平方64、11的平方121、14的平方196以及17的平方289。
注意:这里的for语句末尾没有冒号。
要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这样做是完全有意义的。当你觉得编写三四行代码来生成一组数值列表有点冗余繁复时,就要往创建列表解析方面着手。
4.3.5 练习(求和&运行时间)
练习:
1、计算1~1000000的总和:创建一个列表,其中包含数字1~1000000,再使用min()和max()核实该列表确实是从1开始,到1000000结束的。另外,对这个列表调用函数sum(),看看Python将一百万个数字相加需要多长时间。
import time
# 记录开始时间
start_time = time.time()
numbers = [i for i in range(1,1000000)];
print(numbers);
# 记录结束时间
end_time = time.time()
# 计算运行时间
elapsed_time = end_time - start_time
print(f"运行时间: {elapsed_time}秒")
运行结果:由于打印出来的结果太多,所以附一张图,如下:
全部打印出来的运行时间:
计算1~1000000总的求和时间:
import time
# 记录开始时间
start_time = time.time()
numbers = [i for i in range(1,1000000)];
print(f"计算1~1000000的总和为:{sum(numbers)}。");
# 记录结束时间
end_time = time.time()
# 计算运行时间
elapsed_time = end_time - start_time
print(f"运行时间: {elapsed_time}秒")
#输出结果
计算1~1000000的总和为:499999500000。
运行时间: 0.08270478248596191秒
2、3的倍数:创建一个列表,其中包含3 ~ 30内能被3整除的数,再使用一个for循环,将这个列表中的数打印出来;
#创建一个列表,其中包含3 ~ 30内能被3整除的数,再使用一个for循环,将这个列表中的数打印出来;
#使用range函数来随机生成能被3整除的数,只需要加上步长3就可以。
number = [i for i in range(3,31,3)]
print(number)
输出结果:
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
3、立方运算:
#创建立方运算,且将运算后的结果存入数值列表中
import math
numbers = [i ** 3 for i in range(1,11)]
print(numbers)
#三次方运算
numberss = [math.pow(i,3) for i in range(1,11)]
print(numberss)
#四次方运算
numbersss = [math.pow(i,4) for i in range(1,11)]
print(numbersss)
输出结果:
#三次方运算(整数)
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
#三次方运算(浮点数)
[1.0, 8.0, 27.0, 64.0, 125.0, 216.0, 343.0, 512.0, 729.0, 1000.0]
#四次方运算
[1.0, 16.0, 81.0, 256.0, 625.0, 1296.0, 2401.0, 4096.0, 6561.0, 10000.0]
4.4 使用列表的一部分
如何使用以及处理数值列表中的所有元素,在Python中称为切片(slice)。
4.4.1 切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与range()函数一样,Python在到达指定的第二个索引之前的元素时停止。要输出列表中的前三个元素,需要指定索引0和3,这将返回索引分别为0、1和2这三个元素。
#定义一个空的列表
color = []
color.append('orange');
color.append('yellow');
color.append('Red');
color.insert(-1,'Purple');
color.insert(int(len(color)/2),'Blue');
color.append('indigo');
color.append('green');
print(f"生成的列表元素为:{color}。\n")
#切片输出,特殊注意是[],中间还需要一个冒号:
print(f"使用切片输出索引为0到4的列表元素:{color[0:4]}。")
输出结果:
生成的列表元素为:['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']。
使用切片输出索引为0到4的列表元素:['orange', 'yellow', 'Blue', 'Purple']。
可以生成列表中的任意子集。
#定义一个空的列表
color = []
color.append('orange');
color.append('yellow');
color.append('Red');
color.insert(-1,'Purple');
color.insert(int(len(color)/2),'Blue');
color.append('indigo');
color.append('green');
print(f"生成的列表元素为:{color}。\n")
print(f"没有指定切片器的起始索引:{color[:4]}。\n")
#输出结果:
生成的列表元素为:['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']。
没有指定切片器的起始索引:['orange', 'yellow', 'Blue', 'Purple']。
由上面输出可知,如果没有指定切片的起始索引,那么Python将自动从列表开头开始提取,一直提取到末尾索引。
相反,如果没有指定末尾索引,指定了起始索引,那么Python将自动从起始索引一直提取到该列表元素完,程序如下:
#定义一个空的列表
color = []
color.append('orange');
color.append('yellow');
color.append('Red');
color.insert(-1,'Purple');
color.insert(int(len(color)/2),'Blue');
color.append('indigo');
color.append('green');
print(f"生成的列表元素为:{color}。\n")
print(f"没有指定切片的末尾索引:{color[3:]}。\n")
#输出结果:
生成的列表元素为:['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']。
没有指定切片的末尾索引:['Purple', 'Red', 'indigo', 'green']。
无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。由之前章节的知识可以知道,如果负数索引返回与列表末尾有相应距离的元素,因此可以输出列表末尾的任意切片。
#定义一个空的列表
color = []
color.append('orange');
color.append('yellow');
color.append('Red');
color.insert(-1,'Purple');
color.insert(int(len(color)/2),'Blue');
color.append('indigo');
color.append('green');
print(f"生成的列表元素为:{color}。\n")
#指定负数索引,比如要输出列表元素的最后四位元素
print(f"没有指定切片的末尾索引:{color[-3:]}。\n")
#输出结果:
生成的列表元素为:['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']。
没有指定切片的末尾索引:['Purple', 'Red', 'indigo', 'green']。
注意:可在表示切片的方括号内指定第三个值。这个值告诉Python在指定范围内每个多少个元素提取一个。
#定义一个空的列表
color = []
color.append('orange');
color.append('yellow');
color.append('Red');
color.insert(-1,'Purple');
color.insert(int(len(color)/2),'Blue');
color.append('indigo');
color.append('green');
print(f"生成的列表元素为:{color}。\n")
print(f"从倒数第四个元素开始数起:{color[-4::2]}。\n")
print(f"从倒数第七个元素开始数起:{color[-7::2]}。\n")
#输出结果:
生成的列表元素为:['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']。
从倒数第四个元素开始数起:['Purple', 'indigo']。
从倒数第七个元素开始数起:['orange', 'Blue', 'Red', 'green']。
4.4.2 遍历切片
如果要遍历列表中的部分元素,可在for循环中使用切片。
#遍历切片
message = ['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']
for i in message[2::3]:
print(i.title())
输出结果:
Blue
Indigo
在很多情况下,切片是很有用的。比如在编写游戏时,可以在玩家退出游戏时将其最终得分加入一个列表,然后将该列表按降序排列,再创建一个只包含前三个得分的切片,以获得该玩家的三个最高得分;在处理数据时,可以使用切片来进行批量查询;在编写Web应用程序时,可以使用切片来分页显示信息,并在每页上显示数量合适的信息。
4.4.3 复制列表
经常需要根据既有列表创建全新的列表,列表复制的工作原理以及复制列表可提过的极大情形。
要复制列表,可以创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。这让Python创建一个起始于第一个元素、终止于最后一个元素的切片,即复制整个列表。
#复制列表
message = ['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']
copy_message = message[::];
#输出复制后的列表
print(copy_message);
输出结果:
['orange', 'yellow', 'Blue', 'Purple', 'Red', 'indigo', 'green']
首先,创建一个名为message的列表,然后再创建一个名为copy_message的新列表。在不指定任何索引的情况下,从列表message中提取一个切片,从而创建这个列表的副本,再将该副本赋给变量copy_message。然后我们就完全将列表message中的列表元素复制到新列表copy_message中。
4.5 元组
列表非常适合用于存储在程序运行期间可能发生的数据集。列表是可以修改的,这对于处理网站的用户列表或游戏中的角色列表至关重要。然而有时候需要创建一系列不可修改的元素,元组可满足这种需求。Python中将不可修改的值称为不可变的,而不可变的列表称为元组(tuple)。
4.5.1 定义元组
元组看起来很像列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就向访问其列表元素一样。
#定义一个元组
color = ('orange','red')
#输出元组值
print(color[0])
print(color[1])
输出结果:
orange
red
首先我们定义一个元组color,为此使用了圆括号而不是方括号。接下来,分别打印该元组的各个元素,使用的语法与访问列表元素时使用的语法相同:
我们尝试来修改元组的值:
color[0] = 'purple';
print(color[0]);
输出结果:
Traceback (most recent call last):
File "g:\Python\Basic_knowledge\tuple.py", line 8, in <module>
color[0] = 'purple';
~~~~~^^^
TypeError: 'tuple' object does not support item assignment
解释:这里的代码【color[0] = ‘purple’】尝试修改第一个元素的值,导致Python返回类型错误的消息。由于试图修改元组的操作是被禁止的,因此Python指出不能给元组的元素赋值。
注意:严格地说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义只包含一个元素的元组,必须在这个元素后面加上逗号:color = (‘green’,)。创建只包含一个元素的元组通常情况下是没有意义的,但自动生成的元组有可能只有一个元素。
4.5.2 遍历元组中的所有值
像列表一样,也可以使用for循环来遍历元组中的所有值:
#定义一个元组
message = (30,20,56,70,45,23,12,5,89,20,15);
#使用for循环对元组进行遍历
for i in message:
print(i)
就像遍历列表时一样,Python返回元组中所有的元素。
30
20
56
70
45
23
12
5
89
20
15
4.5.3 修改元组变量
虽然不能修改元组的元素,但可以给存储元素的变量赋值(即重定义):
dimensions = (30,70);
#得到元组中的元组值
for i in dimensions:
print(f"遍历原定义的元组元素:{i}。");
#重新给元组进行定义
dimensions = (90,200)
#再次遍历定义后的元组
for i in dimensions:
print(f"遍历重新定义后的元组元素:{i}。")
#输出结果:
遍历原定义的元组元素:30。
遍历原定义的元组元素:70。
遍历重新定义后的元组元素:90。
遍历重新定义后的元组元素:200。
4.6 设置代码格式
随着编写的程序越来越长,我们需要了解一些代码的格式进而来设置约定。花时间让你编写的代码尽可能易于阅读;让代码易于阅读有助于你掌握程序是做什么的,也可以帮助他人理解你编写的代码。
4.6.1 设置代码格式
若要提出Python语言修改建议,需要编写Python改进提案(Python Enhancement Proposal,PEP)。PEP 8是最古老的PEP之一,它向Python程序员提供了代码格式设置指南。PEP 8的篇幅很长,但大都与复杂的编码结构相关。
Python格式设置指南的编写者深知,代码被阅读的次数比编写的次数多。代码编写出来后,调试时你需要阅读它;给程序添加新功能时,需要花很长的时间阅读代码;与其他程序员分享代码时,这些程序员也将阅读它们。
如果一定要在让代码易于编写和易于阅读之间做出选择,Python程序员几乎总是会选择后者。
4.6.2 缩进(indentation)
PEP 8建议每级缩进都使用四个空格,这既可提过可读性,又留下足够多的缩进空间;
在字处理文档中,我们常常会使用制表符而不是空格来缩进。对于字处理文档来说,这样做的效果很好,但混合使用制表符和空格会让Python解释器感到迷惑。每款文本编辑器都提供了一种设置,可将输入的制表符转换为制定数量的空格。你在编写代码时应该使用制表符键,但一定要对编辑器进行设置,使其在文档中插入空格而不是制表符。
在程序中混合使用制表符和空格可导致极难解决的问题。如果混合使用了制表符和空格,可将文件中所有的制表符转换为空格,大多数编辑器都提供了这样的功能。
4.6.3 行长
在已经形成的习惯中,很多程序员都建议每行不超过80个字符。PEP 8中有关行长的指南并非不可逾越的红线,有些小组将最大行长设置为99字符。在学习期间,你不用过多地考虑代码的行长,但别忘了,协作编写程序时,大家几乎都遵守PEP 8指南。在大多数编辑器中,都可设置一个视觉标志——通常是一条竖线,让你知道不能越过的界线在什么地方。
4.6.4 空行
要将程序的不同部分分开,可使用空行。我们应该清楚的一点是,要使用空行来组织程序,不能随便滥用。
空行不会影响代码的运行,但是会影响代码的可读性。Python解释器根据水平缩进情况解读代码,但不关心垂直间距。
4.6.5 其他格式设置指南
4.7 小结
在本章中,你学习了:
- 如何高效地处理列表中的元素;
- 如何使用for循环遍历列表;
- Python如何根据缩进来确定程序的结构以及如何避免一些常见的缩进错误;
- 如何创建简单的数字列表,以及可对数字列表执行的一些操作;
- 如何通过切片来使用列表的一部分和复制列表。
- 元组的基础知识以及操作;
- 在代码变得越来越复杂时如何设置格式,使其易于阅读。
以上的内容,是本人自学Python,写的笔记,如有错误,请留言哦!!!本人会在第一时间及时更正。
行,但是会影响代码的可读性。Python解释器根据水平缩进情况解读代码,但不关心垂直间距。
4.6.5 其他格式设置指南
4.7 小结
在本章中,你学习了:
- 如何高效地处理列表中的元素;
- 如何使用for循环遍历列表;
- Python如何根据缩进来确定程序的结构以及如何避免一些常见的缩进错误;
- 如何创建简单的数字列表,以及可对数字列表执行的一些操作;
- 如何通过切片来使用列表的一部分和复制列表。
- 元组的基础知识以及操作;
- 在代码变得越来越复杂时如何设置格式,使其易于阅读。
以上的内容,是本人自学Python,写的笔记,如有错误,请留言哦!!!本人会在第一时间及时更正。如果你觉得有用,请关注我,一起学习Python,一起高薪!!