Python学习笔记-3 | for循环与列表的高级操作

399 阅读11分钟

在上一章,我们学习了如何创建一个列表,以及如何操作列表元素,接下来就让我们一起学习如何利用几行代码去遍历整个列表吧!

第四章:操作列表

一、 遍历整个列表

在一些情况下,我们经常会需要对于列表中的所有元素进行重复性的操作,但如果一个个的去执行代码,就会导致大量重复代码的出现。所以为了更好的去解决这个问题,我们可以使用Python中的for循环

1. for循环的使用及其原理

下面就通过一些实例去帮助我们理解什么是for循环,以及如何使用for循环吧!

>>> animals = ["dog", "cat", "rabbit"]
    for animal in animals:
        print(f"A {animal} would make a great pet.")
        
A dog would make a great pet.
A cat would make a great pet.
A rabbit would make a great pet.

我们发现可以使用for循环去处理一些重复性的操作,会给我们带来很大的便利。

在这个例子中,我们定义一个包含三个元素的列表,然后使用for循环去遍历列表中的所有元素。

其原理为,在第一次循环开始时,把列表animals中的第一个元素“dog”与变量animal相关联,然后通过变量animal这个桥梁执行下面的输出操作,然后再进行第二次循环,把列表animals中的第二个元素“cat”与变量animal相关联,以此类推。

2. 在for循环中执行更多操作

有时我们需要对循环中的内容进行更多的操作,这时只需要在循环体中加入相应操作就可以了

  • 例如,我们想在上一个例子的基础上加入一条信息,说明这种动物适合当宠物的原因,可以对代码进行如下修改
>>> animals = ["dog", "cat", "rabbit"]
    for animal in animals:
        print(f"A {animal} would make a great pet.")
        print(f"Because {animal}s are very cute!\n")    ## \n为换行符,在这里起到分隔的作用
        
A dog would make a great pet.
Because dogs are very cute!

A cat would make a great pet.
Because cats are very cute!

A rabbit would make a great pet.
Because rabbits are very cute!

在这里我们要注意,如果是要对循环体内部进行操作,一定要将操作的代码加入到循环体中,在Python中,一般使用缩进来判断代码之间的关系,所以这点要格外注意。

3. 在循环结束后执行一些操作

有时我们需要在循环结束后,在结尾处加入一些总结性的语句,这时可以在for循环后面加入一条没有缩进的代码,在Python中,没有缩进的代码只执行一次

  • 同理,也拿上一个例子来进行修改,在循环结束后,加入一个总结性的语句,可以对代码进行如下调整:
>>> animals = ["dog", "cat", "rabbit"]
    for animal in animals:
        print(f"A {animal} would make a great pet.")
        print(f"Because {animal}s are very cute!\n")
    print("Any of these animals would make a great pet!")
    
A dog would make a great pet.
Because dogs are very cute!

A cat would make a great pet.
Because cats are very cute!

A rabbit would make a great pet.
Because rabbits are very cute!

Any of these animals would make a great pet!

在Python中,缩进是一个极其重要的格式,所以我们在编写代码时应格外注意。

  • 不要忘记缩进,或未对需要缩进的代码进行缩进,虽然这两种情况都可以正常执行,但往往不是我们想要的结果;

  • 还有种情况就是,我们可能会在一些不需要缩进的地方私自添加一些缩进,这往往会出现报错信息,此类报错信息一般都含有“indent”这个词,这个词就是缩进的意思;

  • 另外还有一个值得注意的地方就是,for循环语句最后,一定不要遗漏冒号,这个冒号会告诉Python,下一行是循环体的第一行。

这些细微的错误在编程时非常容易出现,而且有时还很难发现,所以我们在平时的练习中要尽量养成良好的编程习惯,减少这些细微错误的出现。

二、 创建数值列表

在上一章中我们学习了如何创建一个列表,这里再介绍一些有关于数值列表的简单创建方式。

1. 使用函数range()

函数range()一般包含两个参数,例如range(a,b)表示一个从a开始,到b结束的一系列数,下面举一个例子:

>>> for num in range(1,6):
        print(num)
        
1
2
3
4
5

在上面这个例子中,range(1,6)表示从1开始,直到6的一系列数,这里要注意这个列表往往不包含第二个值,所以在编写代码时应格外注意

  • 在使用函数range()时,如果输出不符合预期,可将指定的值加1或减1

  • 使用函数range()时,也可以只指定一个参数,这样它会默认从0开始,例如range(6)返回0~5

2. 使用函数range()创建数字列表去创建一个数值列表呢

这里首先要提出一点容易误解的地方,在Python3中,函数range()返回的是一个可迭代对象(类型是对象),所以打印的时候不会打印列表,具体什么是对象,这个我们在后续的学习中会介绍,这里只要明白一点:函数range()返回的不是列表

那既然函数range()返回的不是列表,那我们怎么利用函数range()去创建一个数值列表呢

要创建一个数值列表,可使用函数list()将函数range()的结果转换为列表,下面用一个实例进行演示

>>> numbers = list(range(1,6))
>>> print(numbers)
    
[1, 2, 3, 4, 5]

使用函数range()时,还可以指定步长,即函数range()的第三个参数,下面举一个例子进行说明

>>> even_numbers = list(range(2,10,2))
>>> print(even_numbers)

[2, 4, 6, 8]
  • 在这个例子中,函数range()2开始数,然后不断加2,直到达到或超过终值10(不含终值),因此这里输出的是1~9的所有偶数

小练习:创建一个列表,让其包含1~10这十个整数的平方(Python中乘方用**表示)

>>> squares = []
>>> for number in range(1,11):
        square = number ** 2
        squares.append(square)      ## 这两步也可整合为一步  squares.append(number**2)
>>> print(squares)

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

3. 对数字列表执行简单的统计运算

Python中有几个专门用于处理数字列表的函数,例如,使用max(),min()和sum()找出数字列表中的最大值,最小值以及总和

>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 
>>> min(digits) 
0 
>>> max(digits) 
9 
>>> sum(digits) 
45

4. 列表解析

对于上面的小练习,生成squares列表的方式包含四五行代码,而列表解析可以只写一行代码,就能起到相同的效果。

列表解析for循环和创建新元素的代码合并成一行,并自动附加新元素。下面就让我们来看一下如何用一行代码实现相同的效果吧!

>>> squares = [number**2 for number in range(1,11)]      ## 列表解析
>>> print(squares)

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

这种语法简单解释下就是,定义一个squares的变量名,然后对其进行列表赋值(使用中括号[]),赋值内容中,先是定义一个赋值的表达式(如number**2),后面接着一个for循环(for循环语句末尾没有冒号)。

要创建一个自己的列表解析,需要经过大量的练习,但当你真正学会了这种写法之后,会给我们带来很大的便利。

三、 使用部分列表

Python中,还可以处理列表中的部分元素,被称为切片

1. 切片

要创建切片,就一定会用到索引,可以通过指定使用的第一个元素和最后一个元素的索引来创建切片,与函数range()一样,切片也是取不到最后一个元素的,下面进行举例说明:

>>> fruits = ["apple","banana","grape","orange","pear","strawberry"]
>>> print(fruits[1:5])    ## 返回第二、三、四、五个元素
['banana', 'grape', 'orange', 'pear']

'''如果没有指定第一个索引,则默认从列表表头开始'''
>>> print(fruits[:3])     ## 返回第一、二、三个元素
['apple', 'banana', 'grape']

'''如果没有指定最后一个索引,则默认终止于列表结尾'''
>>> print(fruits[3:])     ## 返回最后三个元素
['orange', 'pear', 'strawberry']

'''同索引一样,切片也可以使用负数索引'''
>>> print(fruits[-4:])     ## 返回最后四个元素
['grape', 'orange', 'pear', 'strawberry']

'''若在切片的方括号内指定第三个值,表示每隔多少元素提取一个'''
>>> print(fruits[0:5:2])     ## 从第一个元素到第第五个元素中,每隔一个元素提取一个
['apple', 'grape', 'pear']

2. 切片的遍历

要遍历切片里的元素,可在for循环中使用切片,如下:

>>> fruits = ["apple","banana","grape","orange","pear","strawberry"]
>>> for fruit in fruits[1:4]:
        print(fruit)
        
banana
grape
orange

3. 复制列表

在对列表进行操作时,我们有时可能会需要对列表进行复制,复制列表可以通过切片来完成,即同时省略起始索引和终止索引([:]),示例如下:

>>> my_fruits = ["apple","banana","grape"]
>>> friend_fruits = my_fruits[:]
>>> print("My favorite fruits are:")
>>> print(my_fruits)
>>> print("\nMy friend's favorite fruits are:")
>>> print(friend_fruits)

My favorite fruits are:
['apple', 'banana', 'grape']

My friend's favorite fruits are:
['apple', 'banana', 'grape']

这里可能有同学会说,直接赋值不就行了吗,为什么还那么麻烦,那下面我们就来探讨一下直接赋值可不可以

>>> my_fruits = ["apple","banana","grape"]
>>> friend_fruits = my_fruits
>>> print("My favorite fruits are:")
>>> print(my_fruits)
>>> print("\nMy friend's favorite fruits are:")
>>> print(friend_fruits)

My favorite fruits are:
['apple', 'banana', 'grape']

My friend's favorite fruits are:
['apple', 'banana', 'grape']

'''表面上看好像是可行的,我们再试着分别对这两个列表进行添加元素的操作''

>>> my_fruits.append("orange")
>>> friend_fruits.append("pear")
>>> print("My favorite fruits are:")
>>> print(my_fruits)
>>> print("\nMy friend's favorite fruits are:")
>>> print(friend_fruits)

My favorite fruits are:
['apple', 'banana', 'grape', 'orange', 'pear']

My friend's favorite fruits are:
['apple', 'banana', 'grape', 'orange', 'pear']

## 这里明显就不是我们想要的效果了,所以要想按照我们的想法去复制列表,要使用前面介绍的切片的方法

直接赋值之所以不成功,主要是因为在Python中变量的赋值其实是一个类似于指针指向的过程,所以并没有把它们所分开,才导致了上面的这种情况。最后,建议大家复制完列表后,可以尝试用上例中的方法确认是否按照我们的想法成功复制了列表

四、 元组

在上一章我们学习了对列表元素进行处理,说明列表是可以修改的,但有时我们也需要创建一些不可以修改的列表,在Python中把这种不可修改的列表称为元组

1. 定义元组

元组和列表类似,唯一的区别就是元组使用圆括号而不是中括号

>>> dimensions = (200,50)
>>> print(dimensions)
(200, 50)

>>> print(dimensions[0])   ## 访问元组元素
200

>>> dimensions[0] = 300    ## 尝试修改元组元素的值
Traceback (most recent call last):
  File "d:\Microsoft VS Code\code\test.py", line 3, in <module>
    dimensions[0] = 300
TypeError: 'tuple' object does not support item assignment      
## 出现报错,元组中的值是不能被修改的

>>> for dimension in dimensions:        ## 遍历元组中的值
        print(dimension)
200
50

注意:严格地说,元组是用逗号标识的,如果要定义一个只包含一个元素的元组,必须在这个元素后面加上逗号my_value = (6,),如果不加逗号,则等同于my_value = 6,这就不是一个元组了,而是一个数

2. 修改元组变量

上面说过元组的元素是不能修改的,但我们可以给元组重新赋值。因此,如果要修改元组的值,可以通过重新定义元组的方法

>>> dimensions = (200, 50) 
>>> print("Original dimensions:") 
>>> for dimension in dimensions: 
        print(dimension) 
        
Original dimensions: 
200 
50 

>>> dimensions = (400, 100)
>>> print("\nModified dimensions:") 
>>> for dimension in dimensions: 
        print(dimension)
        
Modified dimensions:
400 
100

五、 小结

我们学习了如何高效处理列表中的元素,以及如何使用for循环遍历列表,切片的使用和元组的概念。下一章中,我们将一起学习Python中的另一大结构:if条件结构