前面两个章节,我们着重对两类循环及循环嵌套进行了介绍。这一章节,我们继续深入探讨循环的一些控制语句。
一、break语句
设想这样一个例子,有一个成绩列表,每个分数都是小于等于100的数,唯独有一个学生答题太好了,老师奖励他10分,他的成绩最终大于100,那么如何找到这个分数呢?
利用上面循环和判断的嵌套,可以写成:
points = [68, 89, 100, 99, 105, 20, 6]for p in points:if p > 100:print(p)
然而,我们大胆极端一下,如果成绩单上有100万个成绩,而105那个成绩却在前200个数值里就出现了,那后面的循环就是单纯浪费计算资源,因此我们会想在找到105这个分数时,直接结束循环。这里就要引入“break”语句了,这个语句用于立即终止当前“break”所属的循环,无论后面是否还有其他计算(代码执行逻辑位于break之后的代码)。因此,上述代码变为:
points = [68, 89, 100, 99, 105, 20, 6]for p in points:if p > 100:print(p)break
假设老师想知道花了几次遍历找到这个分数,那么代码就可以写作:
points = [68, 89, 100, 99, 105, 20, 6]count = 1for p in points:if p > 100:print(p)breakcount += 1print(count)
这里注意到,由于“count += 1”的操作是在if之后,if与“count += 1”同级,而if中的子级代码先运行,因而“count += 1”逻辑上在break之后。因此,当触发break语句时,循环立即终止,“count += 1”的计算也被跳过,程序直接跳转至运行“print(count)”。
如果有很多科目的成绩列表,我们想找出每个科目的异常分,那么代码写作:
points_dict = {"chinese": [68, 89, 100, 99, 105, 20, 6],"math": [99, 100, 109, 89, 68, 100, 100],"english": [5, 19, 32, 60, 110, 80, 75]}for course, points in points_dict.items():count = 1for point in points:if point > 100:print("Found!")breakcount += 1print("Found point " + str(point) + " in " + course + \" at " + str(count) + " times")# Output:# Found!# Found point 105 in chinese at 5 times# Found!# Found point 100 in math at 3 times# Found!# Found point 110 in english at 5 times
代码行末尾的“\”表示当前代码行未编写结束,转接下一行内容。从这个嵌套循环的例子可以看出,当触发break后,只有里层的循环结束,外层循环的内容依然继续运行。
二、continue语句
前面介绍了break,下面我们介绍一个比较简单的循环语句continue。这个语句用于结束当前一轮循环,被触发后,逻辑上位于continue的代码在本轮循环不执行,直接开始下一轮循环。
例如,老师想查看一下成绩单中的奇数分数,那么可以写成:
points = [13, 46, 98, 65, 82, 52]for p in points:if p % 2 == 0:continueprint(p, end=" ")# Output: 13 65
随着continue触发,位于其之后的print在本轮循环不发生执行。
很多时候,continue语句可以转换为if-else,例如上面的代码可以写成:
points = [13, 46, 98, 65, 82, 52]for p in points:if p % 2: # 1 表示 Trueprint(p, end=" ")else:pass # pass表示此处无待执行代码,用于保持代码结构
然而这些转换很可能导致代码可读性变差,尤其是当continue需要跳过很多代码时。因此,适当的使用continue会更加有助于代码的调试和检查。
三、循环里的else
可能有的读者会觉得else与循环好像并不搭,因为确实是这样的。在大多数高级语言并没有提供循环对else的支持,而Python提供的此操作用于去处理循环正常结束(没有被break语句中断)的情况。
例如,要找一个数字列表里有没有6:
numbers_1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]for num in numbers_1:if num == 6:print("Found")breakelse:print("Not Found")# Output: Foundnumbers_2 = [9, 8, 7, 5, 4, 3, 2, 1, 0]for num in numbers_2:if num == 6:print("Found")breakelse:print("Not Found")# Output: Not Found
由于这种写法个人觉得有点另类(有些人会觉得比较elegant),因此个人更加偏向于用标志变量的方法:
numbers_1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]flag = Falsefor num in numbers_1:if num == 6:flag = Truebreakif flag:print("Found")else:print("Not Found")
这种方法可能会产生冗余变量和代码行,因此是否在循环时使用else根据读者的个人喜好即可。
往期回顾: