python停止循环程序的方法,python怎么终止无限循环

大家好,小编为大家解答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》1——为什么要学Python?

《手把手陪您学Python》2——Python的安装

《手把手陪您学Python》3——PyCharm的安装和配置

《手把手陪您学Python》4——Hello World!

《手把手陪您学Python》5——Jupyter Notebook

《手把手陪您学Python》6——字符串的标识

《手把手陪您学Python》7——字符串的索引

《手把手陪您学Python》8——字符串的切片

《手把手陪您学Python》9——字符串的运算

《手把手陪您学Python》10——字符串的函数

《手把手陪您学Python》11——字符串的格式化输出

《手把手陪您学Python》12——数字

《手把手陪您学Python》13——运算

《手把手陪您学Python》14——交互式输入

《手把手陪您学Python》15——判断语句if

《手把手陪您学Python》16——循环语句while

For Fans:关注“亦说Python”公众号,回复“手17”,即可免费下载本篇文章所用示例语句。

亦说Python——Python爱好者的学习分享园地

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值