4.1 遍歷整個清單
我們常常需要遍歷清單中的所有元素,對每個清單執行相同的動作。在進行重複性的工作的時候這個很有用,重複性工作。例如,在遊戲中,可能需要將每個介面元素平移相同的距離;對於包含數字的列表,可能需要對每個元素執行相同的統計運算;在網站中,可能需要顯示3文章中的每個標題。當需要對清單中的每個元素都執行相同的操作時,可使用Python中的for迴圈。
假如我們有一個魔術師的名單,需要將其中每個魔術師的名字都印出來。為此,我們可以分別取得名單中的每個名字,但這種做法會導致很多個問題。例如,如果名單過長,將包含大量重複的程式碼。另外,每當名單中的長度發生變化時,都必須修改程式碼。透過使用for循環,可讓Python去處理這些問題。
下面使用for循環來列印魔術師名單中的所有名字:
magicians = ["alice","david","carolina"] for magician in magicians: (magician) 运行结果: alice david carolina 首先,我们像第三章那样定义了一个列表。接下来,我们定义了一个for循环;这行代码让Python从列表magicians中去除一个名字,并将其存储在 magician中。最后,我们让Python打印前面存储到变量magician中的名字。这样,对于列表中的每个名字,Python都将重复执行。我们可以这样解读这些代码 :对于列表magician中的每位魔术师,都将其名字打印出来。输出很简单,就是列表中所有的姓名: 4.1.1 深入地研究循环循环这种概念很重要,尤其在操作重复性的问题的时候,使用自动循环会提高很多效率,而且它是让计算机自动完成重复工作的常见方式之一。例如,在前 面的magicians.py中使用的简单循环中,Python将首先读取其中的第一行代码: for magician in magicians: 这行代码,让Python获取列表中magicians中的第一个值("alice"),并将其存储到变量magician中。接下来,Python读取下一行代码。 print(magician) 它让Python打印magician的值---依然是"alice"。鉴于该列表还包含其他值,Python返回循环的第一行: for magician in magicians: python获取列表中下一个名字——"david",并将其存储到变量magician中,在执行下面的代码: print(magician) Python再次打印变量magician的值"david"。接下来,Python再次执行整个循环,对列表中的最后一个值——"carolina"进行处理。至此,列表中没有其 它的值了,因此Python接着执行程序的下一行代码。在这个实例中,for循环后面没有其他的代码,因此程序就此结束。 刚开始使用循环时请牢记,对列表中的每个元素,都将执行循环制定的步骤,而不管列表包含多少元素。如果列表包含一百万个元素,Python就重复执行一 百万次,且通常速度非常快。 另外,编写for循环时,对于用于存储列表中每个值的临时变量,可指定任何名称。然而,选择描述单个列表元素的有意义的名称大有帮助。例如,对于小 猫列表,小狗列表和一般性列表,像下面这样编写for循环的第一行代码是不错的选择: for dog in dogs: for cat in cats: for item in _of_items: 这些命名约定有助于我们明白for循环中将对每个元素执行的操作。使用单数和复数式名称,可帮助我们判断代码处理的是单个列表元素还是整个列表。 4.1.2 在for循环中执行更多的操作在for循环中,可对每个元素执行任何操作。
magicians = ["alice","david","carolina"] for magician in magicians: print(magician.title() + ", that was a greet trick!") 下面输出结果表明,对于列表中的每位魔术师,都打印了一条个性化消息: Alice, that was a greet trick! David, that was a greet trick! Carolina, that was a greet trick!在for循环中,想包含多少行代码都可以。在代码行for magician in magicians后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都 执行一次。因此,可对列表中能够的每个值执行任意次数的操作。 下面再添加一行代码,告诉每位魔术师,我们期待他的下一次表演:
magicians = ["alice","david","carolina"] for magician in magicians: print(magician.title() + ", that was a greet trick!") print("I can't wait to see your trick, " + magician.title() + ".\n" ) 由于两条print语句都缩进了,因此它们都将针对列表中的每位魔术师执行一次。第二条print语句中的换行符"\n"在每次迭代结束后都插入一 个空行,从而整洁地将针对各位魔术师的消息编组: Alice, that was a greet trick! I can't wait to see your next trick, Alice. David, that was a greet trick! I can't wait to see your next trick, David. Carolina, that was a greet trick! I can't wait to see your next trick, Carolina! 在for循环中,想包含多少行代码都可以。实际上,我们会发现使用for循环对每个元素执行众多不同的操作很有用。 4.1.3 在for循环结束后执行一些操作for循环结束后再怎么做呢?通常,我们需要提出总结性输出或接着执行程序必须完成的其他任务。 在for循环后面,没有缩进的代码都只执行一次,而不会重复执行。下面来打印一条向全体魔术师致谢的消息,感谢它们的精彩表演。想要在打印给各位 魔术师的消息后面打印一条给全体魔术师的致谢消息,需要将相应的代码放在for循环后面,且不缩进:
magicians = ["alice","david","carolina"] for magician in magicians: print(magician.title() + ", that was a great trick!") print("I can't wait to see your next trick, " + magician.title() + ".\n" ) print("Thank you,everyone. That was a great magic show!") 我们在前面看到了,开头两条print语句针对列表中每位魔术师重复执行。然而,由于第三条print语句没有缩进,因此只执行一次: Alice, that was a great trick! I can't wait to see your next trick, Alice. David, that was a great trick! I can't wait to see your next trick, David. Carolina, that was a great trick! I can't wait to see your next trick, Carolina. Thank you,everyone. That was a great magic show!使用for循环处理数据是一种对执行整体操作的不错的方式。例如,你可能使用for循环来初始化游戏——遍历角色列表,将每个角色都显示到屏幕 上;再在循环后面添加一个不缩进的代码块,在屏幕上绘制所有角色后显示一个play Now。 4.2 避免缩进错误 Python根据缩进来判断代码行与前一个代码行的关系。在前面的实例中,向各位魔术师显示消息的代码行是for循环的一部分,因为它们缩进了。Python通 过缩进让代码更易读;简单地说,它要求我们使用缩进让代码整洁而结构清晰。在较长的Python程序中,我们将看到缩进程度各不相同的代码块,这让我们队程 序的组织结构有大致的认识。 当我们开始编写必须正确缩进的代码时,需要注意一些常见的缩进错误。例如,有时候,程序员会将不需要缩进的代码块缩进,而对于必须缩进的代码块却 忘了缩进。通过查看这样的错误示例,有助于我们以后避开它们,以及在它们出现在程序中时进行修复。 4.2.1 忘记缩进对于位于后面且属于循环组成部分的代码行,一定要缩进。如果我们忘记缩进,Python会提醒:
magicians = ["alice","david","carolina"] for magician in magicians: print(magician.title() + ", that was a great trick!") print语句应缩进却没有缩进。Python没有找到期望缩进的代码块时,会让我们知道代码行有问题。 "/home/zhuzhu/title4/magicians.py", line 3 print(magician.title() + ", that was a great trick!") ^ IndentationError: expected an indented block提示我们代码没有缩进,预期应该出现缩进的,通常,将紧跟在for语句后面的代码行缩进,可消除这种缩进错误。 4.2.2 忘记缩进额外的代码行
magicians = ["alice","david","carolina"] for magician in magicians: print(magician.title() + ", that was a great trick!") print("I can't wait to see your next trick, " + magician.title() + ".\n" )
magicians = ["alice","david","carolina"] for magician in magicians: print(magician.title() + ", that was a great trick!") print("I can't wait to see your next trick, " + magician.title() + ".\n" ) print("Thank you,everyone. That was a great magic show!") 由于第三条print代码行被缩进,它将针对列表中的每位魔术师执行一次 Alice, that was a great trick! I can't wait to see your next trick, Alice. Thank you,everyone. That was a great magic show! David, that was a great trick! I can't wait to see your next trick, David. Thank you,everyone. That was a great magic show! Carolina, that was a great trick! I can't wait to see your next trick, Carolina. Thank you,everyone. That was a great magic show! 这也是一个逻辑错误,与4.2.2节的错误类似。Python不知道你的本意,只要代码符合语法,它就会运行。如果原本只应执行一次的操作执行了多次,请确 定我们是否不应该缩进执行该操作的代码。 4.2.5 遗漏了冒号:for语句在末尾冒号告诉Python,下一行是循环的第一行。
magicians = ["alice","david","carolina"] for magician in magicians print(magician.title() + ", that was a great trick!") 运行: File "/home/zhuzhu/title4/magicians.py", line 2 for magician in magicians ^ SyntaxError: invalid syntax (语法无效)如果我们不小心遗漏了冒号,将导致,运行会提示无效语法,因为Python不知道我们意欲何为。这种错误虽然易于消除,但并不那么容 易发现。程序员为找出这样的单字符错误,花费的时间多的令人惊讶。这样的错误之所以难以发现,是因为通常在我们的意料之外。 动手练一练
运行结果如下:
animals = ["lion","tiger","wolf","leopard"] for animal in animals: print(animal.title() + "s are good at hunting.") print("Any of these animals like eating meat!") 首先定义了一个动物列表,使用for循环遍历列表中每一个动物,第一个print打印所以动物的一个共性,属于for循环的;第二个print在for循环外 面,当运行结束for循环后进行运行,属于总结性的语言,所以只会打印一次: Lions are good at hunting. Tigers are good at hunting. Wolfs are good at hunting. Leopards are good at hunting. Any of these animals like eating meat! 4.3 创建数值列表 需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分。在数据可视化中,处理的几乎都是 数字(如温度、距离、人口数量、经度和纬度等等)组成的集合。 列表非常适合用于存储数字集合,而且Python提供了很多工具,可帮助我们处理数字列表。明白如何有效地使用这些工具后,即便包含数百万个元素,我们 编写的代码也能很好的运行。 4.3.1 ()
for value in range(1,6): print(value) 这样,输出将从1开始,到5结束: 1 2 3 4 5 使用range()函数时,如果输出不符合预期,请尝试将指定的值加1或减1. 4.3.2 使用range()函数创建数字列表
numbers = list(range(1,6)) print(numbers) 结果如下: [1, 2, 3, 4, 5] 使用函数range()时,还可指定步长。例如,下面的代码打印1~10内的奇数:
numbers = list(range(1,10,2)) print(numbers) 在这个实例中,函数range()从2开始数,然后不断地加2,直到达到或超过终值(10),因此输出的结果如下: [1, 3, 5, 7, 9] 使用函数range()几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前10个(既1~10)的平方呢?在Python中,两个星号(**)表示 乘方运算。下面的代码演示了如何将前10个整数的平方加入到一个列表中:
squares = [] for num in range(1,11): square = num**2 squares.append(square) print(squares)首先,我们创建了一个空列表;接下来,使用函数range()让Python遍历1~10的值。在循环中,计算当前值的平方,并将结果存储到变量square中,然后 将新计算的到的平方值附加到列表squares的末尾。最后,循环结束后,打印列表squares [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 创建更复杂的列表时,可使用上述两种方法中的任何一种。有时候,使用临时变量会让代码更易读;而在其他情况下,这样只会让代码无所谓地变长。我们 应该考虑的是,编写清晰易懂且能完成所需功能的代码;等到代码时,在考虑采用更高效的方法。
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] 要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这样做是完全值得的。当你觉得编写三四行代码来生成列表有点繁 复时,就应该考虑创建列表解析了。 其实,我挺喜欢列表解析的,这种方法太省事了,又不用定义列表,只需要把语句写在括号里面,好省事,很方便,要多尝试使用这种方式,创建简短的数 列表表示方式。 动手试一试 4-3 数到20:使用一个for循环打印数字1~20(含); 4-4 一百万:创建一个列表,其中包含数字1~1000000,在使用一个for循环将这些数字打印出来(如果输出的时间太长,按Ctrl + C停止输出,或关闭 输出窗口)。 4-5 计算1~1000000的总和:创建一个列表,其中包含数字1~1000000,在使用min()函数和max()函数核实该列表确实是从1开始,从1000000结束的。 另外,对这个列表调用函数sum(),看看Python将一百万个数字相加需要多长时间。 4-6 奇数: 通过给函数range()指定第三个参数来创建一个列表,其中包含1~20的奇数;在使用一个for循环将这些数字都打印出来; 4-7 3的倍数: 创建一个列表,其中包含3~30内能被3整除的数字;在使用一个for循环将这个列表中的数字都打印出来; 4-8 立方: 将同一个数字乘三次成为立方。例如,在Python中,2的立方用2**3表示。请创建一个列表,其中包含前10个整数(即1~10)的立方,在使用 一个for循环将这些立方数都打印出来; 4-9立方解析:使用列表解析生成一个列表,其中包含前10个整数的立方。 分析:里面的试题主要考察我们for循环的使用,已经min()函数、max()函数和sum()函数等,要多尝试使用列表解析,因为我觉得这真是一个很好的方法,只需 一步就能产生我们需要的列表,要记住函数range()的差一性,list()函数是生成列表的。表达式的情况,对数字列表进行操作。 4-3:本题就是练习我们for循环的使用,还有range()函数的差一性for num in range(1,21): print(num)4-4:本题还是锻炼我们for循环的使用情况,以及range()函数的差一性,但是想告诉我们,Python可以处理很大的数字,并不简单是书上很小的数
for num in range(1,1000001): print(num)运行的时候,遍历1~1000000还是花费了十几秒的时间,要记得差一性,比我们想要的数加一 4-5:本题是要使用list()函数创建列表,然后验证最大值,最小值,并对数字进行求和
numbers =
4-10:本題主要檢視清單切片的表示方法,如何進行清單切片的表示,尤其是L.[-1]表示最後一個元素,此方法的使用很關鍵,考察最後幾個元素的時候都會用到,清單切片的表示是從第幾個元素到第幾個元素,中間用冒號分割。
digits = [2,3,8,9,0,3,5,7]
print("The first three items in the list are: ")
print(digits[: 3])
print("\nThree items from the middle of the list are: ")
print(digits[2:5])
print("\nThe last three items in the list are: ")
print(digits[-3:])
運作結果如下:
The first three items in the list are:
[2, 3, 8]
Three items from the middle of the list are:
[8, 9, 0]
The last three items in the list are:
[3, last three items in the list are:
# 4-11 本題主要考察的是切片的使用,已經列表的複製的方法,列表複製要透過切片來完成,Python的工作原理決定的。
pizzas = ["New York Style","Chicago Style","California Style"]
friend_pizzas = pizzas[:]
pizzas.append("noodle" )
friend_pizzas.append("rice")
print("My favorite pizzas are: ")
for pizza in pizzas:##卷
print("\nMy friend's favorite pizzas are: ")
for friend_pizza in friend_pizzas:
print(friend_pizza)
print(friend_pizzas)
運行結果:
New York Style
Chicago StyleCalifornia Style
noodle
['New York Style', 'Chicago Style', 'California Style', 'noodle' ]
My friend's favorite pizzas are:
New York Style
Chicago Style
California Style
rice
['New York Style', 'Chicago Style', 'California Style', 'rice']
4.5 元祖
dimensions = (200,50)
print(dimensions[0])
print(dimensions[1])
#我們先定義了元祖dimensions,為此我們使用了圓號而不是方括號。接下來,我們分別印出該元祖的各個元素,所使用的語法與存取清單元素時所使用的語法相同:
dimensions[0] = 250
print(dimensions) 程式碼試圖修改第一個元素的值,導致Python傳回類型錯誤訊息。由於試圖修改元祖的操作是被禁止的,因此Python指出不能給元祖的元素賦值:
Traceback (most recent call last):
File "/home/zhuzhu/title4/dimensions.py ", line 2, in module
>
dimensions[0] = 250 TypeError: 'tuple' object
# does not support item#assignment
程式碼試圖修改矩形的尺寸時,Python回報錯誤,這很好,因為這正是我們所希望的。 4.5.2 遍歷元祖中的所有值
像列表一样,也可以使用for循环来遍历元组中的所有值:
dimensions = (200,50)
for dimension in dimensions:
print(dimension)
就像遍历列表时一样,Python返回元组中所有的元素:
200
50
4.5.3 修改元组变量
虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:
dimensions = (200,50)
print("Original dimensions: ")
for dimension in dimensions:
print(dimension)
dimensions = (400,100)
print("\nModified dimensions: ")
for dimension in dimensions:
print(dimension)
我们首先定义了一个元组,并将其存储的尺寸打印了出来;接下来,将一个新元组存储到变量dimensions中;然后,打印新的尺寸。这次,Python不会报告任何错误,因为给元组变量赋值是合法的:
Original dimensions:
200
50
Modified dimensions:
400
100
相比于列表,元组是更简单的数据结构.如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。
动手试一试
4-13 自助餐: 有一家自助式餐厅,只提供五种简单的食品。请想出五种简单的食品,并将其存储在一个元祖中。
1、使用一个for循环将该餐馆提供的五种食品都打印出来;
2、尝试修改其中的一个元素,核实Python确实会拒绝我们这样做;
3、餐馆调整了菜单,替换了它提供的某中两种实物。请编写一个这样的代码块;给元组变量赋值,并使用一个for循环将新元组中的每个元素都打印出来。
分析:本题主要考察元组的性质及用法,我们知道,元组中的元素是不可以修改的,但是元组是可以重新赋值的,我们虽然不能修改元组中的元素,但是我们可以整体修改元组,元组其他的性质跟列表的性质都是一样的,就是不能对元组本身就行修改,比如添加,删除,赋值等。
cafeterias = ("rice","noodle","porridge","hamburger","pizza")
for cafeteria in cafeterias:
print(cafeteria)
cafeterias[-1] = "dami"
运行结果如下:
rice
noodle
porridge
hamburger
pizza
Traceback (most recent call last):
File "/home/zhuzhu/title4/Cafeterias.py", line 5, in
cafeterias[-1] = "dami"
TypeError: 'tuple' object does not support item assignment
从运行结果可以看出,当我们试图修改元组的元素是,发生了错误,提示我们不能修改元组的元组值
cafeterias = ("rice","noodle","porridge","hamburger","pizza") print("Original menu: ") for cafeteria in cafeterias: print(cafeteria) #cafeterias[-1] = "dami" cafeterias = ("pizza",'hamburger','rice','milk','Drumsticks') print("\nModified menu: ") for cafeteria in cafeterias:print(cafeteria)运行结果如下:Original menu: rice noodle porridge hamburger pizza Modified menu: pizza hamburger rice milk Drumsticks 从运行结果可以看出,虽然我们不能修改元组中元素的值,但我们可以整体重新给元组进行赋值,这样是允许的,因而我们可以对元组重新赋值,这是允许的, 也是合法的,系统不会报错。 4.6 设置代码格式 随着我们编写的程序越来越长,有必要了解一些代码格式设置的约定。请花时间让我们的代码进可能易于阅读;让代码易于阅读有助于我们掌握程序是做什 么的,也可以帮助他人理解我们编写的代码。 为确保所有人编写的代码的结构都大致一致,Python程序员都遵循一些格式设置约定。学会编写整洁的Python后,就能明白他人编写的Python代码的整体 结构——只要他们和你遵循相同的指南。要称为专业程序员,应从现在开始就遵循这些指南,以养成良好的习惯。 4.6.1 格式设置指南若要提出Python语言修改建议,需要编写Python改进提案(Python Enhancement Proposal,PEP).PEP8是最古老的PEP之一,它向Python程序员提供了代 码格式设置指南。PEP8的篇幅很长,但大都与复杂的编码结构相关。 Python格式设置指南的编写者深知,代码被阅读的次数比编写的次数多。代码编写出来后,调试时你需要阅读它;给程序添加新功能时,需要花很长的时间 阅读代码;与其他程序员分享代码时,这些程序员也将阅读它们。 如果一定要在代码易于编写和易于阅读之间做出选择,Python程序员几乎总是选择后者。下面的指南可帮助我们从一开始就编写除清晰的代码。 4.6.2 缩进 PEP 8建议每级缩进都使用四个空格,这即可提高可读性,又留下了足够的多级缩进空间。 在字处理文档中,大家常常使用制表符而不是空格来缩进。对于字处理文档来说,这样做的效果很好,但混合使用制表符和空格会让Python解释器感到迷惑 。每款文本都提供了一种设置,可将输入的制表符转换为指定数量的空格。我们在编写代码时应该使用制表符键,但一定要对编辑器进行设置,使其在文 档中插入空格而不是制表符。 在程序中混合制表符和空格可能导致极难解决的问题。如果我们混合使用了制表符和空格,可将文件中所有的制表符转换为空格,大多数编辑器都提供了这 样的功能。 4.6.3 行长 很多Python程序员都建议每行不超过80字符。最初制定这样的指南时,在大多数计算机中,终端窗口每行只能容纳79字符;当前,计算机屏幕每行可容纳的 字符数多得多,为何还要使用79字符的标准行长呢?这里有别的原因。专业程序员通常会在同一个屏幕上打开多个文件,使用标准行长可以让我们在屏幕上并排 打开两三个文件时能同时看到各个文件的整行。PEP 8还建议的行长都不超过72字符,因为有些工具为大型项目自动生成文档时,会在每行注释开头添加格式 化字符。 PEP 8中有关行长的指南并非不可逾越的红线,有些小组将最大行长设置为99字符。在学习期间,我们不用过多考虑代码的行长,但别忘了,协作编写程序, 大家几乎都遵守PEP 8指南。在大多数编辑器中,都可设置一个视觉标志——通常是一条竖线,让你知道不能越过的界限在什么地方。 4.6.4 空行 要将程序不同部分分开,可使用空行。我们应该使用空行来组织程序文件,但也不能滥用;只要按本书的示例展示的那样做,就能掌握其中的平衡。例如, 如果我们有5行创建列表的代码,还有3行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,我们不应该使用三四个空行将它们隔开。 空行不会影响代码的运行,但会影响代码的可读性。Python解释器根据水平缩进情况来解读代码,但不关心垂直间距。
Original menu:
rice
noodle
porridge
hamburger
pizza
Modified menu:
pizza
hamburger
rice
milk
Drumsticks
以上是Python從入門操作清單學習的詳細內容。更多資訊請關注PHP中文網其他相關文章!