循序渐进学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=1whileinteger=30:ifinteger%2==1:printintegerinteger=integer+1当我们在IDEL中运行该程序时,结果如下所示:图3:while语句示例程序运行结果使用循环结构的时候,控制循环的结束是一个重要的考虑事项。对于while语句来说,通常使用两种方式来控制循环的结束,一种是计数器循环控制法,一种是信号值循环控制法。下面分别加以解释。循序渐进学Python之循环语句(2)1、计数器循环控制法用计数器控制的循环结构,非常适合于在循环执行之前就知道要重复执行次数的那些情况。下面我们用一个示例程序来加以说明。我们的程序要求用户输入10个整数,每次输入一个数字,之后求出其平均值并输出结果。由于使用计数器来控制输入循环,所以必须有一个变量来充当计数器,在这里是变量counter,我们用它来控制输入语句的执行次数。一旦计数器超过10,便停止循环。此外,我们还需要一个变量来累计输入的整数的值,这里是变量total,我们将其初始化为0。代码如下所示:#-*-coding:cp936-*-#让用户输入十个整数,然后计算并输出其平均值#定义并初始化变量total=0counter=1现在,我们需要让用户输入十个整数。我们这里用一个while语句让raw_input()函数循环执行十次。这里循环语句中的表达式为:counter=10,因为counter的初始值为1,而循环体中使循环趋向于结束的语句是:counter=counter+1,所以循环体将执行十次。每轮循环中,raw_input()函数会输出“请输入一个整数:”,提示用户进行输入。当用户输入后,int()函数马上将输入的内容转换为一个整数,并累加到变量total中。我们注意到,这三个动作我们是用一条语句完成的。代码如下所示:#让用户输入10个整数,并将其累加whilecounter=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表示输入结束whileage!=1:total=total+agecounter=counter+1age=int(raw_input('请输入科室人员的年龄,1表示输入结束:'))#计算并输出平均数ifcounter!=0:print科室人员的平均年龄是:,float(total)/counterelse:print没有输入任何科室人员的年龄!现在我们对程序代码作相应的解释。首先我们定义了两个变量,其中变量total用于存放年龄累加值;变量counter用于存放已经录入的人员数。很明显,在输入人员的年龄之前,这两个变量都应该初始化为0。代码如下所示:#定义并初始化变量total=0#年龄之和counter=0#人员数量接下来,在进入循环之前,程序要求用户输入一个职员的年龄,如下所示:#让用户输入年龄,并将用户输入内容转换为整数age=int(raw_input('请输入科室人员的年龄,1表示输入结束:'))而这个年龄决定了是否进入循环结构。如果用户的第一个输入是个信号值的话,while语句中的表达式的值为假,那么程序会跳过这个循环结构,直接执行循环语句后面的结构。而在循环结构之后,正好是一个选择结构:#计算并输出平均数ifcounter!=0:print科室人员的平均年龄是:,float(total)/counterelse:print没有输入任何科室人员的年龄!因为我们尚未输入任何人员的年龄,所以此时conuter变量的值为0,那么肯定会执行上述选择结构中else子句的内嵌语句,即打印“没有输入任何科室人员的年龄!”。如果我们的第一条输入语句得到的不是信号值,那么程序就会进入循环:#遇到1表示输入结束whileage!=1:total=total+agecounter=counter+1age=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()函数详解很多时候,for语句都是和range()函数结合使用的,比如我们利用两者来输出0到9之间的偶数,如下所示:#-*-coding:cp936-*-#输出10以下的非负整数中的偶数print'10以下的非负整数中的偶数为:'forintegerinrange(10):ifinteger%2==0:printinteger当我们在IDEL中运行该程序时,结果如下所示:图8:for语句结合range()函数的示例程序运行结果现在解释一下程序的执行过程。首先,for语句开始执行时,range()函数会生成一个由0~9这十个值组成的序列;然后,将序列中的第一个值即0赋给变量integer,并执行循环体。在循环体中,我们将变量integer除以2,如果余数为零,则打印该值;否则跳过打印语句。执行循环体中的选择语句后,序列中的下一个值将被装入变量integer,如果该值是序列中的,那么继续循环,以此类推,直到遍历完序列中的所有元素为止。好了,现在我们开始关注range()函数本身,首先以交互方式查看range(10)的返回值,如下所示:图9