大家好,小编为大家解答python运行无限循环怎么结束的问题。很多人还不知道python停止循环程序的方法,现在让我们一起来看看吧!
在上一篇《手把手陪您学Python》16——循环语句while中,我们学习了while循环的使用方法,并应用while循环,实现了“石头剪刀布”游戏的循环运行。
虽然这个版本已经比第一个版本方便了很多,但还是缺少点游戏的感觉,如果要能实现我们平时所说的“三局两胜”或者“五局三胜”就好了学c+之前要学python吗。那么,今天我们就学习一种新的方法,看看利用这种方法,能否实现多局定胜负的功能。
今天,我们要学习方法叫做循环的终止。这里所说的终止,不是在形成无限循环后,通过点击中止按键形成的“非正常”终止,而是根据程序设计的需要,将终止的要求预先设定在程序中,当程序满足特定条件时,“正常”终止。
循环的终止有两种方法,分别是break和continue。它们不仅适用于while循环语句,在我们下一篇要讲的for循环中,也同样适用。
break的作用是终止整个循环,但也只是终止break所在的最小的循环结构。如果在嵌套循环中,break只存在于其中某一个子循环中,那么终止的就只是这个子循环。如果break存在于较高层级的循环中,那么该循环以及嵌套于该循环内的子循环都会被终止。
continue的作用与break不同,它只终止当次循环中剩余语句的执行。也就是在当次循环中,出现在continue之后的语句都不再执行了。但只要判断条件为真,剩余的循环仍旧执行。
上面的描述说起来可能比较绕,下面会用流程图来表示。但在这之前,还要补充一点才能画出来最清晰的流程图。
因为无论是break还是continue都是要写在执行语句中的,所以理论上每次循环都会运行到这两个终止语句上。如果这样的话,所有的循环都无法运行(break)或者无法完整运行(continue)了。所以,在使用这两个终止语句时,都会将其嵌套在一个if语句中,也就是只有当满足某一个条件时,才会触发break或者continue。
下面就基于这样的思路,给大家分别展示break和continue的流程图。在每一个流程图中,“一个完整的执行语句块”就是之前流程图中的一个执行语句,只不过因为加入了if语句而将其扩展,以便大家能够看到break和continue是如何发挥作用的。
在break流程图中,当判断条件1为真时,就开始进入循环了。在执行语句块中,当判断条件2为假时,执行语句Part 2,然后接着循环。当判断条件2为真时,会执行break,整个循环就结束了。
在continue流程图中,也是当判断条件1为真时,开始进入循环。在执行语句块中,当判断条件2为假时,执行语句Part 2,然后接着循环。当判断条件2为真时,会执行continue,之后循环继续,只有当次循环中的执行语句Part 2不执被行(相当于跳过了执行语句2)。
所以,continue的作用只是删除当此循环中的剩余语句,而break的作用是删除整个循环中的剩余循环。用两个例子做对比,大家就能明白其中的差别了。
In [1]: a = 0
while a <= 10:
a += 1
print("a={}时,".format(a), end='') # 修改print()的end参数,可以实现不换行打印
if a == 6 or a == 9: # a==6或9的时候,循环终止
print("即将运行break,循环终止。")
break
print("没有运行break,循环继续。")
print("循环结束。")
Out[1]: a=1时,没有运行break,循环继续。
a=2时,没有运行break,循环继续。
a=3时,没有运行break,循环继续。
a=4时,没有运行break,循环继续。
a=5时,没有运行break,循环继续。
a=6时,即将运行break,循环终止。
循环结束。
In [2]: a = 0
while a <= 9:
a += 1
print("a={}时,".format(a), end='') # 修改print()的end参数,可以实现不换行打印
if a == 6 or a == 9: # a==6或9的时候,当次循环终止
print("即将运行continue,当次循环终止,不会打印下面那句话,但循环继续。")
continue
print("没有运行continue,会打印这句话,循环继续。")
print("循环结束。")
Out[2]: a=1时,没有运行continue,会打印这句话,循环继续。
a=2时,没有运行continue,会打印这句话,循环继续。
a=3时,没有运行continue,会打印这句话,循环继续。
a=4时,没有运行continue,会打印这句话,循环继续。
a=5时,没有运行continue,会打印这句话,循环继续。
a=6时,即将运行continue,当次循环终止,不会打印下面那句话,但循环继续。
a=7时,没有运行continue,会打印这句话,循环继续。
a=8时,没有运行continue,会打印这句话,循环继续。
a=9时,即将运行continue,当次循环终止,不会打印下面那句话,但循环继续。
a=10时,没有运行continue,会打印这句话,循环继续。
循环结束。
从上面两个列子大家可以比较出来,执行break后,后面的循环都不会运行了,整个程序就结束了。而执行continue后,后面的循环还会继续,只是执行continue的两次循环(a==6和a==9),不会执行continue后面的语句了。
下面,将对上一篇中没有深入说明的一点内容进行一下讲解。
在上一篇的第一个实例中,大家有没有觉得else没有发挥作用?因为只要不是无限循环,else后的语句是一定会被执行的。完全可以不把它作为循环结构中的一部分,把这个执行语句放在循环结构的外面也是一样的,也一定能够被执行。
事实上,在那个实例中,确实是可以不使用else就能达到同样的效果。但else真的是完全没有用么?这肯定是不是的,既然设计了else,就一定有它发挥作用的地方。
比如,在我们刚刚演示break的实例中,如果把最后一句print("循环结束。"),作为else后的执行语句,就不是或有或无的。因为break的作用是终止整个while循环,而else又是while循环中的一部分。如果把print("循环结束。")放在else后面,也就是整个循环结构的里面,就会因为break的运行而被终止,就和放在循环结构的外面不一样了。
In [3]: a = 0
while a <= 10:
a += 1
print("a={}时,".format(a), end='') # 修改print()的end参数,可以实现不换行打印
if a == 6 or a == 9: # a==6或9的时候,循环终止
print("即将运行break,循环终止。")
break
print("没有运行break,循环继续。")
else:
print("循环结束。") # 整个while循环被终止,此行语句就不会被执行了
Out[3]: a=1时,没有运行break,循环继续。
a=2时,没有运行break,循环继续。
a=3时,没有运行break,循环继续。
a=4时,没有运行break,循环继续。
a=5时,没有运行break,循环继续。
a=6时,即将运行break,循环终止。
至此,我们对于循环的终止就介绍完了,下面就来看看能否应用我们今天学到的内容,让我们的游戏实现多局定胜负吧。
我们先来分析一下这个问题。
首先,游戏的目的是实现多局定胜负,也就是先达到某一指定胜利次数的人获得最终胜利。所以总的比赛次数并不是我们关心的,也就是不仅不能通过控制总的循环次数的方式来实现,反而需要让循环无限循环下去(比如一直都是平局),使用其它的方式让循环终止。
既然是先达到某一指定胜利次数的人获得最终胜利,那么这个次数才是我们应该关注的。所以我们要记录、并且将其设定为判断条件的就是这个胜利的次数(平局的次数并不是我们关心的)。
最后,达到指定胜利次数后,程序要做的是终止,而不是继续循环,所以我们应该使用break循环,而不是continue循环。
下面,就按照这个思路,将我们的游戏程序再完善一下。
In [4]: import random # 因为要使用随机函数,需要先导入随机函数库
# 设置游戏胜利的条件,使游戏在某一方胜利次数先达到该次数时,游戏结束
# 当次数设置为2的时候就是我们平时说的“三局两胜”,因为我们平时也不统计平局次数
times = 2
# 比赛开始前,将游戏者胜利次数、电脑胜利次数、打平的次数都设置为零
user_win, computer_win, draw = 0, 0, 0
# 因为设置了break条件,所以可以将while的判断条件设置为永远为真
while 1 == 1:
# 交互式输入过程,使用input()函数
user = input("请输入您要出的拳(石头、剪刀、布):")
# 使用choice()函数,实现在序列中随机选取一个元素,做为电脑出的拳
computer = random.choice(['石头', '剪刀', '布'])
# 以下是程序处理过程,直接按照游戏规则进行判断,根据判断结果进行输出
# 把所有游戏者赢的情况列举出来,任何一种情况出现,就输出游戏者胜利
if (user == '石头' and computer == '剪刀') or (user == '剪刀' and computer == '布')\
or (user == '布' and computer == '石头'):
user_win += 1 # 游戏者胜利次数累加
print("您出的是:{},电脑出的是:{}。恭喜,您赢了!".format(user, computer))
print("您总共赢了{}局,输了{}局,平了{}局。".format(user_win, computer_win, draw)) # 记录游戏胜负次数
# 打平的情况最容易描述,所以作为一个判断条件
elif user == computer:
draw += 1 # 打平次数累加
print("您出的是:{},电脑出的是:{}。打平了!".format(user, computer))
print("您总共赢了{}局,输了{}局,平了{}局。".format(user_win, computer_win, draw)) # 记录游戏胜负次数
# 其它情况就是游戏者输的情况,因为描述比较复杂,放在其它情况里,就不用写很复杂的判断条件了
else:
computer_win += 1 # 电脑胜利次数累加
print("您出的是:{},电脑出的是:{}。很遗憾,您输了!".format(user, computer))
print("您总共赢了{}局,输了{}局,平了{}局。".format(user_win, computer_win, draw)) # 记录游戏胜负次数
# 为了使交互部分更加友好,对每次的输入输出内容进行分行
print("=" * 40)
# 判断是否达到游戏结束的条件,如果达到了,游戏终止,否则游戏继续
if user_win == times or computer_win == times:
break
# 使用一个三元运算,判断游戏的最终结果的输出内容
winner = "恭喜您,您取得了最终的胜利!" if user_win == times else "很遗憾,电脑取得了最终的胜利!"
# 打印游戏的最终结果,因为在执行语句块中包括break,所以不能使用else
print('\n', '*' * 28, sep='') # 隔行输出结果,同时修改print的sep参数
print('*', winner, '*')
print('*' * 28)
Out[4]: 请输入您要出的拳(石头、剪刀、布):石头
您出的是:石头,电脑出的是:剪刀。恭喜,您赢了!
您总共赢了1局,输了0局,平了0局。
========================================
Out[5]: 请输入您要出的拳(石头、剪刀、布):剪刀
您出的是:剪刀,电脑出的是:剪刀。打平了!
您总共赢了1局,输了0局,平了1局。
========================================
Out[6]: 请输入您要出的拳(石头、剪刀、布):布
您出的是:布,电脑出的是:布。打平了!
您总共赢了1局,输了0局,平了2局。
========================================
Out[7]: 请输入您要出的拳(石头、剪刀、布):石头
您出的是:石头,电脑出的是:剪刀。恭喜,您赢了!
您总共赢了2局,输了0局,平了2局。
========================================
****************************
* 恭喜您,您取得了最终的胜利!*
****************************
在这个3.0版本中,我们对程序进行了如下改进:
1、增加每局游戏结果的统计功能,并进行输出;
2、设置游戏胜利的条件,当游戏某一方达到指定胜利次数时,游戏结束;
3、输出比赛的最终结果,并使用特殊符号进行修饰。
最后还是把这次更新的截屏展示给大家,希望有助于大家的学习。
经过两个版本的改进,我们“石头剪刀布”游戏的程序已经具有一定的“竞技价值”了,不过其中还是存在一些问题的。比如,我们如果不输入石头、剪刀、布之中的一个,而输入其它内容,虽然程序不会报错,但会被认为是除了胜利和平局以外的情况,所以都会被判定为电脑胜利。
那么,如何该能改掉这一bug呢?其实只要利用while语句,用两行代码就能够搞定,大家可以想想如何去做。这一更新内容,已经作为游戏的V3.1版本分享在了网盘上。大家可以通过关注公众号,回复关键词获取“石头剪刀布”游戏的最新代码。
除此之外,大家还可以尝试将电脑换成另外一个游戏者,实现两人的竞技。更难一点的可以再挑战一下三人进行的“石头剪刀布”游戏,又应该如何判定结果?
总之,围绕这个游戏,有很多我们可以自己去开发的功能。也正是通过这种不断的尝试和改进,可以对我们所学习的内容加以巩固,同时提高我们思考算法的能力。
以上就是有关循环终止方法的介绍和应用了,下一篇文章中,我们将要介绍另外一个循环语句——for循环,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
欢迎扫描下方二维码,关注“亦说Python”公众号,阅读《手把手陪您学Python》系列文章的其他篇目,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手17”,即可免费下载本篇文章所用示例语句。