Python从入门到精通
上QQ阅读APP看书,第一时间看更新

4.3 循环语句

日常生活中很多问题都无法一次解决,如盖楼,所有高楼都是一层一层建起来的。还有,有些事物必须周而复始地运转才能保证其存在的意义,例如,公交车、地铁等交通工具必须每天在同样的时间往返于始发站和终点站之间。类似这样的反复做同一件事的情况,称为循环。循环主要有两种类型:

 重复一定次数的循环,称为计次循环,如for循环。

 一直重复,直到条件不满足时才结束的循环,称为条件循环。只要条件为真,这种循环会一直持续下去,如while循环。下面将对这两种类型的循环分别进行介绍。

说明

在其他语言(如C、C++、Java等)中,条件循环还包括do…while循环。但是,在Python中没有do…while循环。

4.3.1 while循环

while循环是通过一个条件来控制是否要继续反复执行循环体中的语句。

语法如下:

    while 条件表达式:
        循环体

说明

循环体是指一组被重复执行的语句。

图4.15 while循环语句的执行流程图

当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while循环语句的执行流程如图4.15所示。

我们以现实生活中的例子来理解while循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑圈。要求听到老师吹的哨子声时就停下来。同学们每跑一圈,可能会请求一次老师吹哨子。如果老师吹哨子,则停下来,即循环结束。否则继续跑步,即执行循环。

下面通过一个具体的实例来解决4.1节给出的应用场景中的第二个要素:依次尝试符合条件的数。此时,需要用到第一个要素确定是否符合条件。

【例4.5】 解决黄蓉难倒瑛姑的数学题(while循环版)。(实例位置:资源包\TM\sl\04\05)

使用while循环语句实现从1开始依次尝试符合条件的数,直到找到符合条件的数时,才退出循环。具体的实现方法是:首先定义一个用于计数的变量number和一个作为循环条件的变量none(默认值为真),然后编写while循环语句,在循环体中,将变量number的值加1,并且判断number的值是否符合条件,当符合条件时,将变量none设置为假,从而退出循环。具体代码如下:

运行程序,将显示如图4.16所示的效果。从图4.16中可以看出第一个符合条件的数是23,这就是黄蓉想要的答案。

图4.16 解决黄蓉难倒瑛姑的数学题(while循环版)

注意

在使用while循环语句时,一定不要忘记添加将循环条件改变为False的代码(例如实例4.5中的第8行代码一定不能少),否则,将产生死循环。

4.3.2 for循环

for循环是一个计次循环,一般应用在循环次数已知的情况下。通常适用于枚举或遍历序列,以及迭代对象中的元素。

语法如下:

    for 迭代变量 in 对象:
       循环体

其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组被重复执行的语句。

for循环语句的执行流程如图4.17所示。

图4.17 for循环语句的执行流程图

我们以现实生活中的例子来理解for循环的执行流程。在体育课上,体育老师要求同学们排队进行踢毽球测试,每个同学一次机会,毽球落地则换另一个同学,直到全部同学都测试完毕,即循环结束。

1.进行数值循环

在使用for循环时,最基本的应用就是进行数值循环。例如,想要实现从1到100的累加,可以通过下面的代码实现。

在上面的代码中使用了range()函数,该函数是Python内置的函数,用于生成一系列连续的整数,多用于for循环语句中。其语法格式如下:

    range(start,end,step)

各参数说明如下:

 start:用于指定计数的起始值,可以省略,如果省略则从0开始。

 end:用于指定计数的结束值(但不包括该值,如range(7),则得到的值为0~6,不包括7),不能省略。当range()函数中只有一个参数时,即表示指定计数的结束值。

 step:用于指定步长,即两个数之间的间隔,可以省略,如果省略则表示步长为1。例如,range(1,7)将得到1、2、3、4、5、6。

注意

在使用range()函数时,如果只有一个参数,那么表示指定的是end;如果有两个参数,则表示指定的是start和end;只有3个参数都存在时,最后一个才表示步长。

例如,使用下面的for循环语句,将输出10以内的所有奇数。

01  for i in range(1,10,2):
02      print(i,end = ' ')

得到的结果如下:

    1 3 5 7 9

说明

在Python 2.x中,如果想让print语句输出的内容在一行上显示,可以在后面加上逗号(如print i,),但是在Ptyhon 3.x中,使用print()函数时,不能直接加逗号,需要加上“,end = '分隔符'”,在上面的代码中使用的分隔符为一个空格。

说明

在Python 2.x中,除提供range()函数外,还提供了一个xrange()函数,用于解决range()函数会不经意间耗掉所有可用内存的问题,而在Python 3.x中已经更名为range()函数,并且删除了老式xrange()函数。

下面通过一个具体的实例来演示使用for循环语句进行数值循环的具体应用。

【例4.6】 解决黄蓉难倒瑛姑的数学题(for循环版)。(实例位置:资源包\TM\sl\04\06)

使用for循环语句实现从1循环到100(不包含100),并且记录符合黄蓉要求的数。具体的实现方法是:应用for循环语句从1迭代到100,在循环体中,判断迭代变量number是否符合“三三数之剩二,五五数之剩三,七七数之剩二”的要求,如果符合则应用print()函数输出,否则继续循环。具体代码如下:

运行程序,将显示和实例4.5一样的效果,也是如图4.16所示的效果。

常见错误:for语句后面未加冒号。例如下面的代码:

运行后,将产生如图4.18所示的语法错误。解决的方法是在第一行代码的结尾处添加一个冒号。

图4.18 for循环语句的常见错误

2.遍历字符串

使用for循环语句除了可以循环数值,还可以逐个遍历字符串,例如,下面的代码可以将横向显示的字符串转换为纵向显示。

上面代码的运行结果如图4.19所示。

图4.19 将字符串转换为纵向显示

说明

for循环语句还可以用于迭代(遍历)列表、元组、集合和字典等,具体的方法将在第5章介绍。

4.3.3 循环嵌套

在Python中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。在Python中,for循环和while循环都可以进行循环嵌套。

例如,在while循环中套用while循环的格式如下:

在for循环中套用for循环的格式如下:

    for 迭代变量1 in 对象1:
       for 迭代变量2 in 对象2:
        循环体2
    循环体1

在while循环中套用for循环的格式如下:

    while 条件表达式:
        for 迭代变量 in 对象:
            循环体2
        循环体1

在for循环中套用while循环的格式如下:

    for 迭代变量 in 对象:
        while 条件表达式:
            循环体2
        循环体1

除了上面介绍的4种嵌套格式外,还可以实现更多层的嵌套,方法与上面的类似,这里就不再一一给出了。

【例4.7】 打印九九乘法表。(实例位置:资源包\TM\sl\04\07)

使用嵌套的for循环打印九九乘法表,代码如下:

上面的代码使用了双层for循环,第一个循环可以看成是对乘法表的行数的控制,同时也是每个乘法公式的第二个因子;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是在第一个循环的基础上建立的。

程序运行结果如图4.20所示。

图4.20 使用循环嵌套打印九九乘法表