Python程序设计:人工智能案例实践
上QQ阅读APP看书,第一时间看更新

3.9 边界值控制的迭代

现在,对求班级平均分问题进行扩展。以下是需求声明:

开发一个计算班级平均分的程序,该程序每次执行时可以处理任意数量的成绩。

需求声明没有说明成绩是什么或者是多少,所以我们会让用户自行输入成绩。该程序要处理任意数量的成绩。用户每次输入一个成绩,直到输入所有成绩,然后输入边界值(也称为信号值、虚拟值或标记值)以表示不再需要输入成绩。

应用边界值控制的迭代

下面的脚本使用边界值控制的迭代解决求班级平均分问题。需要注意的是,脚本中应该包含测试是否除以零的语句。如果漏检,可能会出现致命的逻辑错误。在第9章中,我们编写了能够识别此类异常并采取适当措施的程序。

边界值控制的迭代的程序逻辑

在边界值控制的迭代中,程序在到达while语句之前读取第一个值(第9行)。第9行输入的值确定程序的控制流程是否应该进入while套件(第12~14行)。如果第11行中的条件为False,表明用户直接输入了边界值(-1)而没有输入任何grade,因此套件不会被执行。如果条件为True,则执行套件,将grade加到total中并使grade_counter加1。

接下来,第14行从用户输入得到下一个grade,并使用最新输入的grade再次测试条件(第11行)。在程序测试while条件之前,需要先输入grade的值,因此可以先判定刚刚输入的值是否为边界值,然后再决定是否将该值作为成绩处理。

当输入边界值-1时,循环终止,程序不会将-1加到total中。在上面的边界值控制的循环中,由于边界值由用户输入,因此每个提示信息(第9行和第14行)都应该提示用户边界值是多少。

使用两位小数格式化班级平均分

这个例子将班级平均分格式化为保留小数点后两位。在f字符串中,可以选择在替换文本表达式之后跟一个冒号(:)和一个格式说明符,用来描述如何格式化替换文本。格式说明符“.2f”(第19行)将平均值格式化为浮点数(f)、保留小数点后两位(.2)。在这个例子中,成绩的总和是257,当除以3时,会得到85.666666666...。用“.2f”格式化平均值会令其四舍五入到百分位,得到替换文本85.67。如果平均值的小数点的右侧只有一位小数,则会在末尾补0(例如,85.50)。第8章将会对字符串格式化的功能进行更加深入的讨论。