1. 概述
今天我们介绍循环语句,和条件判断一样,我们从流程图开始看起。首先看一下学习计划列表,粗体为已学,斜体为新增或修改内容。计算机编程的原理简要介绍
集成开发环境PyCharm
变量名、数字、字符串、列表
句式、注释
输入和输出
条件判断语句
循环语句
各类数据结构
函数
模块和引入
2. 流程图
在正式介绍循环语句前,我们需要看一下背后的逻辑,最直观的还是流程图,用draw.io可以画。我们在条件判断中举例了一道题,是要求老师输入某一学生的各科成绩,最后按照各科比重算总成绩然后判断等第。不过在该程序中,我们只能一次计算一个学生的等第,如果我们有一个班级的学生,我们估计只能不停地手动一遍一遍执行程序。那么如果我们要一次输入并计算一堆学生的成绩呢?
假设我们已有一个班级的学生列表,
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
我们想要该程序能在屏幕上按列表顺序显示学生名字,每次显示一个,等老师输入成绩后,判断该学生是否满90分合格(感觉在考驾照),并在屏幕上显示结果。
我们首先弄清楚背后的逻辑,首先我们给的列表可能是个空列表,意思是这个班是个空班,教务主任可以不用花心思了:开始程序;
我们看的列表是否已到头,到头的话,结束程序,否则执行第3步;
显示列表中下一个学生的名字;
要求老师输入成绩;
判断是否合格,并输出成绩;
回到第2步;
流程图如下:
本程序关键是在于判断列表是否到头,也就是循环语句。循环语句本质就是不停地进行条件判断,Python提供了两种循环语句:while和for,各有各的优势,两者可以相互转换。注意Python没有do...while语句,不过我们可以用其他方式实现do...while,这我们以后会讲到。
3. while循环语句
我们从while循环语句开始,可以比较好地和if条件判断的知识衔接。while后面直接加上一个条件,如果满足条件,则运行while循环中的代码,进行完后,再回到while这一行继续判断,如果满足条件,再运行,返回判断,直到条件不满足的那一刻。
基本的循环要有以下组成部分:控制变量的初始化,
循环的条件判断,
控制变量的更新。
初始化循环控制的变量,目的是能够有个开始的点,接下来就是循环,循环的本质就是不停地进行同一条件判断,最后我们要在循环中更新变量,以便于循环能更新并结束。
比如我们想要显示2的0次方到20次方,开始点是2的0次方:
# Initialize the control variable, which is exponent
exponent = 0
# Loop, while the power number is not 20 yet, print out 2 to the exponent
while exponent <= 20:
print(2 ** exponent)
# update the control variable
exponent = exponent + 1
次方用的是**,最后结果是:
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
从2的0次到2的20次,21个结果一行一行显示,如果不用循环,我们则要写一堆重复代码:
print(2 ** 0)
print(2 ** 1)
...
print(2 ** 20)
可以看到循环其实也简化了我们的程序,无需重复性写代码。
4. 用while循环解决上面的流程图
我们可以使用列表的下标和长度来实现列表的循环。下标代表我们本次循环查看的数据,是控制用的变量,长度代表一共有几个数据。
# Given a list of students' name
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
# Initialize the counter which indicates index
ind = 0
# Length of the list indicates the number of students
total = len(student_list)
# Loop through the list
while ind < total:
# Get the current student's name
# We will look at this specific student at this loop
student = student_list[ind]
# Determine if the student passes the course
if int(input("Please type the score for {}: ".format(student))) >= 90:
print("PASSED: {}.".format(student))
else:
print("FAILED: {}.".format(student))
# Increase the counter by 1 and prepare for the next student
ind = ind + 1
该程序会从下标为0的学生Alice开始问分数、决定成绩,直到问到这个列表结束,也就是最后一个询问的对象是Gary。
这里我们是怎么确保循环会照顾到每一个学生而且不多不少正好从第一个问到最后一个呢?我们来一句一句分析这个代码,已经看懂以上例子的同学可以跳过下面的部分。
# Given a list of students' name
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
这个是我们手上有的学生清单,也就是学校给的(最怕校董会编程),复制粘贴进代码就行了。
ind = 0
total = len(student_list)
这两行是关键,ind=0作为起点,证明我们首先会看列表中下标为0的元素,通过len函数我们可以数处一共几个元素,在这个例子中7个,
while ind < total:
student = student_list[ind]
if int(input("Please type the score for {}: ".format(student))) >= 90:
print("PASSED: {}.".format(student))
else:
print("FAILED: {}.".format(student))
ind = ind + 1
循环语句,先看这段的第一行和最后一行,也就是“while ind < total:”和”ind = ind + 1“。当ind比total数值小的时候,也就是我们下标比总数小的时候,判断成绩,判断完后ind增加1,跳回while这一行再进行判断。
当ind为0的时候,我们给Alice等第,给分完Alice,我们的ind增加1,变为1,跳回while语句,此时ind为1小于total的7,判断为True,执行循环内代码,也就是给Bob判成绩。然后ind再加1,while条件判断,2小于7,从列表取名字,Cat,输分给等第……以此类推。
最后,我们看完Frank,此时ind为5,更新ind,ind的新值为6;跳回while,判断6小于7,正确,此时学生为Gary,输分给等第,ind更新,新值为7;跳回while,判断7小于7,错误,循环结束。
我们可以看到在循环结束后,我们正好停在Gary之后,因为下标从0开始,7个元素的列表中最后一个元素的下标为6,也就是说,列表最大下标是肯定小于列表元素总数量的,这里用小于号可以确保执行完Gary(下标6)之后,下标7不再满足小于7的条件,最后判断while ind < total为False,终止循环。
在本段程序中,我们可以看到,while下面的循环内代码被执行了7次,而while被判断了8次,主要是因为while的条件判断为正确7次,所以下面代码执行7次,最后再加上1次判断为误,用于终止循环,while那一行总共被判断8次。
这个代码有一句:
if int(input("Please type the score for {}: ".format(student))) >= 90:
其实它就是我们输入的值转换为整数后是否90+,其实和以前我们的写法没差别:
score = int(input("Please type the score for {}: ".format(student)))
if score >= 90:
我只是把两句合成一句用了。
当while运行结束后,也就是最后一次为False的判断后,我们则直接跳过while所管理的语句,执行之后的代码,如果我们像如下在最后添加一句和while缩进程度相等的print语句,最后当显示完所有学生等第、循环结束后,才会开始执行最后的print。
while ind < total:
...
ind = ind + 1
print('Goodbye!')
接下来继续讲循环语句,循环语句主要涵盖while、for、break、continue以及赋值运算符,循环语句使用方法各种各样,循环的特色在于条件判断的设置需要结合天时地利,我在这里先只介绍最基本的,毕竟有句古话说得好,只有拼命努力才能看起来毫不费力,打好基础才能游刃有余。
感觉我的教程有点鸡汤化了。