美文网首页我爱编程
15天Python入门 Day03:列表之二

15天Python入门 Day03:列表之二

作者: 明日之丈 | 来源:发表于2018-08-02 14:48 被阅读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)

    编程文科僧

    相关文章

      网友评论

        本文标题:15天Python入门 Day03:列表之二

        本文链接:https://www.haomeiwen.com/subject/wvzjvftx.html