我爱编程

15天Python入门 Day03:列表之二

2018-08-02  本文已影响3人  明日之丈

导读

在上一章中,我们学习了什么是列表,如何对列表进行增删改操作以及介绍了一些常用的关于列表的方法,在这一章里,我们将继续深入学习Python列表的遍历方法及其他相关细节。

遍历整个列表

通过前面所学的内容,我们同样可以对列表元素进行输出(某种意义上的遍历),当列表元素个数较少时,我们不会觉得麻烦,但是,在实际中我们常常会需要操作几百个元素,这时再用简单的输出操作就显得鸡肋了,因此我们要学会用for循环来对列表进行遍历。

下面是一张包含学生姓名的列表,我们将用for循环来对整个列表进行遍历:

students=['Jack','Tom','Lucy','Zhangsan','Lisi']

for student in students:

print(student)

对于第一行的代码,我们并不会陌生,然而从第二行开始的是什么鬼,看不懂喂,教程太烂了吧,我们先深呼吸,平静一下,来看看程序运行的结果是怎么样的:

Jack

Tom

Lucy

Zhangsan

Lisi

[Finished in 0.1s]

我们可以把for...in...:当做英文里面的语法,简单来说就是记住这个语法,当然,并不是要求你死记硬背,理解它的中文含义就ok了,for...in...就是在...里...,我们用student作为临时变量代指students列表中的每一个学生元素,所以,“翻译一下”就是在students(学生列表)中的每个student(学生元素),Python会智能的从students列表中按索引值取出student元素,我们要操作的就是这一个个student元素啦。

值得注意的是,千万不能忘记for语句后面的冒号(:),这个相当于是在说“for循环开始了,各单位请注意,需要进行循环的语句快到我后面来”。那么怎么样才算是进入了for循环呢?我们在输入冒号(:)之后,回车,光标跳转到了下一行并且在前面空出了四个空格,这说明从这开始就是循环体了,也就是说,在for语句里,四个空格(或者tab,前面说过,最好不要混用)就意味着这是循环体。

在这个循环体里,我们要求输出每一个student元素,让我们来看看程序运行结果:

Jack

Tom

Lucy

Zhangsan

Lisi

[Finished in 0.1s]

和前面整个输出列表(形如[xxx,xxx,xxx])不一样,for循环输出单个元素并且会自动换行

我们给循环体加上两句代码看看:

students=['Jack','Tom','Lucy','Zhangsan','Lisi']

for student in students:

print(student)

print("Hello,My name is "+student+".")

print("----------------------------")

加上虚线更好看,是的,我就是这样一个追求完美的人(笑)。我们看看程序运行结果:

Jack

Hello,My name is Jack.

----------------------------

Tom

Hello,My name is Tom.

----------------------------

Lucy

Hello,My name is Lucy.

----------------------------

Zhangsan

Hello,My name is Zhangsan.

----------------------------

Lisi

Hello,My name is Lisi.

----------------------------

[Finished in 0.1s]

循环体里的语句每一次循环就会被执行一次,而变化的内容student就相当于它的索引值在每一次循环后都自动加上了1,这样就能实现整个列表的遍历了。

让我们再来看看循环体的结束,在刚刚的代码后面加上新的代码,如下:

students=['Jack','Tom','Lucy','Zhangsan','Lisi']

for student in students:

print(student)

print("Hello,My name is "+student+".")

print("----------------------------")

print("The for_loop is over!")

前面的内容不做修改,我们在与for...in...对齐的位置上加上print输出语句,这就意味着print("The for_loop is over!")已经跳出了循环,再看看程序运行结果:

Jack

Hello,My name is Jack.

----------------------------

Tom

Hello,My name is Tom.

----------------------------

Lucy

Hello,My name is Lucy.

----------------------------

Zhangsan

Hello,My name is Zhangsan.

----------------------------

Lisi

Hello,My name is Lisi.

----------------------------

The for_loop is over!

[Finished in 0.1s]

看到了吗?The for_loop is over!只被输出了一次,这说明它确实已经跳出了for循环

缩进

通过前面的讲解,我们已经完全知道了缩进(四个空格或者tab)的重要性,它标志着循环的开始和结束,当我们对for循环等循环有更加深入的了解之后(比如二重循环),就更能看出缩进的重要性了。

数值列表

在前面的内容里,我们提到过列表里不仅可以存放字符串,还能存放数值(整型,浮点型等),而纯数值列表在Python的实际应用非常广,比如存储爬取到的数据。下面让我们来学习一下数值列表中常用的方法。

1.range()

先简单介绍一下range()方法,range在英文中是“范围”的意思,range()就是在某个范围内,当括号里的参数一个数字(整数)时,range(x)表示“从0到x”,即[0,x);而当我们给range()一个定区间(如range(x,y))时,表示“从x到y”,即[x,y)。我们在程序里实现一下:

for x in range(5):

print(x)

print("-----")

for x in range(1,5):

print(x)

我们分别用range(5)和range(1,5)输出一下:

0

1

2

3

4

-----

1

2

3

4

[Finished in 0.1s]

很显然,对于与第一个range()我们只给定了右端的5,Python默认从0开始进行循环,而第二个range()我们指定从1开始,Python也是从1开始循环输出到5。

2.list()

list()函数能够创建一个列表,结合range()函数就能够只用简洁的代码写出数值列表。我们创建一个长度为5的数值列表,如下:

numbers=list(range(1,6))

print(numbers)

打印输出numbers列表:

[1, 2, 3, 4, 5]

[Finished in 0.1s]

可以理解为,range()函数先是创建一个由1,2,3,4,5组成的数字集合,再由list()函数将其转换为列表,输出后的效果为[1, 2, 3, 4, 5],也说明numbers是一个列表

range()函数还有第三个参数,指定步长默认情况下步长为1。那么何为步长呢?步长即每次range()新增的数在原来的基础上增加的部分。当步长为1时,形如1,2,3,4,5;当步长为2时,形如1,3,5,7,9。用代码实现以下更为直观:

numbers=list(range(1,10,2))

print(numbers)

指定范围从1到10,左闭右开,步长为2(每次加2),打印看看结果:

[1, 3, 5, 7, 9]

[Finished in 0.1s]

可以看到,输出结果确实是在[1,10)这个范围之内,并且每次都在原来基础上加2

3.range() plus

上面我们看到了range()结合list()函数的例子,事实上,range()的用法还有很多,通过各种运算,甚至可以得到任何我们想要的结果,比如结合乘方(**)我们可以得到如下这样的列表:

squares=[]

for x in range(1,6):

squares.append(x**2)

print(squares)

程序开始我们先创建了一个空的列表,然后在for循环里通过append()函数依次为它添加新的列表元素,注意,这里的列表元素是经过“加工”的,每个添加的元素都是经过平方运算后得到的,我们打印输出squares列表:

[1, 4, 9, 16, 25]

[Finished in 0.1s]

对比我们上面的例子,发现每个元素都是经过了平方运算,这样我们就得到了一个相对复杂的列表。

简单数学函数

这里先简单介绍三个常用的数学函数,用于求最值的min()函数和max()函数,以及求和函数sum()。通过实例我们可以直观的了解他们的用法:

squares=[]

for x in range(1,10):

squares.append(x**2)

print(squares)

print("Min="+str(min(squares)))

print("Max="+str(max(squares)))

print("Sum="+str(sum(squares)))

在原来的基础上加上三个数学函数的运用,注意,min()等函数返回的仍是数值型(int,float等),在和字符串(string)的拼接的过程中必须将其转换为string类型,通过前面所学的str()函数就能轻而易举地解决了。我们来看程序运行结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]

Min=1

Max=81

Sum=285

[Finished in 0.1s]

我们可以简单验算一下,发现结果没有错误(电脑怎么可能算错,要说错,也肯定是代码有问题)。

使用部分列表

切片(:)——Python与其他语言最大的优势之一,不需要繁琐的函数操作,只要熟练掌握切片就能随心所欲的使用列表,当然,强大如切片不止在列表里能大展身手,在其他领域也是呼风唤雨。

切片

通过切片我们可取出列表的部分元素,如下面的例子:

students=['Jack','Rose','Tom','Martin','Lisi','Lucy']

print(students[1:4])

print(students[:3])

print(students[2:])

print(students[:])

创建一个学生列表,用切片取出部分学生姓名,程序运行结果如下:

['Rose', 'Tom', 'Martin']

['Jack', 'Rose', 'Tom']

['Tom', 'Martin', 'Lisi', 'Lucy']

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

[Finished in 0.1s]

可以看到切片的使用方法为列表名[x:y],表示从列表中取出从x到y的内容,其中x,y左闭右开,中间用冒号(:)分隔,当省略x时,默认从0开始,这和range()函数类似;也可以省略y,这意味着从x取到最后;当然也可以全部省略,就是我们所说的复制列表,我们将得到一个和原列表一样的列表。

值得一提的是,前面我们所学的负向(-x)的索引值也是可以的,比如:

students=['Jack','Rose','Tom','Martin','Lisi','Lucy']

print(students[-3:])

print(students[-4:-2])

带负号(-)的索引值意味着它在列表中是倒数的,运行程序可以得到:

['Martin', 'Lisi', 'Lucy']

['Tom', 'Martin']

[Finished in 0.1s]

用法和普通索引值一样,这里就不在赘述。

遍历切片

我们已经学会了通过for循环遍历整个列表,现在我们通过切片来遍历部分列表:

students=['Jack','Rose','Tom','Martin','Lisi','Lucy']

for student in students[:4]:

print("Hello,My name is "+student+".")

细心的同学应该发现了,我们把原来是range()的部分替换成了students切片,这样我们循环的就不是整个列表了,而只是列表的切片,即部分列表,我们看到程序运行结果:

Hello,My name is Jack.

Hello,My name is Rose.

Hello,My name is Tom.

Hello,My name is Martin.

[Finished in 0.1s]

显然,for循环只遍历了索引值为4之前的列表元素,感兴趣的同学可以继续替换切片范围,观察输出,由于篇幅有限,这里就不在演示。

复制列表

说到复制列表,我们同学第一印象想到的应该是直接通过赋值运算(=)来复制一个新的列表,现在我们用直接赋值的方式来复制一个学生列表,如下:

students=['Jack','Rose','Tom','Martin','Lisi','Lucy']

students2=students

print(students2)

print(students)

直接用等号(=)连接两边,我们看看是否复制成功:

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

[Finished in 0.1s]

有同学就说了,这不是得到了两个一样的列表吗?我们给新的列表students2加上一个学生再看看输出结果:

students=['Jack','Rose','Tom','Martin','Lisi','Lucy']

students2=students

print(students2)

print(students)

print("-------------------------")

students2.append("Zhangsan")

print(students2)

print(students)

在原有代码上做以上改动,再来输出结果看看:

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

-------------------------

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy', 'Zhangsan']

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy', 'Zhangsan']

[Finished in 0.1s]

以分割线为界,上面的是我们直接复制输出的结果,下面的是我们在追加一个学生后的输出结果,可以看到,我们本希望只在students2列表里追加一个学生姓名,但是事实上,并未直接对其做改动的原students列表被追加进了一个新的学生,这明显和我们的期望不符,那么,究竟该如何正确复制列表呢?

在切片那里我们提到过,用[:]这样的方法可以实现复制列表,让我们修改一下刚刚的代码,再来看一下:

students=['Jack','Rose','Tom','Martin','Lisi','Lucy']

students3=students[:]

print(students3)

print(students)

print("-------------------------")

students3.append("Zhangsan")

print(students3)

print(students)

只需要在第二行的最后加上[:]就可以了,我们来看看程序运行结果:

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

-------------------------

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy', 'Zhangsan']

['Jack', 'Rose', 'Tom', 'Martin', 'Lisi', 'Lucy']

[Finished in 0.1s]

对比一下,发现没有,在分割线以上的部分没有变化,说明我们已经复制产生了一个列表,但是这个列表究竟会不会影响原来的列表呢?我们往下看,我们同样是在新的列表students3当中追加了一名学生,然后打印输出,很明显原有的列表students并未被追加,而正如我们所期望的students3列表则顺利的追加进了一个新的元素,这就说明我们复制列表成功了(可喜可贺可喜可贺)!

元组

列表都是由方括号([])所包裹,方括号也就像生活中常见的表格一样是方方正正的,然而还有一种由圆括号(())所包裹的列表,因为圆括号是圆的,所以被称为“元组(tuple)”。

好吧,我承认,以上是我瞎编的。。。

事实上,Python规定,列表里面的值是可变的(比如我们前面对列表元素的修改),而元组是特殊的列表,它的值是不可变的。

我们来定义一个元组,并且验证一下它的不可变性:

numbers=(1,2,3,4,5)

print(numbers)

print(numbers[0])

print(numbers[1])

和列表一样,只不过是把方括号换成了圆括号,我们看看输出情况:

(1, 2, 3, 4, 5)

1

2

[Finished in 0.1s]

是的,毫无意外。。。我们试着修改一下元组的值:

numbers=(1,2,3,4,5)

print(numbers)

print(numbers[0])

print(numbers[1])

numbers[0]=-1

print(numbers)

运行程序会出现错误提示:

Traceback (most recent call last):

(1, 2, 3, 4, 5)  File "C:\Users\xxx\xxxx\xxxxx\tuple.py", line 5, in

1

2

    numbers[0]=-1

TypeError: 'tuple' object does not support item assignment

[Finished in 0.1s with exit code 1]

重点在粗体部分,“ 'tuple' object does not support item assignment”,翻译过来就是,“元组对象不支持项目(值)修改”,是的,Python直白的告诉了我们,元组是不可变的

遍历元组

遍历元组的方法和遍历列表是一样的,由于篇幅有限,这里就不在赘述。

重置元组

元组不可修改并不意味着我们就不能重置元组,我们看下面的例子:

numbers=(1,2,3,4,5)

print("This is an old tuple:")

print(numbers)

numbers=(5,4,3,2,1)

print("This is a new tuple:")

print(numbers)

代码并没有什么值得特别关注的地方,我们直接看程序运行结果:

This is an old tuple:

(1, 2, 3, 4, 5)

This is a new tuple:

(5, 4, 3, 2, 1)

[Finished in 0.1s]

我们用numbers=(5,4,3,2,1)语句为numbers重新赋值,这就相当于重置过了元组。

小结

通过两章的内容,我们对列表(list)有了基本的了解,学会了如何创建一个列表,并且对列表元素进行增删改查等操作,我们还学会了如何遍历整个列表,在遍历列表时通过数学函数加工列表元素。更重要的是我们掌握了切片,用切片我们可以把整个列表进行分割,还可以创建新的复杂列表或者复制新的列表。除此之外,三个数学函数求最值及求和能帮助我们分析数据。在列表中还有一种特殊的列表——元组(tuple),和普通列表的唯一区别在于它的值是不可变的,但我们仍然可以重置整个列表。

在下一章的内容里,我们将学习if条件语句,利用if语句就可以通过筛选条件对数据(事件)进行判定,对特定元素数据采取对应措施。

更多Python教学请关注微信公众号:编程文科僧(gh_ae4e8695e1fb)

编程文科僧
上一篇下一篇

猜你喜欢

热点阅读