Python 循环语句

在前面的章节,我们学习了如何在屏幕上输出文本,例如 Hello world。 那么,如果要输出 3Hello world ,该如何操作呢? 我们可以暴力解决,连写 3 行代码:

print('Hello world')
print('Hello world')
print('Hello world')

但是,如果要输出 1000 次?10000 次呢?显然,这种方式并不理想。

为了更好地执行重复性任务,循环 语句应运而生。 循环语句是程序控制结构中的一种,可以让计算机重复执行任务。 Python 中有两种不同的循环语句,我们分别介绍:

for 语句

借助 for 循环结构,我们可以这样输出 3Hello world

>>> for i in range(3):
...     print('Hello world')
...
Hello world
Hello world
Hello world

调用 range(3) 得到一个 可迭代对象 ,该对象每次返回一个数字,分别是 012 。 调用 range(n) 得到的可迭代对象,将包含 012 、… 、n-1 ,共 n 个数。

for 语句则用于遍历可迭代对象,它依次取出对象中的每个元素,并执行循环体。 循环体位于 for 语句下方,但比它多缩进一层。 我们可以在循环体中对遍历到的元素进行处理,例如将元素输出到屏幕:

>>> for i in range(3):
...     print(i)
...
0
1
2

这样一来,不管可迭代对象中包含多少元素,处理逻辑只需编写一遍。 举个例子,如果我们想输出 100Hello world,只需改动一个数字:

>>> for i in range(100):
...     print('Hello world')

看到了吧,这就是循环语句的威力!

for 语法结构

我们已经对 for 语句有了初步认识,现在回过头来研究它的语法结构:

../_images/41e34f4f5d34e18e426f2a6ad7a36ca5.svg

如图,for 语句包含以下部分:

  • 关键字:forin 关键字,是 for 语句的标志。

  • 元素:每次遍历依次取出的元素,紧跟在 for 关键字后面。

  • 可迭代对象:可用 for 语句遍历,紧跟在 in 关键字后面。

  • 循环体:需重复执行的逻辑,比 for 语句多缩进一层。

while 语句

while 语句是另一种循环语句,同样可以用来输出 3Hello world

>>> i = 0
>>> while i < 3:
...     print('Hello world')
...     i += 1
...
Hello world
Hello world
Hello world

那这个程序如何理解呢?我们通过一个等价的流程图进行讲解:

../_images/f9310ce9f20d9fd387a066eafb35047a.svg
  1. 变量 i 来记录输出次数,一开始设定 i = 0

  2. 判断 i 是否小于 3

  3. 如果 i 小于 3 ,则执行循环体:先输出 Hello world ,再将 i 的值加 1

  4. 重复执行第 23 步,直到 i 的值等于 3 ;

  5. 如果 i 等于 3 ,结束循环,执行后续语句;

注解

i += 1,是 i = i + 1 的简写。

while 语法结构

while 语句的语法结构如下图:

../_images/51c1af3c4734d44b147a86007af2c831.svg

可以看到,while 语句主要由这几部分组成:

  • 关键字:while 关键字,是 while 语句开始的标志;

  • 条件表达式:是否进入循环的条件判断,可求值为

  • 循环体:同 for 语句;

无限循环

还记得我们之前学过的圆面积计算程序吗? 虽然我们将计算程序保存到一个文件了,但是如果要计算多个面积,需要运行多次程序,未免太繁琐了。 我们希望,每次计算完圆的面积后,程序可以再次询问输入圆半径并计算结果。 那么,有没有办法可以做到呢?

答案是肯定的。 实际上,上述场景可以这样建模:重复执行 输入圆半径 -> 计算圆面积 -> 输出圆面积 这一过程。 因此,我们只要将这一过程,放入循环体里即可。 由于我们希望以上步骤不断重复,可以将条件表达式设为 True ,表示永远为真:

# -*- encoding=utf8 -*-

# 循环条件永远为真
while True:

    # 提示用户输入半径,获取用户输入内容,并保存到变量 radius
    radius = input('请输入圆的半径:')

    # 将获取的圆半径从字符串转成浮点数,并更新到变量 radius
    radius = float(radius)

    # 计算圆的面积
    area = 3.14159 * radius ** 2

    # 将计算结果输出到屏幕
    print('半径为{}的圆面积是:{:.2f}'.format(radius, area))

这个程序,可以等价于下面的流程图:

../_images/75336ddb5b74def0a37f7ad0241fb14e.svg

可以看到,循环的条件永远为真,所以会不断执行循环体的逻辑,即 输入圆半径 -> 计算圆面积 -> 输出圆面积 ,是一个 无限循环

现在,用 python 命令执行这个程序:

$ python while-true.py
请输入圆的半径:2
半径为2.0的圆面积是:12.57
请输入圆的半径:4
半径为4.0的圆面积是:50.27
请输入圆的半径:

果然如我们所愿,这样可以轻松应对多个计算了!

跳出循环

当我们愉快地输完最后一个半径数值后,就会发现一个严重的问题:循环无法结束,程序无法退出! 这可怎么办?我们可以按 Ctrl + C ,强行退出程序:

$ python while-true.py
请输入圆的半径:2
半径为2.0的圆面积是:12.57
请输入圆的半径:4
半径为4.0的圆面积是:50.27
请输入圆的半径:^CTraceback (most recent call last):
File "while-true.py", line 5, in <module>
    radius = input('请输入圆的半径:')
KeyboardInterrupt

程序停止了,但是出现一个异常报错 KeyboardInterrupt ,异常我们后续再展开介绍。 显然,强行退出程序,有点暴力,不够优雅。 那么,无限循环该如何退出呢?

我们知道,循环是否结束由条件表达式决定。 由于例子中的循环条件被我们设置为 True,程序会进入不断执行循环体。 因此,我们只能借助 break 语句来 跳出循环

../_images/b4a04100b1e2374707af695a5dfe7679.svg

如上图,在循环体里面,如果遇见了 break 关键字,会跳出循环,继续执行循环后面的语句。 因此,我们可对程序进行修改,如果检查到输入内容是 -1 ,则跳出循环:

# -*- encoding=utf8 -*-

# 循环条件永远为真
while True:

    # 提示用户输入半径,获取用户输入内容,并保存到变量 radius
    radius = input('请输入圆的半径:')

    # 将获取的圆半径从字符串转成浮点数,并更新到变量 radius
    radius = float(radius)

    # 输入 -1,跳出循环
    if radius == -1:
        print('bye')
        break

    # 计算圆的面积
    area = 3.14159 * radius ** 2

    # 将计算结果输出到屏幕
    print('半径为{}的圆面积是:{:.2f}'.format(radius, area))

再次执行程序:

$ python while-break.py
请输入圆的半径:2
半径为2.0的圆面积是:12.57
请输入圆的半径:4
半径为4.0的圆面积是:50.27
请输入圆的半径:-1
bye
$

当我们输入 -1 后,循环结束了,程序也退出了。

附录

订阅更新,获取更多学习资料,请关注我们的 微信公众号

微信搜索:小菜学编程

创作不易,如果觉得我们写得还行,就请我们喝杯咖啡吧😋

微信搜索:小菜学编程