当前位置:首页 >> 工学 >>

循序渐进学Python之循环语句

循序渐进学 Python 之循环语句(1)
本文将详细介绍 Python 语言中的两种选择语句:while 语句,for 语句以及经常跟 for 语句一 起使用的 range()内建函数。与此同时,我们还将说明跟循环语句紧密相关的 break 语句、 continue 语句和 pass 语句。在整个讲解过程中,我们会适时地给出一些简单的示例程序,以 帮助读者加深理解。 本文将详细介绍 Python 语言中的两种选择语句:while 语句,for 语句以及经常跟 for 语句一起使用的 range () 内建函数。 与此同时, 我们还将说明跟循环语句紧密相关的 break 语句、continue 语句和 pass 语句。在整个讲解过程中,我们会适时地给出一些简单的示例 程序,以帮助读者加深理解。 一、程序的循环结构 在 Python 语言中,除了顺序结构和选择结构之外,还有一种常见的结构:循环结构。 所谓循环结构,就是在给定的条件为真的情况下,重复执行某些操作。具体而言,Python 语言中的循环结构包含两种语句, 分别是 while 语句和 for 语句。 这两种语句是编程时的基 本元素,例如当我们需要用户输入十个整数时,如果使用循序结构的话,则需要使用十条输 入语句,但是使用循环结构的话,我们只需要一条语句就够了。由此可见,循环结构能够给 我们的开发工作带来极大的便利。 二、while 语句 Python 的 while 语句的功能是,当给定的条件表达式为真时,重复执行循环体(即内 嵌的语句),直到条件为假时才退出循环,并执行循环体后面的语句。while 语句的语法形 式如下所示:
while 表达式 :

循环体

while 语句的流程图如下所示:

图 1:while 语句的流程示意图

我们跟上一篇文章中介绍的 if 语句的流程图做一下比较:

图2

:if 语句的流程示意图

不难发现, 两者都有一个表达式和语句体组成, 并且都是在表达式的值为真是执行语句 体。关键的区别在于,对于 if 语句,它执行完语句体后,马上退出了 if 语句;对于 while 语句,它执行完语句体后,立刻又返回到表达式,只要表达式的值为真,它会一直重复这一 过程。 在使用 while 语句时,有四点要注意,一是组成循环体的各语句的缩进形式;二是循环 体中要有使循环趋向于结束(即使表达式的值为假)的代码,否则会造成无限循环;三是循

环体既可以由单语句组成,也可以由多条语句组成,但是不能没有任何语句;四是 Python 对大小写敏感,所以关键字 while 必须小写。 现在我们用一个示例程序来演示一下 while 语句的用法。 我们的程序很简单的, 它只是 计算并输出 1 到 30 之间的奇数。代码如下所示
# -*- coding: cp936 -*-

#计算并输出 1 到 30 之间的奇数

integer = 1

while integer <= 30:

if integer % 2 == 1: print integer

integer = integer + 1

当我们在 IDEL 中运行该程序时,结果如下所示:

图 3 : while 语句示例程序运行结果

使用循环结构的时候,控制循环的结束是一个重要的考虑事项。对于 while 语句来说, 通常使用两种方式来控制循环的结束, 一种是计数器循环控制法, 一种是信号值循环控制法。 下面分别加以解释。

循序渐进学 Python 之循环语句(2)
1、计数器循环控制法 用计数器控制的循环结构, 非常适合于在循环执行之前就知道要重复执行次数的那些情 况。下面我们用一个示例程序来加以说明。 我们的程序要求用户输入 10 个整数,每次输入一个数字,之后求出其平均值并输出结果。 由于使用计数器来控制输入循环,所以必须有一个变量来充当计数器,在这里是变量 counter,我们用它来控制输入语句的执行次数。一旦计数器超过 10,便停止循环。此外, 我们还需要一个变量来累计输入的整数的值,这里是变量 total,我们将其初始化为 0。代 码如下所示:
# -*- coding: cp936 -*#让用户输入十个整数,然后计算并输出其平均值

#定义并初始化变量 total = 0 counter = 1

现在,我们需要让用户输入十个整数。我们这里用一个 while 语句让 raw_input()函 数循环执行十次。这里循环语句中的表达式为:counter <= 10,因为 counter 的初始值为 1,而循环体中使循环趋向于结束的语句是:counter = counter + 1,所以循环体将执行十 次。 每轮循环中,raw_input()函数会输出“请输入一个整数:”,提示用户进行输入。 当用户输入后,int()函数马上将输入的内容转换为一个整数,并累加到变量 total 中。 我们注意到,这三个动作我们是用一条语句完成的。代码如下所示:
#让用户输入 10 个整数,并将其累加

while counter <= 10: total = total + int(raw_input('请输入一个整数:')) #该 语句执行了三个动作 counter = counter + 1

该程序的最后部分是计算并打印计算结果。 我们首先将累加的结果转换为浮点数, 然后 除以 10,并用打印语句进行输出。代码如下所示:
#计算并输出平均数 print "您输入的十个整数的平均值是:", float(total)/10

注意, 有时候初学者喜欢用计数器 counter 来除以累加值 total 来计算平均值, 这是不 对的。因为当用户输入第十个整数时,counter 的值为 10,表达式值为真,所以循环体继续 执行。当执行了循环体的最后一条语句,即
counter = counter + 1

之后, counter 的值会变成 11, 再次判断表达式, 这时表达式的值为假, 所以退出循环。 也就是说,当循环退出时,counter 的值是 11,而不是 10。所以,用它来求 10 个整数的平 均值显然是错误的。 当我们在 IDEL 中运行该程序时,结果如下所示:

图 4 : 计数器循环控制法示例程序运行结果

2、信号值循环控制法 上面介绍的计数器循环控制法, 非常适合于事先知道循环次数的情况, 但是很多时候我 们无法事先知道具体的循环次数, 这时该怎么办呢?这就要用到下面介绍的信号值循环控制 法了。下面举例说明。 假设我们要设计一个小程序来计算公司各科室工作人员的平均年龄。 我们依旧用一个循 环语句来录入各人员的年龄, 但是各科室人员数不一, 因而计数器循环控制法显然是不合适 的,所以我们要使用一种更加灵活的循环控制方法:信号值循环控制法。所谓信号值,就是 一个特殊值,它用来指示循环结束。就本例而言,我们可以不断的输入科室人员的年龄,直 到输入完毕,这时就可以输入我们的信号值,告诉程序我们的输入工作结束了。 因为信号值跟正常的数据一起输入, 所以选择信号值时一定要仔细, 以防止与正常的值 相混淆。不过就本例而言,因为政府禁止企事业雇佣童工,所以科室人员的年龄肯定大于等 于 18 岁,为保险起见,我们选择 1 作为我们的信号值,这绝对不会跟正常的科室人员的年 龄相混淆。 代码如下所示:

# -*- coding: cp936 -*#计算科室人员平均年龄

#定义并初始化变量 total = 0 counter = 0 #年龄之和 #人员数量

#让用户输入年龄,并将用户输入内容转换为整数 age = int(raw_input('请输入科室人员的年龄,1 表示输入结束: '))

#遇到 1 表示输入结束 while age != 1: total = total + age counter = counter + 1 age = int(raw_input('请输入科室人员的年龄,1 表示输入结 束:'))

#计算并输出平均数 if counter != 0: print "科室人员的平均年龄是:", float(total)/counter else: print "没有输入任何科室人员的年龄!"

现在我们对程序代码作相应的解释。 首先我们定义了两个变量, 其中变量 total 用于存 放年龄累加值; 变量 counter 用于存放已经录入的人员数。 很明显, 在输入人员的年龄之前, 这两个变量都应该初始化为 0。代码如下所示:

#定义并初始化变量 total = 0 counter = 0 #年龄之和 #人员数量

接下来,在进入循环之前,程序要求用户输入一个职员的年龄,如下所示:
#让用户输入年龄,并将用户输入内容转换为整数 age = int(raw_input('请输入科室人员的年龄,1 表示输入结束:'))

而这个年龄决定了是否进入循环结构。如果用户的第一个输入是个信号值的话,while 语句中的表达式的值为假,那么程序会跳过这个循环结构,直接执行循环语句后面的结构。 而在循环结构之后,正好是一个选择结构:
#计算并输出平均数 if counter != 0: print "科室人员的平均年龄是:", float(total)/counter else: print "没有输入任何科室人员的年龄!"

因为我们尚未输入任何人员的年龄,所以此时 conuter 变量的值为 0,那么肯定会执行 上述选择结构中 else 子句的内嵌语句,即打印“没有输入任何科室人员的年龄!”。 如果我们的第一条输入语句得到的不是信号值,那么程序就会进入循环:
#遇到 1 表示输入结束 while age != 1: total = total + age counter = counter + 1 age = int(raw_input('请输入科室人员的年龄,1 表示输入结束: '))

在循环体中,将输入的年龄累加到变量 total 中,并将计数器加 1,接着执行循环体中 的最后一条语句:要求用户再次输入一个人的年龄。需要注意的是,我们是在对 while 结构

的条件进行判断之前来请求下一个值, 这样就能先判断刚才输入的值是否是信号值, 再对该 值进行处理。当循环体中的语句执行一遍后,程序会重新检测 while 语句的条件表达式,以 决定是否再次执行 while 结构的循环体。换句话说,如果刚才输入的值是信号值,则退出循 环结构;否则,继续重复执行循环体。 只要循环体执行一次, 那么当退出循环后, 计数人员数量的变量 counter 的值肯定大于 0, 所以这时就会执行最后面的选择结构中的 if 子句内嵌的语句体, 即计算平均年龄并打印 输出。 当我们在 IDEL 中运行该程序时,结果如下所示:

图5

:信号值循环控制法示例程序运行结果

循序渐进学 Python 之循环语句(3)
三、for 语句 循环结构在 Python 语言中有两种表现形式,一是前面介绍的 while 语句,再就是我们 这里要讲述的 for 语句。for 语句基本上是一种遍历型的循环,因为它会依次对某个序列中 全体元素进行遍历,遍历完所有元素之后便终止循环。for 语句的语法如下所示:
for 控制变量 in 可遍历的表达式:

循环体

这里的关键字 in 是 for 语句的组成部分,而非运算符 in(关于 Python 语言中的运算符我 们会在后续的文章中加以介绍) “可遍历的表达式”被遍历处理, 。 每次循环时, 都会将“控 制变量”设置为“可遍历的表达式”的当前元素, 然后在循环体开始执行。 当“可遍历的表 达式”中的元素遍历一遍后,即没有元素可供遍历时,退出循环。for 语句的示意图如下所 示:

图 6 :for 语句的示意图

读者请注意,由于 for 语句中的“可遍历的表达式”涉及多种 Python 的数据类型,为 了防止一次灌输太多的内容导致读者难以适应, 所以这里不作详细介绍, 等到介绍有关数据 类型时我们再进行相应的讨论。 现在,让我们以交互方式执行一个 for 语句,如下所示:

图 7:以交互方式测试 for 语句

四、range()函数详解 range()函数详解 () 很多时候,for 语句都是和 range()函数结合使用的,比如我们利用两者来输出 0 到 9 之间的偶数,如下所示:
# -*- coding: cp936 -*#输出 10 以下的非负整数中的偶数 print '10 以下的非负整数中的偶数为:'

for integer in range(10): if integer % 2 == 0: print integer

当我们在 IDEL 中运行该程序时,结果如下所示:

图 8 :for 语句结合 range()函数的示例程序运行结果

现在解释一下程序的执行过程。首先,for 语句开始执行时,range()函数会生成一 个由 0~9 这十个值组成的序列;然后,将序列中的第一个值即 0 赋给变量 integer,并执 行循环体。在循环体中,我们将变量 integer 除以 2,如果余数为零,则打印该值;否则跳 过打印语句。执行循环体中的选择语句后,序列中的下一个值将被装入变量 integer,如果 该值是序列中的,那么继续循环,以此类推,直到遍历完序列中的所有元素为止。 好了,现在我们开始关注 range()函数本身,首先以交互方式查看 range(10)的返 回值,如下所示:

图 9 :range(10)的返回结果

我们看到,range(10)的返回的是整数 0~9,各整数之间用逗号隔开,并且两端用方 括号括住, 这是一个典型的 Python 列表——关于 Python 的列表类型我们会在将来的文章中 专门加以介绍。 需要注意的是,range(10)返回的列表中的第一个值是整数 0,然后递增 1, 最后一个值正好比给该函数的参数值小 1 即(参数-1)。这一点初学者经常搞混,所以在 此特别提醒一下。

读者可能会问: 能否让 range 函数返回的值不从 0 开始, () 而是从指定的数字开始呢? 答案是肯定的,不过为此需要给 range()函数指定两个参数,比如我们想让该函数返回的 列表中的值为整数 1~10,则需要这样指定参数:range(1,11)。下面看一下执行结果如 何:

图 10 :range(1,11)的返回结果

看了上面两个 range()函数调用,读者也许已经发现,两者返回的值都是递增 1,但 是要想每次递增 2,能行么?答案还是肯定的,不过这次就要使用三个参数来调用 range() 函数了,我们看看 range(1,11,2)、range(11,1,-2)和 range(8,89,8)的返回 情况,如下所示:

图 11 :具有三个参数的 range()的返回情况

好了,现在我们来总结一下 range()函数的用法。该函数的一般形式如下所示:
range([start ,] stop [, step])

上面方括号内的参数表示是可选的,但所有参数必须是整数。如果参数 step 被省略的 话,它的默认值是 1;如果参数 start 被省略的话,它的默认值将是 0。但是无论如何,参

数 stop 是不允许省略的,所以 range()函数只有一个参数时,它表示 range(stop);当 range()函数带有两个参数时,它表示 range(start,stop)。 我们知道 range () 返回的是一个列表, 列表中的整数值为[start, start + step, start + 2 * step, start + 3 * step,...]。如果参数 step 为正值,那么列表中最后一个元素为 小于参数 stop 的那个最大的整数 start + i * step ;如果参数 step 为负值,那么列表中 最后一个元素为大于参数 stop 的那个最小的整数 start + i * step 。但是任何时候参数 step 的值都不能为零。只要将上面的列举的 range()示例跟这里的一般性介绍相结合,我 们就能更好的理解该内建函数的用法。 需要注意,当参数 step 为正值时,参数 start 必须小于参数 step;当参数 step 为负 值时,参数 start 必须大于参数 step,否则 range()函数将返回一个空表,如下所示:

图 11 :range()返回空表的情形

循序渐进学 Python 之循环语句(4)
五、break 语句和 continue 语句 一般说来,break 和 continue 语句的作用是改变控制流程。当 break 语句在循环结构 中执行时,它会导致立即跳出循环结构,转而执行该结构后面的语句。比如,我们依次输出 字符串“hello”中的各个字符,遇到第一个字符“l”时结束,我们以交互方式演示:

图 12 :用 break 语句跳出循环结构

与 break 语句不同,当 continue 语句在循环结构中执行时,并不会退出循环结构,而 是立即结束本次循环,重新开始下一轮循环,也就是说,跳过循环体中在 continue 语句之 后的所有语句,继续下一轮循环。对于 while 语句,执行 continue 语句后会立即检测循环 条件;对于 for 语句,执行 continue 语句后并没有立即检测循环条件,而是先将“可遍历 的表达式”中的下一个元素赋给控制变量,然后再检测循环条件。比如,我们这次还是依次 输出字符串“hello”中的各个字符,但忽略字符串中的字符“l”,我们以交互方式演示:

图 13 :continue 语句将结束本轮循环,进入下一轮循环

循序渐进学 Python 之循环语句(5)
六、循环语句的 else 子句 与 C 语言中的 while 语句和 for 语句相比,Python 语言的两种循环语句有一个很大的 不同之处,那就是 Python 的循环语句可以带有 else 子句。带有 else 子句的 while 循环语 句的完整形式如下所示:
while 表达式 : 循环体 else: 语句体

当 while 语句配备 else 子句时,如果 while 子句内嵌的循环体在整个循环过程中没有 执行 break 语句 (循环体中没有 break 语句, 或者循环体中有 break 语句但是始终未执行) , 那么循环过程结束后,就会执行 else 子句中的语句体。否则,如果 while 子句内嵌的循环 体在循环过程一旦执行 break 语句,那么程序的流程将跳出循环结构,因为这里的 else 子 句也是该结构的组成部分,所以 else 子句内嵌的语句体也就不会执行了。 下面是带有 else 子句的 for 语句的完整形式:
for 控制变量 循环体 else: 语句体 in 可遍历的表达式:

与 while 语句类似, 如果 for 语句在遍历所有元素的过程中, 从未执行 break 语句的话, 那么 else 子句内嵌的语句体将得以执行; 否则, 一旦执行 break 语句, 程序流程将连带 else 子句一并跳过。 下面我们以一个判断给定的自然数是否为素数的程序为例,来演示带有 else 子句的 while 循环的用法,代码如下所示:
# -*- coding: cp936 -*number = int(raw_input('请输入一个自然数:'))

factor = number / 2

while factor > 1:

if number % factor == 0: print number, '具有因子', factor, ',所以它不是素数' break #跳出循环,包括 else 子句

factor = factor - 1 else: 句 print number, '是素数' # 如果循环正常退出, 则执行该子

当我们在 IDEL 中运行该程序时,结果如下所示:

图 14 :带有 else 子句的 while 循环的示例程序输出

从运行结果可以看出,只要循环体中执行了 break 语句,那么循环结构中的 else 子句 就不会执行,只有循环体正常退出时,才会执行 else 子句。读者可能会问:continue 语句

对循环结构的 else 子句有类似的影响吗?答案是没有, 因为 continue 语句只是结束本轮循 环,而没有完全退出循环结构,大家可以亲自动手试一下。 七、pass 语句 前面说过,循环体可以包含一个语句,也可以包含多个语句,但是却不可以没有任何语 句。那么,如果我们只是想让程序循环一定次数,但是循环过程什么也不做的话,那该怎么 办呢?当然是有办法的,因为 Python 为我们提供了一个 pass 语句,该语句什么也不做,也 就是说它是一个空操作,所以,下列代码是合法的:
for x in range(10): pass

实际上,该语句的确会循环十次,但是除了循环本身之外,它什么也没做。当然,pass 语句还有其他方面的作用,比如在函数定义或异常处理方面等,届时我们会加以介绍。 八、小结 本文详细介绍了 Python 中的两种循环语句,for 语句和 while 语句。与此同时,我们 还对 while 语句的两种循环控制方式,for 语句密切相关的内建函数 range()等做了必要 说明。需要说明的是,虽然本文的标题为“循序渐进学 Python 之循环语句”,但是为了使 读者对循环语句有一个全面的了解,许多跟循环语句紧密相关的语句,如 break 语句、 continue 语句和 pass 语句等,在此一并介绍。但愿本文对您有所帮助。


相关文章:
循序渐进学Python之循环语句.doc
循序渐进学Python之循环语句 - 循序渐进学 Python 之循环语句(1)
Python语言基础分支语句、循环语句_图文.ppt
Python语言基础分支语句、循环语句_其它课程_高中教育_教育专区。Python 基础 分支...循序渐进学PYTHON之循环... 18页 5下载券 3:Python运算符与分支语... ...
PYTHON循环语句入门.doc
PYTHON循环语句入门_计算机软件及应用_IT/计算机_专业资料。循环语句入门 要计算 ...初学python简单语句 暂无评价 1页 免费 循序渐进学Python之循环... 18页 1...
循序渐进学Python:IDLE的运行、编辑与调试.doc
循序渐进学Python:IDLE的运行、编辑与调试 - 循序渐进学 Python:IDLE 的运行、编辑与调试(1) IDLE 是 Python 软件包自带的一个集成开发环境, 初学者可以利用它....
python的三种选择语句.doc
有时候我们还可以在 给定条件下往复执行某些语句, 这时我们称这些语句循环结构...有关 IDEL 的使用方法, 读者可以参考前面的“循序渐进学 Python 之 IDLE 篇”...
6-Python循环语句.ppt
? ? python---James 循环控制 python---James 循环控制 python---James 循环...Python While循环语句 暂无评价 4页 免费 循序渐进学PYTHON之循环... 18页 ...
循序渐进学Python:IDLE的运行、编辑与调试精品资料.doc
循序渐进学Python:IDLE的运行、编辑与调试精品资料 - 循序渐进学 Python:IDLE 的运行、编辑与调试(1) IDLE 是 Python 软件包自带的一个集成开发环境,初学者可以....
5.Python第五课_循环语句_图文.ppt
python 循环语句 python range()函数该函数是Python的内置函数,用于生成一系列连续的整数, 多用于for循环语句中语法格式:range(起始值,结束值,指定步长) 起始值可以...
python03while循环语句.doc
python03while循环语句_计算机软件及应用_IT/计算机_专业资料。一. Python while 循环 1 语法结构 1) 2) 2 While 条件: 循环语句 Break 语句:跳出整个循环 1)...
Python之循环_图文.ppt
Python之 ? for循环可以遍历任何序列的项目,如一个 列表或者一个字符串。 ? for循环的一般格式如下: ? for循环结构的语句块以for关键字开始,然后紧跟一个特 ...
Python简化重复命令教案.doc
Python简化重复命令教案_其它课程_初中教育_教育专区...能够理解并掌握循环语句的含义,其他语句就很容易理解...大,在教学中必须消除学生的畏难情绪,循序渐进学习...
Python for 循环.doc
Python 的 for 循环,就是自动地重复其他的程序语句或者语句块代 码。
巧用例子让学生理解python语言中的计数循环.doc
《大东方》2018 年第 03 期 摘要:在中学开展 python 程序语言课程,存在各种各样的难题,本文探讨通过大量实例 来讲解 python 语言中计数循环语句,可以让学生更容易...
循序渐进学Python之数值类型.doc
当我们用 import 语句进行相应的声明后,除法运算符/只能用于真除法,所以 此时 ...python组合数据类型 暂无评价 73页 2下载券 循序渐进学PYTHON之循环... 18...
课题_【循序渐进学Python】网络编程.doc
循序渐进学 Python】网络编程 Python 内置封装了很多常见的网络协议
Python程序设计-清华大学出版社-董付国第3章 选择与循....ppt
Python程序设计-清华大学出版社-董付国第3章 选择与循环_物理_自然科学_专业资料...3.2.1 单分支选择结构 if 表达式: 语句块 a,b=input('Input two number:...
Python作业04(循环).pdf
Python作业04(循环)_数学_自然科学_专业资料。Python作业04(循环) 班级: 学号:...对于带有else子句的for语句和while语句,当循环循环条件不成立而自然结束时, 会...
Python程序设计清华大学出版社董付国第3章选择与循环汇....ppt
Python程序设计清华大学出版社董付国第3章选择与循环汇总_幼儿读物_幼儿教育_教育...3.2.1 单分支选择结构 if 表达式: 语句块 a,b=input('Input two number:...
6.189 - 循序渐进使用python 编程短期独立活动计划) 20....pdf
6.189 - 循序渐进使用python 编程短期独立活动计划)...重要的是:此函数内不应该有loop 循环。我们的清单...(用同上面一 样的语句)。 你现在应当有一个带...
Python基础教程--05第五章条件、循环和其他语句_图文.ppt
Python基础教程--05第五章条件、循环和其他语句_计算机软件及应用_IT/计算机_专业资料。Python基础教程(作者:(挪威)Magnus Lie Hetland 译者:司维 曾军崴 谭颖华)...