遍历列表

在日常开发中,我们经常需要遍历列表的所有元素,对每个元素执行相同的操作。例如,在管理商场的蔬菜时候,需要给所有的蔬菜商品都打7折,并重新生成价格。当我们需要对列表中的每个元素都执行相同的操作时,可使用Python中的for循环。

假设我们有一个蔬菜名单,需要将其中每种蔬菜的名字都打印出来。为此,我们可以采用元素下标的方式分别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复的代码。另外,每当名单的长度发生变化时,都必须修改代码。通过使用for循环,可让Python去处理这些问题。 下面使用for循环来打印蔬菜单中的所有名字:

vegetables = ['potato','tomato','onion']
for name in vegetables:
print(name)
复制代码

这行代码让Python从列表vegetables中取出一个名字,并将其存储在变量name中。最后,我们让Python打印前面存储的变量name中的名字。这样,对于列表中的每个名字,Python都将重复执行print(name)代码。你可以这样解读这些代码:对于列表vegetables中的每种蔬菜,都将其名字打印出来。输出很简单,就是列表中所有蔬菜的姓名:

potato
tomato
onion
复制代码
详解遍历列表执行过程

循环这种概念很重要,因为它是让计算机自动完成重复工作的常见方式之一。例如,在前面的代码中使用的简单循环中,Python将首先读取其中的第一行代码:

for name in vegetables:
复制代码

这行代码让Python获取列表vegetables中的第一个值potato,并将其存储到变量name 中。接下来,Python读取下一行代码:

print(name)
复制代码

它让Python打印vegetables的值potato。由于该列表还包含其他值,Python返回到循环的第一行:

for name in vegetables:
复制代码

Python获取列表中的下一个名字tomato,并将其存储到变量name中,再执行下面这行代码:

print(name)
复制代码

Python再次打印变量vegetables的值tomato。 接下来,Python再次执行整个循环,对列表中的最后一个值onion进行处理。 至此,列表中没有其他的值了,因此Python接着执行程序的下一行代码。在这个示例中,for循环后面没有其他的代码,因此程序就此结束。 刚开始使用循环时需要牢记,对列表中的每个元素,都将执行循环指定的步骤,而不管列表包含多少个元素。如果列表包含一百万个元素,Python就重复执行指定的步骤一百万次,且通常速度非常快。 另外,编写for循环时,对于用于存储列表中每个值的临时变量,可指定任何名称。比如说:

for dog in dogs:
for cat in cats:
for item in item_list:
复制代码

这些写法都是可以的。

在For循环中做更多操作

在for循环中,可以获取到每一个元素,可对每个元素执行任何操作。比如说我们对每一种蔬菜都输出一句话。

vegetables = ['potato','tomato','onion']
for name in vegetables:
print(name + ' is good !')
复制代码

相比于前一个示例,唯一的不同是对于每种蔬菜,都打印了一条以其名字为抬头的消息。这个循环第一次迭代时,变量name的值为potato,因此Python打印的第一条消息的抬头为potato。第二次迭代时,消息的抬头为tomato,而第三次迭代时,抬头为onion。 下面的输出表明,对于列表中的每种蔬菜,都打印了一条个性化消息:

potato is good !
tomato is good !
onion is good !
复制代码

在for循环中,想包含多少行代码都可以。在代码行for name in vegetables后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次。因此,可对列表中的每个值执行任意次数的操作。 下面再添加一行代码:

vegetables = ['potato','tomato','onion']
for name in vegetables:
print(name + ' is good !')
print(name + ' is a vegetable!')
复制代码

由于两条print语句都缩进了,因此它们都将针对列表中的每位蔬菜都执行一次。输出结果如下:

potato is good !
potato is a vegetable!
tomato is good !
tomato is a vegetable!
onion is good !
onion is a vegetable!
复制代码

for循环中,想包含多少行代码都可以。这种方式在开发过程中很有用。

避免缩进错误

Python根据缩进来判断代码行与前一个代码行的关系。在前面的示例中,对每种蔬菜的输出代码行是for循环的一部分,因为它们缩进了。Python通过使用缩进让代码更易读。 简单地说,它要求你使用缩进让代码整洁而结构清晰。在较长的Python程序中,你将看到缩进程度各不相同的代码块,这让你对程序的组织结构有大致的认识。 当你开始使用缩进时,需要注意一些常见的缩进错误。 例如,有时候,程序员会将不需要缩进的代码块缩进,而对于必须缩进的代码块却忘了缩进。通过查看这些错误示例,有助于我们以后避开它们,以及在它们出现在程序中时进行修复。下面来看一些较为常见的缩进错误。

忘记缩进

对于位于for语句后面且属于循环组成部分的代码行,一定要缩进。如果你忘记缩进,运行会直接报错:

vegetables = ['potato','tomato','onion']
for name in vegetables:
print(name)
复制代码

print语句应缩进却没有缩进。Python没有找到期望缩进的代码块时,会让你知道哪行代码有问题。

 File "<stdin>", line 2
print(name)
^
IndentationError: expected an indented block
复制代码

通常,将紧跟在for语句后面的代码行缩进,可消除这种缩进错误。

忘记缩进额外的代码行

有时候,循环能够运行而不会报告错误,但结果可能会出乎意料。试图在循环中执行多项任务,却忘记缩进其中的一些代码行时,就会出现这种情况。

vegetables = ['potato','tomato','onion']
for name in vegetables:
print(name + ' is good !')
print(name + ' is a vegetable!')
复制代码

第二个print语句原本需要缩进,但Python发现for语句后面有一行代码是缩进的,因此它没有报告错误。最终的结果是,对于列表中的每种蔬菜,都执行了第一条print语句,因为它缩进了;而第二条print语句没有缩进,因此它只在循环结束后执行一次。由于变量 name 的终值为onion,因此只有一条输出了onion is a vegetable!:

potato is good !
tomato is good !
onion is good !
onion is a vegetable!
复制代码

这是一个逻辑错误。从语法上看,这些代码是没问题的,但由于存在逻辑错误,结果并不符合预期。如果你预期某项操作将针对每个列表元素都执行一次,但它却只执行了一次,请确定是否需要将一行或多行代码缩进。

不必要的缩进

如果你不小心缩进了无需缩进的代码行,同样运行的时候也会报错:

message = "Hello Python world!"
print(message)
复制代码

print语句无需缩进,因为它并不属于前一行代码,运行的时候会帮我们指出这种错误:

    print(message)
^
IndentationError: unexpected indent
复制代码

为避免意外缩进错误,请只缩进需要缩进的代码。在前面编写的程序中,只有要在for循环中对每个元素执行的代码就需要缩进。

循环后不必要的缩进

如果我们不小心缩进了应在循环结束后执行的代码,这些代码将针对每个列表元素重复执行。 在有些情况下,这可能导致Python报告语法错误,但在大多数情况下,这只会导致逻辑错误。例如:

vegetables = ['potato','tomato','onion']
for name in vegetables:
print(name + ' is good !')
print(name + ' is a vegetable!')
## 这一行代码被缩进
print('There are three kinds of vegetables.')
复制代码

那么输出就会变成以下这个样子:

potato is good !
potato is a vegetable!
There are three kinds of vegetables
tomato is good !
tomato is a vegetable!
There are three kinds of vegetables
onion is good !
onion is a vegetable!
There are three kinds of vegetables.
复制代码

这也是一个逻辑错误。Python不知道你的本意,只要代码符合语法,它就会运行。所以我们应该时刻保持警惕,不要用错了缩进。

遗漏了冒号

for语句末尾的冒号告诉Python,下一行是循环的第一行。

vegetables = ['potato','tomato','onion']
for name in vegetables
print(name + ' is good !')
复制代码

for name in vegetables
^
SyntaxError: invalid syntax
复制代码

如果你不小心遗漏了冒号,如上所示,将导致语法错误,因为Python不知道你意欲何为。这种错误虽然易于消除,但并不那么容易发现。

数值列表

Python函数range()让你能够轻松地生成一系列的数字。例如,可以像下面这样使用函数range()来打印一系列的数字:

for value in range(1,5):
print(value)
复制代码

上述代码好像应该打印数字1~5,但实际上它不会打印数字5:

1
2
3
4
复制代码

在这个示例中,range()只是打印数字14,这是你在编程语言中经常看到的差一行为的结果。函数range()让Python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值(这里为5)。 要打印数字15,需要使用range(1,6):

for value in range(1,6):
print(value)
复制代码

这样,输出将从1开始,到5结束:

1
2
3
4
5
复制代码

使用range()时,如果输出不符合预期,请尝试将指定的值加1或减1

使用range()创建数字列表

要创建数字列表,可使用函数list()range()的结果直接转换为列表。如果将range()作为list()的参数,输出将为一个数字列表。 在上面的示例中,我们打印了一系列数字。要将这些数字转换为一个列表,可使用list():

numbers = list(range(1,6))
print(numbers)
复制代码

结果如下:

[1, 2, 3, 4, 5]
复制代码

使用函数range()时,还可指定步长。例如,下面的代码打印1~10内的偶数:

even_numbers = list(range(2,11,2))
print(even_numbers)
复制代码

在这个示例中,函数range()从2开始数,然后不断地加2,直到达到或超过终值(11),因此 输出如下:

[2, 4, 6, 8, 10]
复制代码

使用函数range()几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前10个整数(即1~10)的平方呢?在Python中,两个星号**表示乘方运算。下面的代码演示如何将前10个整数的平方加入到一个列表中:

squares = []
for value in range(1,11):
square = value**2
squares.append(square)
print(squares)
复制代码

首先,我们创建了一个空列表;接下来,使用函数range()让Python遍历1~10的值。在循环中,计算当前值的平方,并将结果存储到变量square中。然后,将新计算得到的平方值附加到列表squares末尾。最后,循环结束后,打印列表squares:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
复制代码
对数字列表执行简单的统计计算

有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值、最小值和总和:

digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
### 输出最小值
print(min(digits))
### 输出最大值
print(max(digits))
### 计算总和
print(sum(digits))
0
9
45
复制代码
列表解析

列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。下面的示例使用列表解析创建你在前面看到的平方数列表:

squares = [value**2 for value in range(1,11)]
print(squares)
复制代码

要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号,并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为value**2,它来计算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。在这个示例中,for循环为for value in range(1,11),它将值1~10提供给表达式value**2。请注意,这里的for语句末尾没有冒号。 结果与你在前面看到的平方数列表相同:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
复制代码

要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这样做是完全值得的。当你觉得编写三四行代码来生成列表有点繁复时,就应考虑创建列表解析了。

列表中的一部分

在上面的内容中,我们学习了如何访问单个列表元素。接下来,我们将学习如何处理列表的所有元素。我们还可以处理列表的部分元素——Python称之为切片

切片

要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python 在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0~3, 这将输出分别为0、1和2的元素。 我们还是以蔬菜列表为例:

vegetables = ['potato','tomato','onion','leek']
print(vegetables[0:3])
复制代码

上面的代码打印该列表的一个切片,其中只包含三种蔬菜。输出也是一个列表,其中包含前三种蔬菜:

['potato', 'tomato', 'onion']
复制代码

你可以生成列表的任何子集,例如,如果你要提取列表的第2~4个元素,可将起始索引指定为1,并将终止索引指定为4:

vegetables = ['potato','tomato','onion','leek']
print(vegetables[1:4])
复制代码

这一次,切片始于tomato,终于leek:

['tomato', 'onion', 'leek']
复制代码

如果你没有指定第一个索引,Python将自动从列表开头开始:

vegetables = ['potato','tomato','onion','leek']
print(vegetables[:4])
复制代码

由于没有指定起始索引,Python从列表开头开始提取:

['potato', 'tomato', 'onion', 'leek']
复制代码

要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第3个元素到列表末 尾的所有元素,可将起始索引指定为2,并省略终止索引:

vegetables = ['potato','tomato','onion','leek']
print(vegetables[2:])
复制代码

Python将返回从第3个元素到列表末尾的所有元素:

['onion', 'leek']
复制代码

无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。前面我们了解过,负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片。例如,如果你要输出名单上的最后三种蔬菜,可使用切片vegetables[-3:]:

vegetables = ['potato','tomato','onion','leek']
print(vegetables[-3:])
['tomato', 'onion', 'leek']
复制代码
遍历切片

如果要遍历列表的部分元素,可在for循环中使用切片。在下面的示例中,我们遍历前三种蔬菜,并打印它们的名字:

vegetables = ['potato','tomato','onion','leek']
print("Here are the first three vegetable:")
for name in vegetables[:3]:
print(name.title())
复制代码

输出结果:

Here are the first three vegetable:
Potato
Tomato
Onion
复制代码

在很多情况下,切片都很有用。例如,编写游戏时,你可以在玩家退出游戏时将其最终得分加入到一个列表中。然后,为获取该玩家的三个最高得分,你可以将该列表按降序排列,再创建一个只包含前三个得分的切片。处理数据时,可使用切片来进行批量处理;编写Web应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。

复制列表

我们经常需要根据既有列表创建全新的列表。下面来介绍复制列表的工作原理,以及复制列表可提供极大帮助。 要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。 这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。 例如,假设有一个列表,其中包含你最喜欢的四种食品,而你还想创建另一个列表,在其中包含一位朋友喜欢的所有食品。不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来创建这个列表:

my_foods = ['pizza', 'falafel', 'carrot cake'] friend_foods = my_foods[:]
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
复制代码

我们首先创建了一个名为my_foods的食品列表,然后创建了一个名为friend_foods的新列表。我们在不指定任何索引的情况下从列表my_foods中提取一个切片,从而创建了这个列表的副本,再将该副本存储到变量friend_foods中。打印每个列表后,我们发现它们包含的食品相同:

My favorite foods are:
['pizza', 'falafel', 'carrot cake']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake']
复制代码

为了核实我们确实有两个列表,下面在每个列表中都添加一种食品,并核实每个列表都记录了相应人员喜欢的食品:

my_foods = ['pizza', 'falafel', 'carrot cake'] 5
friend_foods = my_foods[:]
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
复制代码

与前一个示例一样,我们首先将my_foods的元素复制到新列表friend_foods中。接下来,在每个列表中都添加一种食品:在列表my_foods中添加cannoli,而在friend_foods中添加ice cream。最后,打印这两个列表,核实这两种食品包含在正确的列表中。

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'ice cream']
复制代码

上面的输出表明,cannoli包含在你喜欢的食品列表中,而ice cream没有。ice cream包含在你朋友喜欢的食品列表中,而cannoli没有。倘若我们只是简单地将my_foods赋给friend_foods,就不能得到两个列表。例如,下例演示了在不使用切片的情况下复制列表的情况:

my_foods = ['pizza', 'falafel', 'carrot cake']
#这行不通
friend_foods = my_foods
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
复制代码

这里将my_foods赋给friend_foods,而不是将my_foods的副本存储到friend_foods。这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表,因此这两个变量都指向同一个列表。鉴于此,当我们将cannoli添加到my_foods中时,它也将出现在friend_food中;同样,虽然ice cream好像只被加入到了friend_foods中,但它也将出现在这两个列表中。 输出表明,两个列表是相同的,这并非我们想要的结果:

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
复制代码

8-1 动物:想出至少三种有共同特征的动物,将这些动物的名称存储在一个列表中,再使用for循环将每种动物的名称都打印出来。修改这个程序,使其针对每种动物都打印一个句子,如"A dog would make a great pet"。在程序末尾添加一行代码,指出这些动物的共同之处,如打印诸如"Any of these animals would make a great pet!"这样的句子。

8-2 数到 20:使用一个 for 循环打印数字 1~ 20(含)。

8-3 计算 1~ 1000000 的总和:创建一个列表,其中包含数字1~ 1000000,再使用min()和max()核实该列表确实是从1开始,到1000000 结束的。另外,对这个列表调用函数sum(),体会一下Python将一百万个数字相加需要多长时间。

8-4 3的倍数:创建一个列表,其中包含 3~30 内能被3整除的数字;再使用一个for循环将这个列表中的数字都打印出来。

8-5 切片:修改8-1的代码,在末尾添加几行代码,以完成如下任务。 打印消息"The first three items in the list are:",再使用切片来打印列表的前三个元素。打印消息"Three items from the middle of the list are:",再使用切片来打印列表中间的三个元素。打印消息"The last three items in the list are:",再使用切片来打印列表末尾的三个元素。

交流基地:630390733

【Python 1-8】Python手把手教程之——管理列表List的更多相关文章

  1. 【Python大系】Python快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...

  2. 『开发技巧』Python音频操作工具PyAudio上手教程

    『开发技巧』Python音频操作工具PyAudio上手教程 ​ 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...

  3. PySide——Python图形化界面入门教程(六)

    PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...

  4. PySide——Python图形化界面入门教程(二)

    PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...

  5. PyCharm Django Python 开发环境配置 详细教程

    PyCharm Django Python 开发环境配置 详细教程 1. Python 下载及安装 (1)根据需要的版本去 Python 官网(https://www.python.org/downl ...

  6. python脚本实现集群检测和管理

    python脚本实现集群检测和管理 场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法-- ...

  7. Python实用工具包Scrapy安装教程

       对于想用每个想用Python开发网络爬虫的开发者来说,Scrapy无疑是一个极好的开源工具.今天安装之后觉得Scrapy的安装确实不易啊.所以在此博文一篇,往后来着少走弯路. 废话不多说了,如果 ...

  8. Python框架 Flask 项目实战教程

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...

  9. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

随机推荐

  1. ClassLoader分类

    对于类装载器而言一共有三种, 1分别是加载rt包下的Bootstrap加载器,是用C++写的,是在java最早发布的时候写的,用于加载那些最初的类. 2然后java在发展过程中又要发布新的jdk,所以 ...

  2. 04.vue获取微博授权URL

    1.在Vue页面加载时动态发送请求获取微博授 权url 1.1 在 components\common\lab_header.vue 中写oauth动态获取微 博授权**URL // 获取微博登录地址 ...

  3. 红黑树、TreeMap、TreeSet

    事先声明以下代码基于JDK1.8版本 参考资料 大部分图片引自https://www.jianshu.com/p/e136ec79235c侵删 https://www.cnblogs.com/skyw ...

  4. Leetcode 021 Merge Two Sorted Lists

    摘要:Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...

  5. 关于javaSMTP协议发邮件你必须知道的知识点

    1.阅读官方吐槽 Note also that THERE IS NOT SUFFICIENT DOCUMENTATION HERE TO USE THESE FEATURES!!! You will ...

  6. day010|python之装饰器

    装饰器02 目录 装饰器02 1 装饰器的语法糖 1.1 定义 1.2 基本使用 2 有参装饰器 2.1 基本用法 2.2 示例 3叠加多个装饰器 3.1 基本用法 3.2 示例 4 wraps装饰器 ...

  7. [BJDCTF 2nd]假猪套天下第一 && [BJDCTF2020]Easy MD5

    [BJDCTF 2nd]假猪套天下第一 假猪套是一个梗吗? 进入题目,是一个登录界面,输入admin的话会返回错误,登录不成功,其余用户可以正常登陆 以为是注入,简单测试了一下没有什么效果 抓包查看信 ...

  8. 总结下flask中的宏、Jinjia2语法

    这几天学的东西比较多,时间又有点不够用,趁着快吃饭了,赶紧总结总结. 00x1 宏: 如果学过C语言的童鞋,可能知道宏在C语言里面是一个定义一个固定参数的变量.在flask里面,宏是相当于一个函数的作 ...

  9. 团队作业 需求改进&系统设计

    PaChat聊天系统 一.需求&原型改进: 1.针对课堂讨论环节老师和其他组的问题及建议,对修改选题及需求进行修改 问题1:功能划分条理不够清晰. 修改1:改为流程图的形式. 问题2:功能不能 ...

  10. js原生方法filter实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...