上周介绍了用if语句进行条件判断,这一次介绍下python中另一种控制语句——循环语句,用它结合之前的知识做一个口算练习器,功能如下:
能够自动产生若干口算练习题目
能够自动判断回答是否正确
能够根据回答记录分数,结束后输出得分
问题分析
有了明确的要求,我们一点一点来思考怎么解决这个问题。第一点是要自动产生若干口算题目,那先想想看怎么产生一道口算题目呢?先从最简单的加法运算出发,自动产生加法题目就是需要自动得到两个加数,有什么办法可以做到呢?我们可以自己随意想两个数字,也可以让计算机帮我们想,逗逗比较懒,就让计算机来帮忙吧。我们之前介绍过一个random模块,它就可以自动产生一个随机数,还记得怎么用吗?
importrandom
num1=random.randint(1,100)第二点要求能够自动判断回答是否正确,这个要怎么做呢?上次介绍的if判断是不是刚好派上用场了,如果就表示回答正确了,否则回答错误。第三点要求能够记录得分,如果我们设置10道题总分100分的话,每道题10分,只要设置一个的变量,一开始没回答的时候是0分,如果答对给它加10分,最后把它输出就好了!上面我们分析了如何产生一道题目,怎么产生若干道题目呢?重复写上面过程?好像也可以,不过如果要设置100道题目,这样就是直接复制也会累死人啊。这个时候就要用到我们的循环语句,它的作用就是让一部分代码自动地重复执行,直到满足我们设置的停止条件。python中有两种循环语句,while循环和for循环,我们用一张图来帮助说明理解:
图中有一个循环结束条件,还有一个重复执行部分,这两个就是循环语句的关键了,下面我们来看看他们怎么用吧。
while循环
while循环结束条件:
重复执行语句
后面的语句这里注意在while循环中有一个明显的循环结束条件,不满足条件的时候执行重复执行语句,满足这个条件后就会执行后面的语句。怎么区分后面的语句和重复执行语句呢?注意在后面有个冒号(:),然后它之后的重复执行语句每一行的前面都会有4个空格,而后面的语句是没有空格的。我们现在就用while实现一个口算练习器:Tips:#号后面的内容是用来解释代码在干什么的,叫做注释,程序运行过程中这部分是不起作用的,在编写代码的时候我们不需要输入
importrandom
n=10# 总共产生n道题
i=# 从第0道题开始产生
score=# 初始得分为0
whilei
# 先产生两个加数num1和num2,并计算正确答案保存在result中
num1=random.randint(1,100)
num2=random.randint(1,100)
result=num1+num2
# 显示题目,并读取回答
print("第%d道题目:%d + %d = ?"%(i+1,num1,num2))
answer=int(input("请输入答案:"))# 读入的格式是字符串,需要转换为int
# 判断答案
ifanswer==result:
score=score+10
print("恭喜你,答对了!")
else:
print("哦哦,答错了,正确答案是:%d"%result)
# 进入下一题
i=i+1
print("你的最终得分是:%d"%score)代码里我们要注意下面几个问题:
这里我们一开始建立了三个变量,其中n变量控制我们一共生成多少道题,这里先设置成10。i变量表示第i道题,从0开始是因为后面的循环结束条件是,i从0开始,到i
显示题目的时候我们用了这么一条语句。我们之前介绍过print()里面用“”双引号包围的部分是字符串,但是这里字符串后面又多了一个%(),这是什么意思呢?这个其实是帮助我们把我们的变量安插道字符串中间,这个是和字符串里面的%d配合起来用的:%d就相当于给变量在字符串中间占了一个座位,然后后面通过%(变量)的方式让变量在输出的时候坐到字符串中间去。如果只有一个变量的话,%后面的括号可以省略,比如
在读取回答的时候我们用了,同样我们介绍过input()是从键盘上读取输入的,但是这里外面又加了一层int()是怎么回事?其实int()就是python里面的整数,这个操作实际是把其他类型的数据转化成整数,那input()读入的是什么呢?是字符串!!!为什么要把字符串转化成整数呢?因为我们要把回答拿来和正确答案比较,就是这句话,这里的result是两个整数的和,自然也是一个整数。
为什么会有这句话?这句话表示我们要进入下一题了。
点击运行,试试看,你能拿多少分呢?
for循环
刚才我们学习了while循环的使用,现在我们看看另一种循环方式for循环怎么用。
for抽屉in柜子:
重复执行语句
后面的语句什么鬼?怎么出来抽屉和柜子了?这里只是为了方便理解做了一个形象的比喻。先拿它和while循环对比一下:
怎么没有循环结束条件,那这个循环什么时候结束呢?现在我们来解释这个抽屉和柜子吧,这个柜子只有抽屉,每次打开一个抽屉,一个一个打开,当所有抽屉都被打开过了,这个循环就结束了。
现在我们知道了用for循环执行之前先要有这么一个“柜子”,这个柜子可以是我们之前介绍过的列表,但是手动产生这么一个列表比较费劲,如果有100道题目的话就需要写一个0-99的列表[0,1,....]这是很难接受的。我们来介绍一种简单的办法:range()函数range()函数用range(n)就可以直接产生一个0到n-1的“柜子”了,这个“柜子”在python中被叫做迭代器。试一下下面这段代码:
print("默认是从0开始产生")
a=range(10)
print(list(a))
print("加入起始数字")
b=range(3,8)
print(list(b))
print("加入间隔")
c=range(2,10,2)
print(list(c))上面我们试了函数的多种使用方法,然后转化成列表(list)在屏幕上输出。
a 变量中range()函数只设置了”结束“值,可以看出range默认产生0到‘结束-1’,间隔为1的一串数
b变量中range()函数设置了“开始”和”结束“,可以产生“开始”带“结束-1”,间隔为1的一串数
c变量中设置了“开始”和”结束“还有“间隔”,那位产生了以2为间隔的偶数序列。
运行结果如下:
默认是从0开始产生
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
加入起始数字
[3, 4, 5, 6, 7]
加入间隔
[2, 4, 6, 8]接下来看看我们怎么用for循环实现的口算练习器吧:
score=
foriinrange(,n):
# 先产生两个加数num1和num2,并计算正确答案保存在result中
num1=random.randint(1,100)
num2=random.randint(1,100)
result=num1+num2
# 显示题目,并读取回答
print("第%d道题目:%d + %d = ?"%(i+1,num1,num2))
answer=int(input("请输入答案:"))# 读入的格式是字符串,需要转换为int
# 判断答案
ifanswer==result:
score=score+10
print("恭喜你,答对了!")
else:
print("哦哦,答错了,正确答案是:%d"%result)
print("你的最终得分是:%d"%score)和while循环基本一样,只不过不需要了。
思考题
到现在我们的口算练习器只实现了一个加法的练习器,那么减法要怎么办呢?减法有一个问题就是要保证被减数比减数大,这个要怎么保证呢?聪明的你快来想想看吧!
领取专属 10元无门槛券
私享最新 技术干货