在前面的章节,我们学习了如何在屏幕上输出文本,例如
Hello world
。 那么,如果要输出
3
次
Hello world
,该如何操作呢? 我们可以暴力解决,连写
3
行代码:
print('Hello world')
print('Hello world')
print('Hello world')
但是,如果要输出 1000 次?10000 次呢?显然,这种方式并不理想。
为了更好地执行重复性任务,循环 语句应运而生。 循环语句是程序控制结构中的一种,可以让计算机重复执行任务。 Python 中有两种不同的循环语句,我们分别介绍:
for语句
while语句
for语句
借助 for 循环结构,我们可以这样输出 3 次 Hello world :
>>> for i in range(3):
... print('Hello world')
Hello world
Hello world
Hello world
调用 range(3) 得到一个 可迭代对象 ,该对象每次返回一个数字,分别是 0 、1 、2 。 调用 range(n) 得到的可迭代对象,将包含 0 、1 、2 、… 、n-1 ,共 n 个数。
for 语句则用于遍历可迭代对象,它依次取出对象中的每个元素,并执行循环体。 循环体位于 for 语句下方,但比它多缩进一层。 我们可以在循环体中对遍历到的元素进行处理,例如将元素输出到屏幕:
>>> for i in range(3):
... print(i)
这样一来,不管可迭代对象中包含多少元素,处理逻辑只需编写一遍。 举个例子,如果我们想输出 100 次 Hello world,只需改动一个数字:
>>> for i in range(100):
... print('Hello world')
看到了吧,这就是循环语句的威力!
for语法结构
我们已经对 for 语句有了初步认识,现在回过头来研究它的语法结构:
如图,for 语句包含以下部分:
关键字:for 和 in 关键字,是 for 语句的标志。
元素:每次遍历依次取出的元素,紧跟在 for 关键字后面。
可迭代对象:可用 for 语句遍历,紧跟在 in 关键字后面。
循环体:需重复执行的逻辑,比 for 语句多缩进一层。
while语句
while 语句是另一种循环语句,同样可以用来输出 3 次 Hello world :
>>> i = 0
>>> while i < 3:
... print('Hello world')
... i += 1
Hello world
Hello world
Hello world
那这个程序如何理解呢?我们通过一个等价的流程图进行讲解:
变量 i 来记录输出次数,一开始设定 i = 0 ;
判断 i 是否小于 3 ;
如果 i 小于 3 ,则执行循环体:先输出 Hello world ,再将 i 的值加 1 。
重复执行第 2 到 3 步,直到 i 的值等于 3 ;
如果 i 等于 3 ,结束循环,执行后续语句;
注解:i += 1
是 i = i + 1
的简写。
while语法结构
while 语句的语法结构如下图:
可以看到,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))
这个程序,可以等价于下面的流程图:
可以看到,循环的条件永远为真,所以会不断执行循环体的逻辑,即 输入圆半径 -> 计算圆面积 -> 输出圆面积 ,是一个 无限循环。
现在,用 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 语句来 跳出循环 。
如上图,在循环体里面,如果遇见了 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
当我们输入 -1 后,循环结束了,程序也退出了。
【小菜学Python】系列文章首发于公众号【小菜学编程】,敬请关注: