第四章2:for 循环
《Python projects for beginners》是我所见最友好的Python入门书,前段时间我组织并与几位Python爱好者一起对此书翻译为中文,特别感谢参与翻译的这些小伙伴,你们辛苦了。我正在以推文形式连载出来,欢迎学习。
星期二:for循环
今天将花费很多页面来介绍一个项目中的关键概念——循环。在实际应用中,你需要多次运行相同的代码。相比于我们多次重复写下相同的代码行,循环对于我们就方便很多了。在Python中,有两种循环类型,今天的课程中我们将介绍“For循环”。
为了跟上这一课,让我们继续在上一个notebook文件“Week_04”写代码并且只增加一个内容为“For循环”的markdown模块。
循环如何工作
循环就是项目如何多次返回相同代码行,执行相同的命令。在一个条件满足之前,循环会一直运行。以射击游戏为例,除非你获胜或你的生命值耗尽,否则游戏会一直运行下去。一旦这两个条件出现一个,游戏就会终止。
注意:它对于尽可能少的行来缩减你的代码非常重要,同时,对于项目运行也更有效率。
无论你是否知道这一概念,循环存在我们生命中无所不在。每天我们起床,上班,睡觉,我们是当一个常识来知道他们,但是它却是一个简单的循环。我们每天重复相同的过程,直到 们遇到周未。这一概念正是我们项目中的循环。
写下一个For循环
For循环主要应用在循环一系列数字。以表4-1为例,这个语法表明循环将返回五次。------每一个循环都是使用关键词“For”来声明开始。这个时候你会定义一个暂时变量,有时是作为一个计数或索引。接下来是关键词“in”,随后便是范围函数(范围函数将在之后解释)。最后,我们使用冒号来声明结束。对于所有的循环都遵循这样的结构:关键词For、暂时变量、关键词in、范围函数和冒号。
现在我们考虑写下循环的结构,马上让我们写一个:
# 使用range()函数写下你的第一个for循环
for num in range(5):
print("Value:{}".format(num))
继续并运行这一代码块。结果将会输出“0,1,2,3,4”。这个循环对于5的计数是必要的并且列印出每一个数字。那么,它又是如何输出这些数字的呢?当For循环被创建,range函数默认以0为开头并将0值分配给暂时变量num。我们称每一次循环为迭代。对于每一次迭代,一旦代码块中的全部代码运行,那么,当前迭代就已经完成了,并且循环将再次从头开始。本次循环中,暂时变量num的值默认以步长1递增。我们的暂时变量被分配数值1并且继续运行for循环内部能够列印出暂时变量num值的代码。代码将持续输出数字,直到迭代完5次。为了给你一个每次迭代分配数字的直观感受,请看表4-2。
表4-2 对于每次迭代使用range()函数分配数值
迭代循环 | 数值 | 输出 |
---|---|---|
1 | 0 | Value:0 |
2 | 1 | Value:1 |
3 | 2 | Value:2 |
4 | 3 | Value:3 |
5 | 4 | Value:4 |
注意:数字5没有被输出,因为range()函数计数5次但不包括数字5。
range()
Range函数允许我们对一个范围计数,当能够定义从哪开始和在哪结束以及我们需要增加多少和减少多少。这就意味着我们可以计数每一个数字,如果你需要,还可以计数每5个数字。使用一个For循环,它能够让我们有能力循环一个代码的特定次数。在之前的例子中,我们看到数字为5时,列印出5个数字。这是因为range函数默认为从0开始并且每次以步长1增加。让我们来看另一个例子:
#对于range()函数提供开始、结束和步长
for num in range(2, 10, 2):
print("Value:{}".format(num)) # 列印全部在2到10范围内间隔为2的所有数值
继续并运行这一代码块。这次我们设定项目从数字2开始循环,每次间隔2并到10结束。这时我们输出的值就变为“2, 4, 6, 8”。
元素循环
当了解到可迭代的数据类型如何工作,这就意味着它们有一个能够实现循环的元素收集器。我们通过下面这一不同的For循环来看下:
# 使用关键词in来列印出变量name中的所有单个字符
name = "John Smith"
for letter in name:
print("Value:{}".format(letter))
继续并运行这一代码块。结果将会每次输出变量name中的第一个字符。记住字符串可以是索引和字母或字符的集合,这将能够让字符串进行迭代。上面的for循环将会迭代每一个字母并且运行代码块中输出每一个字母/字符的代码。表4-3展现了这个迭代循环输出的前6个字符。
表4-3 在字符串的范围内循环迭代数值
迭代循环 | 字符 | 输出 |
---|---|---|
1 | J | Value:J |
2 | o | Value:o |
3 | h | Value:h |
4 | n | Value:n |
5 | 空格符 | Value: |
6 | S | Value:S |
continue语句
现在我们已经看到了循环如何工作,接下来,让我们讨论一些我们使用循环的重要状态。第一个就是continue语句。一旦continue语句被打破,那么,目前的迭代状态就会停止并回到循环的最开始的地方。让我们来看一个例子:
# 在一个for循环中使用continue语句
for num in range(5):
if num == 3:
continue
print(num)
继续并运行这一代码块。将会输出“0, 1, 2 ,4”,因为只有在num等于数字3的时候,continue语句才会被运行。一旦这个状态被打破,目前的迭代就会终止并回到最开始的地方进行下一个循环。这也意味着在contine下方的所有代码都不会被运行,所以上面的代码中没有列印出数字3。
break语句
我们使用的最重要的状态之一是break语句。它允许我们在任何一个地方及时跳出当前的循环。让我们来看一个例子:
# 使用break语句跳出当前循环
for num in range(5):
if num ==3:
break
print(num)
继续并运行这一代码块。结果只会输出“0, 1, 2”,这是因为当num等于3时,触发了break语句语句使得循环直接被终止,break以下的所有代码都不会被运行。这对于当一个条件被满足时停止循环是非常有用的。
注意:如果你用了双层循环,break语句只有终止其所在循环的代码块,另一层循环将会继续运行。这就意味着break语句如果只用于内部循环,那么外部循环仍会继续运行。
pass语句
三个状态中的最后一个是pass语句。pass语句仅仅是一个占位符,以便让项目不会被终止。让我们来看这样一个例子:
# 使用pass语句设置一个占位符
for i in range(5):
# TODO: 增加打印数字的代码
pass
继续并运行这一代码块。你会发现什么也没有发生,但这也意味着是一个好消息。如果你完全使用pass语句,项目将会终止。因为在代码块中需要填入其他的代码来实现相关功能。
在以上的简单循环中,我们没有必要在循环中写入这些状态代码。但却能够使一个项目结构清晰,条理分明。
注意:一般使用“TODAO”来为我们将要实现的功能设置提醒。
星期二练习
1.被3整除:写下一个for循环,列印出数字1到10之间能够被3整除的数字。
2.只列印出元音字母:定下一个for循环,列印出用户输入的单词(小写)中的所有元音字母。例如:
input:"hello"
output:"eo"
今天我们花费了些时间学习了关于for循环的概念及其如何运行。循环允许我们多次返回运行相同的代码行。