操作列表
本次主要去了解如何创建简单的列表,如何操作列表元素,如何遍历整个列表,无论列表多长,只需要几行代码就可以搞定,循环让你能够对列表的每一个元素都采取一个或一系列相同的措施,从而高效地处理任何长度的列表,包括包含数千乃至数百万个元素列表。
1.遍历整个列表
你经常需要遍历列表的所有元素,对每个元素执行相同的操作,例如,在游戏中,可能需要对每个元素都执行相同的操作时,可使用python中的for循环。
假设我们有一个魔术师名单,需要将其中的每个魔术师的名字都打印出来,为此,我们可以分别获取名单中的每个名字,但是,这会导致很多问题,如果名单很长,上千个魔术师,你就得写大量重复的代码,而且,如果名单的长度发生变化时,你又得去修改,所以,我们可以使用for循环去处理这些问题。
下面使用for循环来打印魔术师名单中的所有名字:
magicians=['alice','david','carolina']
for magician in magicians:
print('magician)
打印结果如下:
alice
david
carolina
上述例子中,首先我们先定义一个列表,接下来,我们定义一个for循环,这行代码让python从列表magicians中取一个名字,并将其存储在变量magician中,最后,我们让python打印前面存储到变量magician中的名字,这样,对于列表中的每个名字,python都将重复执行第二行和第三行代码,直到所有的魔术师都被打印完。
2. 深入研究循环
循环这种概念很重要,因为它是让计算机自动完成重复工作的常见之一,例如,在上述的示例中,python首先读取这一行代码:
for magician in magicians:
这行代码让python获取列表magicians中的第一个值alice,并将其存储到变量magician中,接下来,python读取下一行代码:
python(magician)
它让python打印magician的值——依然是alice,鉴于该列表还有其它值,python返回到循环第一行:
for magician in magicians:
开始获取下一个名字——david,并将其存储在变量magician中再次执行下面这一行代码:
python(magician)
python再次打印变量magician中的值——david,接下来,python再次执行整个循环,对列表中的最后一个值——carolina进行处理,至此,列表中没有其它值了,因此,python接着执行程序下一行代码,在这个示例中,for循环后面没有其它的代码,因此程序就此结束。
刚使用循环需要记住,对列表中的每一个元素,都将执行循环指定的步骤,而不管列表包含多少个元素,如果列表包含一百万个元素,python就重复执行指定步骤一百万次,且通常速度非常快。
编写for循环时,对于用于存储列表中每个值的临时变量,可指定任何名称,然而,选择描述单个列表元素的有意义的名称大有帮助,例如,对于小猫列表,小狗列表和一般性列表,如下编写时不错的选择:
for cat in cats:
for dog in dogs:
for item in list_of_items:
这些命名约定有助于你明白for循环中将对每个元素执行的操作,使用单数和复数式名称,可帮助你判断代码段处理的是单个列表还是整个列表。
3.在for循环中执行更多的操作
在for循环中,可对每个元素执行任何操作,下面来扩展前面的示例,对于每位魔术师,都打印一条消息,指出他的表演非常精彩。
magicians=['alice','david','carolina']
for magician in magicians:
print(magician+",你的表演非常精彩!")
打印结果:
alice,你的表演非常精彩!
david,你的表演非常精彩!
carolina,你的表演非常精彩!
上述示例中,相比前一个示例,唯一不同的是对于每一位魔术师,都打印了一条以名字为抬头的消息。
在for循环中,想包含多少行代码都可以。
在代码行for magician in magicians后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次,因此,可对列表中的每个值执行任意次数的操作。
下面再添加一行代码,告诉每位魔术师,期待他的下一次表演:
magicians=['alice','david','carolina']
for magician in magicians:
print(magician+",你的表演非常精彩!")
print("很期待你的下一次表演,"+magician+".\n")
打印结果:
alice,你的表演非常精彩!
很期待你的下一次表演,alice.
david,你的表演非常精彩!
很期待你的下一次表演,david.
carolina,你的表演非常精彩!
很期待你的下一次表演,carolina.
上述例子中由于两行代码都进行了缩进,因此他们都将针对列表中的魔术师执行一次。
在for循环中,想包含多少行代码都可以,实际上,你会发现使用for循环对每个元素执行众多不同的操作很有用。
4.在for循环结束后执行一些操作
for循环结束后再怎么做呢?通常,你需要提供总结性输出或接着执行程序必须完成的其它任务。
在for循环后面,没有缩进的代码都只执行一次,而不会重复执行,下面就来打印一条向全体魔术师致谢的消息,感谢他们的精彩表演。
magicians=['alice','david','carolina']
for magician in magicians:
print(magician+",你的表演非常精彩!")
print("很期待你的下一次表演,"+magician+".\n")
print("感谢所有魔术师的精彩表演!")
打印结果:
alice,你的表演非常精彩!
很期待你的下一次表演,alice.
david,你的表演非常精彩!
很期待你的下一次表演,david.
carolina,你的表演非常精彩!
很期待你的下一次表演,carolina.
感谢所有魔术师的精彩表演!
上述示例中,你会发现,缩进的代码,都针对列表中的魔术师进行了重复执行,然而,最后一行没有缩进的代码,只执行了一次。
使用for循环处理数据是一种对数据集执行整体操作的不错的方式,例如,你可能使用for循环来初始化游戏,遍历角色列表,将每个角色都显示到屏幕上,再在循环后添加一个不缩进的代码块,在屏幕上绘制所有角色后显示一个确认按钮。
5.缩进错误
对于for语句后面且属于循环组成部分的代码行,一定要缩进,如果你忘记了缩进,python会提醒你:
magicians=['alice','david','carolina']
for magician in magicians:
print(magician+",你的表演非常精彩!")
打印结果会报错:
File "D:/项目/pythonone/python/new_python/yuanzu.py", line 3
print(magician)
^
IndentationError: expected an indented block
这种提示,通常解决了for语句后面紧跟的缩进,可消除这种缩进错误。
不必要的缩进:
message=['r','w']
print(message)
打印结果会报错:
File "D:/项目/pythonone/python/new_python/yuanzu.py", line 2
print(message)
^
IndentationError: unexpected indent
上述中说明了你打印行有缩进,原本这行代码无需缩进,因为它并不属于前一行代码,因此python会报错。
开发过程中还会遇到多余的缩进和逻辑错误的缩进,这些错误python是不会报错的,这是属于程序员本身的逻辑错误,这个需要注意,比如下面的例子:
magicians=['alice','david','carolina']
for magician in magicians:
print(magician+",你的表演非常精彩!")
print("很期待你的下一次表演,"+magician+".\n")
print("感谢所有魔术师的精彩表演!")
打印结果:
alice,你的表演非常精彩!
很期待你的下一次表演,alice.
感谢所有魔术师的精彩表演!
david,你的表演非常精彩!
很期待你的下一次表演,david.
感谢所有魔术师的精彩表演!
carolina,你的表演非常精彩!
很期待你的下一次表演,carolina.
感谢所有魔术师的精彩表演!
上述例子中,可以看出,感谢所有魔术师的精彩表演!这句话应该是循环外的一句话,但是这行代码还在缩进内,所以python还会重复去执行,但是这种语法又是合法的,所以python不会报错,需要开发人员自己去注意。还有for循环语句后面的冒号:一定不能忘记,如果开发项目大,为一个冒号报错,这样的错误找起来非常费时间。
6.创建数值列表
需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分,在数据可视化中,处理的几乎都是由数字(如温度,距离,人口数量,经度和纬度等)组合的集合。
列表非常适合用于存储数字集合,而python提供了很多工具,可帮助你高效地处理数字列表。明白如何有效地使用这些工具后,即便列表包含百万个元素,你编写的代码也能够运行得很好。
使用函数range():
python函数range()让你能够轻松地生成一系列的数字,例如,可以像下面这样使用函数range()来打印一系列数字:
for value in range(1,5):
print(value)
打印结果:
1
2
3
4
在这个示例中,range()只是打印数字1~4,这是你在编程语言中经常看到差一行为的结果,函数range()让python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值(这里为5),如果要打印1~5,需要使用range(1,6)
for value in range(1,6):
print(value)
打印结果:
这样,输出将从1开始数,到5结束。
使用range()函数时,如果输出不符合预期,请尝试将指定的值加1或减1.
使用range()创建数字列表
要创建数字列表,可使用函数list()将range()的结果直接转换为列表,如果将range()作为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)
打印结果:
[2,4,6,8,10]
在上述示例中,函数range()从2开始数,然后不断的加2,直到达或超过终值(11)。
使用函数range()几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前10个整数(即1~10)的平方呢?在python中使用两个星号(**)表示乘方运算,下面将演示如何将前10个整数的平方加入到一个列表中:
squares=[]
for value in range(1,11):
square=value**2
squares.append(square)
print(squares)
打印结果:
[1,4,9,16,25,36,49,64,81,100]
上述示例中,首先我们创建一个空列表,接下来,使用函数range()让python遍历1~10的值,在循环中,计算当前值的平方,并将结果存储到变量square中,然后,将新计算得到的平方值附加到列表squares末尾,最后,循环结束后,打印列表squares。
为了让代码可以更简洁,可不适用临时变量square,而直接将每个计算得到的值附加到列表末尾:
squares=[]
for value in range(1,11):
squares.append(value**2)
print(squares)
打印结果:
[1,4,9,16,25,36,49,64,81,100]
上述在循环中,计算每个值得平方,并立即将结果附加到列表squares的末尾。
对数字列表执行简单的统计计算
有几个专门用于处理数字列表的python函数,例如,你可以轻松地找出数字列表的最大值,最小值和总和:
digits=[1,2,3,4,5,6,7,8,9,0]
print(min(digits))
print(max(digits))
print(sum(digits))
打印结果:
9
45
列表解析
前面有个例子介绍生成列表squares的方式包含三四行代码,而列表解析让你只需要一行代码就可以搞定。
squares=[value**2 for value in range(1,11)]
print(squares)
打印结果:
[1,4,9,16,25,36,49,64,81,100]
使用这样的语法,首先指定一个描述性的列表名,如squares,然后,指定一个左括号,并定义一个表达式,用于生成你要存储到列表中的值,在这个示例中,表达式为value**2,它计算平方值,接下来,编写一个for循环,用于给表达式提供值,再加上右方括号,在这个示例中,for循环为 for value in range(1,11),它将值1~10提供表达式value**2,请注意,这里的for语句末尾 无需冒号。
7.切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引,与函数range()一样,python在到达你指定的第二个索引前面的元素后停止,要输出列表中的前三个元素,需要指定索引0~3,将输出0,1和2 的元素,首先创建一个足球队员的列表:
players=['小明','小江','小王','小刘','小李']
print(players[0:3])
打印结果:
['小明','小江','小王']
如果你没有指定第一个索引,python将重头开始:
players=['小明','小江','小王','小刘','小李']
print(players[:4])
打印结果:
['小明','小江','小王','小刘']
如果让切片终止于列表末尾,也可使用类似的语法,例如,如果要提取从第三个元素到列表末尾所有的元素,可将起始索引指定为2,并省略终止索引:
players=['小明','小江','小王','小刘','小李']
print(players[2:])
打印结果:
['小王','小刘','小李']
如果列表非常长,想获取倒数几个元素,你可以使用负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片,如,你要输入名单上面最后三名队员:
players=['小明','小江','小王','小刘','小李']
print(players[-3:])
打印结果:
['小王','小刘','小李']
上述中,即使列表长度发生变化,也只返回最后三名队员。
遍历切片
如果要遍历列表中的部分切片,可在for循环中使用切片,如果我要遍历列表中前三名队员,并打印出他们:
players=['小明','小江','小王','小刘','小李']
for player in players[:3]:
print(player)
打印结果:
小明
小江
小王
在很多情况下,切片都很有用,例如,在编写游戏时,你可以在玩家退出游戏时将其最终得分加入到一个列表中,然后,为获取该玩家的三个最高得分,你可以将该列表按降序排序,再创建一个只包含前三个得分的切片,处理数据时,可使用切片来进行批量处理,编写web应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。
8.复制列表
复制一个列表,也是很常见的,要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
比如你有一个列表,里面是你喜欢的零食,但是有一个朋友,为此你要给他创建一个列表,存储他的零食,但是你喜欢的零食他也喜欢,这样你可以通过复制来创建这个列表:
my_foods=['薯片','披萨','洽洽瓜子']
friend_foods=my_foods[:]
print('我喜欢的零食:')
print('my_foods')
print('\n朋友喜欢的零食:')
print('friend_foods')
打印结果:
我喜欢的零食:
['薯片','披萨','洽洽瓜子']
朋友喜欢的零食:
['薯片','披萨','洽洽瓜子']
为了核实我们确实有两个列表,我们可以在每个列表里面添加一种零食:
my_foods=['薯片','披萨','洽洽瓜子']
friend_foods=my_foods[:]
my_foods.append("香辣鸡腿堡")
friend_foods.append("麦辣鸡腿堡")
print('我喜欢的零食:')
print('my_foods')
print('\n朋友喜欢的零食:')
print('friend_foods')
打印结果:
我喜欢的零食:
['薯片','披萨','洽洽瓜子','香辣鸡腿堡']
朋友喜欢的零食:
['薯片','披萨','洽洽瓜子','麦辣鸡腿堡']
上述显示已经添加成功,说明已经成功复制列表。
倘若我们只是简单地将my_foods赋给friend_foods,就不能得到两个列表,例如,下面在不使用切片的情况下直接复制列表的情况:
my_foods=['薯片','披萨','洽洽瓜子']
friend_foods=my_foods
my_foods.append("香辣鸡腿堡")
friend_foods.append("麦辣鸡腿堡")
print('我喜欢的零食:')
print('my_foods')
print('\n朋友喜欢的零食:')
print('friend_foods')
打印结果:
我喜欢的零食:
['薯片','披萨','洽洽瓜子','香辣鸡腿堡','麦辣鸡腿堡']
朋友喜欢的零食:
['薯片','披萨','洽洽瓜子','香辣鸡腿堡','麦辣鸡腿堡']
上述例子中表明,显示的结果一致,很显然,这并非是我想要的结果。
9.元组
列表非常适合用于存储在程序运行期间可能变化的数据集,列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要,然而,有时候你需要创建一系列不可修改的元素,这时候,元组就可以满足你了,python将不能修改的值称为不可变的,而不可变的列表被称为元组。
定义元组
元组看起来犹如列表,但使用圆括号而不是方括号来标识,定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:
dimensions=(200,50)
print(dimensions[0])
print(dimensions[1])
打印结果:
200
50
元组是不能修改的,如果我们去修改它,就会报错:
dimensions=(200,50)
dimensions[0]=250
print(dimensions[0])
运行报错:
Traceback (most recent call last):
File "D:/项目/pythonone/python/new_python/yuanzu.py", line 2, in
dimensions[0]=250
TypeError: 'tuple' object does not support item assignmen
由于试图修改元组里面的值是被禁止的,因此python指出不能给元组赋值。
遍历元组中所有的值
像列表一样,也可以使用for循环来遍历元组中的所有值:
dimensions=(200,50)
for dimension in dimensions:
print(dimension)
打印结果:
200
50
和遍历列表时一样,python返回元组中所有的元素。
修改元组变量
虽然不能修改元组中的值,但是可以给存储元组的变量赋值,因此,如果要修改前述矩形的尺寸,可重新定义整个元组:
dimensions=(200,50)
print('最原始的尺寸')
for dimension in dimensions:
print(dimension)
dimensions=(400,100)
print('最新的尺寸')
for dimension in dimensions:
print(dimension)
打印结果:
最原始的尺寸
200
50
最新的尺寸
400
100
上述中,我们首先定义了一个元组,并将其存储的尺寸打印出来,接下来,将一个新元组存储到变量dimensions中,然后打印新的尺寸,这次,python不会报错,因为给元组变量赋值是合法的
相对应列表,元组是更坚定的数据结构,如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。
小结
通过上述的一些描述,你了解了如何高效地处理列表中的元素,如何使用for循环遍历列表,python如何根据缩进来确定程序的结构以及避免一些常见的缩进错误,如何创建简单的数字列表,以及可对数字列表执行的一些操作,如何操作切片,还有元组。
写到手酸!
领取专属 10元无门槛券
私享最新 技术干货