Chapter 5
5.1 引言
可以使用循环来告诉程序重复执行某些语句。Python提供了两种类型的循环语句:while循环和for循环。while循环是一种条件控制循环,它是根据一个条件的真假来控制的;而for循环是一种计数器控制循环,它会重复特定的次数。
5.2 while循环
当一个条件保持为真时,while循环重复执行语句。while循环的语法是:
while loop-continuation-condition:
# Loop body
Statement(s)
一个循环体单词执行被称作循环的一次迭代(或操作)。每个循环都包含一个loop-continuation-condition(循环继续条件),这是控制循环体执行的布尔表达式。每次都计算它来检测是否应该执行循环体。如果它的计算结果为真,则执行循环体;否则终止整个循环并且程序控制权转到while循环后的语句。
注意:确保loop-continuation-condition最终变成false以便结束循环。一个常见的程序设计错误时涉及==无限循环==(即循环被永远执行)。另外,程序员经常会==错误地让循环比预期多执行一次或少执行一次==。这种错误通常被称作偏离1的误差。
5.2.1 实例研究:猜数字
5.2.2 循环设计策略
编写一个循环时可以考虑以下三步:
确认需要循环的语句。
把这些语句包裹在一个循环。如下所示:
while True: Statements
编写循环继续条件并且添加合适的语句控制循环。
while loop-continuation-condition: Statements Additional-statements-for-controlling-the-loop
5.2.3 实例研究:多道减法题测验
5.2.4 根据用户确认控制循环
如果你想让用户来决定是否还要进行下一次迭代,可以为用户提供一个确认语句。代码如下:
countinueLoop = 'Y'
while continueLoop == 'Y'
# Execute the loop body once
...
# Prompt the user for confirmation
continueLoop = input("Enter Y to continue and N to quit: ")
5.2.5 使用哨兵值控制循环
另一个常见的控制循环的技术是指派一个特殊的输入值,这个值被称作==哨兵值==(sentinel value),它表明输入的结束。使用哨兵值控制循环的这种方式被称作==步哨式控制==(sentinel-controlled loop)。
警告:在循环控制里==不要使用浮点值==来比较相等。因为这些值都是近似的,所以它们会导致不精确的计数值。
5.2.6 输入输出重定向
输入重定向:
可以把数据存储在一个文本文件(例如:input.txt)中,并使用下面的命令来运行这个程序:
python3 python_script.py < input.txt
这样,用户不再需要在运行时从键盘输入数据,而是程序从文件input.txt中获取输入数据。
输出重定向:
输出重定向是把程序运行结果输出到一个文件里而不是输出到屏幕上。输出重定向的命令为:
python3 python_script.py > output.txt
同时使用输入重定向和输出重定向:
python3 python_script.py < input.txt > output.txt
5.3 for循环
Python的for循环通过一个序列中的每个值来进行迭代。我们经常是知道循环体需要被执行多少次,所以,使用一个控制变量统计执行的次数。这种类型的循环被称作计数器控制的循环。通常for循环的语法是:
for var in sequence:
# Loop body
或
for var in range(initialValue, endValue):
# Loop body
sequence里保存data的多个条目,且这些条目按照一个接一个的方式存储。变量var表示这个序列里每个连续值,针对每个值,循环体内的语句都执行一次循环体。
range()
函数有多种形式。你可以使用range(a)
(与range(0, a)
功能一样),也可以使用range(a,b,k)
(k被用作步长值)。序列中的第一个数是a,序列中每一个连续数都会被增加一个步长值k,b是界限值。当k为==正数==时,==序列中的最后一个数必须小于b==。当k为==负数==时,==最后一个数必须大于b==。range()
函数中的数必须为==整数==。(远不同于C++的for循环for(int i = 0; i < 10; i++)
)
5.4 嵌套循环
一个循环可以嵌套到另一个循环里。嵌套循环是由一个外层循环和一个或多个内层循环构成。每次重复外层循环时,内层循环都被重新进入并且重新开始。
5.5 最小化数值错误
在循环继续条件中使用浮点数可能会导致数值错误。
5.6 实例研究
5.6.1 问题:找出最大公约数
5.6.2 问题:预测未来学费
5.6.3 问题:蒙特卡罗模拟
5.7 关键字break和continue
关键字break和continue提供了另一种控制循环的方式。在循环中使用关键字break,可以立即终止循环。在循环中使用关键字continue,可以终止当前的迭代并控制程序转到循环体的最后。换句话说,continue退出一次迭代而break退出整个循环。
所有的循环都可以不用break和continue。如果要简化程序或者使程序更容易读懂,那么使用break和continue就是合适的。但是,过多的break和continue会使整个程序有太多的退出点从而导致程序很难读懂。