本次主要介绍不固定次数的循环。
for语句虽然有用,但是它通常用于表达具有固定次数的循环结构。如果我们遇到不能固定次数的循环,此时是否继续循环常常依赖一种条件,当条件一旦不满足,循环就可能随时终止,那该如何处理呢?
我们继续上次的练习,改变条件,允许用户不断输入各种整数数据,直到用户输入0为止,并最终输出所有数的总和。
我们再次看看上次的代码,可以发现已有的代码是循环5次:
sum = 0
for i in range(5):
sum = sum + int(input())
print(sum)
现在次数不再固定,变成了用户输入数是否为0。此时就需要一种新的循环语句。
这是一段伪代码,展示了一种可能的方法:
sum = 0
只要 输入的数不等于0:
sum = sum + int(input())
print(sum)
从中可以看出,过去固定次数的for循环变成了一种根据条件来决定是否需要继续的循环,这其实故意展示了while语句的用法:
sum = 0
while 输入的数不等于0:
sum = sum + int(input())
print(sum)
此时while是通过一种条件来决定是否继续循环,如果这个条件为真,即满足,就执行循环里面的语句,否则就退出循环,不再执行其中的语句。因此,while有点像for和if的结合。
但是如何表达“输入的数不等于0”呢?为此我们需要在while循环前增加一个保存第一次输入整数的变量,然后利用这个保存输入的整数变量是否为0来判断是否需要继续循环:
sum = 0
num = int(input())
while num != 0:
sum = sum + int(input())
print(sum)
不过,这个代码有没有问题?控制语句学习到这里,就需要大家多做练习,加强对代码执行过程的理解。运行后你会发现,即使输入0也不会停止。
原因其实也很简单,在循环中,sum不断累加输入的整数,但是这些输入的整数并没有保存到num中,num始终都是第一次输入时的整数,当然再也不会被改变。也就是说,如果你第一次输入不为0,则这个循环永远再也退出不了,我们称之为“死循环”。通常死循环都有问题,我们应当尽量避免。
在PyCharm中,提前强制结束运行的程序,可以点击编辑器右上角在运行按钮旁边的红色的方块即可:
当然解决这个问题的代码也有很多,我们给出一个实现:
sum = 0
num = int(input())
while num != 0:
sum = sum + num
num = int(input())
print(sum)
我们连续输入1、2、3、4和0来观察代码的运行步骤。
输入1,保存到num
while条件为真,num为1不为0
进入循环,累加num到sum中,sum为1
输入2,进入下一轮循环判断条件
while条件为真,num为2不为0
进入循环,累加num到sum中,sum为3
输入3,进入下一轮循环判断条件
while条件为真,num为3不为0
进入循环,累加num到sum中,sum为6
输入4,进入下一轮循环判断条件
while条件为真,num为4不为0
进入循环,累加num到sum中,sum为10
输入0,进入下一轮循环判断条件
while条件为假,num为0
退出循环,输出10
大家也可以使用断点调试的方法,详细上机了解下每一次循环的执行过程和相关变量的数值,以加强对代码运行过程的理解。
但是,一定会有读者认为这段代码不够简洁,毕竟输入语句写了两遍:
能不能只写一遍?如果只写一遍,那唯一可以去除的只能是第一条输入,因为循环中的需要反复被执行。但是如果这样的话,又会导致while语句无法实现判断。为此我们可以先假设num一个非零的数值,比如:
sum = 0
num = 1
while num != 0:
sum = sum + num
num = int(input())
print(sum)
这里的num为1就是为了能在第一次循环判断时能满足条件,只要是不为0的任何数都可以。但是细心的你有无观察出来这个代码有问题呢?
是的,你也会发现sum也会将这个初始的num值,即1先累加。
解决方法也有很多,比如调整语句的次序:
sum = 0
num = 1
while num != 0:
num = int(input())
sum = sum + num
print(sum)
此时进入循环后,首先允许用户输入新的num,因此原有的数值1就会被覆盖,而以后的循环过程也会多增加一次对最后为0的num累加,不过那个num为0,累加没有问题。因此,编程充满技巧,灵活的调整语句次序就是一种方法。
我们看看更为简单的做法,不妨就把while条件写成True,不做判断:
sum = 0
while True:
num = int(input())
sum = sum + num
print(sum)
虽然没有错误,但是这又是死循环了。那么如何实现输入为0就退出的效果呢?
循环中也可以使用条件判断:
sum = 0
while True:
num = int(input())
if num == 0:
break
sum = sum + num
print(sum)
这里的if判断一旦为真,就执行break,break这个运行指令表示退出循环的意思。可见,循环条件永远为真并不一定意味着死循环,只要利用条件判断依然可以退出循环。
我们继续改变练习要求,这次允许用户不断输入各种整数数据,直到用户输入0为止,但是对于输入的负数不参与累加,并最终输出所有数的总和。实现的方法很多,我们分别尝试几种:
方法1:增加条件判断:
sum = 0
while True:
num = int(input())
if num == 0:
break
if num > 0:
sum = sum + num
print(sum)
代码不做解释了,大家可以运行下再理解下。
方法2:使用continue:
sum = 0
while True:
num = int(input())
if num < 0:
continue
if num == 0:
break
sum = sum + num
print(sum)
这里我们故意使用了一种新的运行指令continue,意思是继续,也就是说,不再执行当前循环后面的代码,而直接进入下一轮循环。这里正好表达了继续后续输入的意思。
请注意,从这些练习我们也看出,break和continue其实都不是必须的,大部分情况下我们都可以使用其他方法来取得同样的效果,除非这些运行指令能极大的提高编码效率。
甚至for和while都不是必须的,很多情况下,我们都可以将for循环写成while的形式。比如对于连续输入5个整数数据再相加的练习,while版本为:
最后说明一点,和for一样,while语句也有else,起到同样的循环收尾作用。
上述连续输入5个整数数据再相加的练习也可以写为:
sum = 0
i = 0
while i < 5:
sum = sum + int(input())
i += 1
else:
print(sum)
但是不管是for和while,else后的语句只有在正常退出循环时才能被执行,如果使用了break退出循环,else后的语句并不会被自动执行。
最后留一个问题给大家思考:
sum = 0
while True:
num = int(input())
if num == 0:
break
if num > 0:
sum = sum + num
else:
print(sum)
这段代码为什么没有输出总和?
配套学习资源、慕课视频: