在上一篇《手把手陪您学Python》15——判断语句if中,我们学习了if语句的各种结构和知识点。同时,运用if语句和之前学习的知识,编写了我们真正意义上的第一个Python程序——“石头剪刀布”游戏。但在这个游戏中,还有不少需要改进的地方。今天,我们就在介绍循环语句while后,继续完善这个游戏。
while语句的结构与if...else...非常类似,只不过是将关键词if改成了while。最显著的差别是在if语句中,当判断条件为真时,执行语句1只会运行一次。而在while语句中,当判断条件为真时,执行语句1会循环运行,直到判断条件为假时才会停止,并执行语句2。其语句结构如下所示:
while 判断条件:
执行语句1
else:
执行语句2
翻译成自然语言,可以表达为:
如果判断条件为真,就执行语句1,之后再对判断条件进行判断,如果判断条件为真,再次执行语句1,如此循环,直到判断条件为假,执行语句2。
使用流程图来表示,与if语句的流程图的区别是增加了一条从执行语句1指向判断条件的箭头。同时,只有当判断条件为假的时候,才执行语句2,整个while语句也才会结束,否则将循环进行条件判断和执行语句1。
从上面的介绍大家可以看出来,while虽然是一个循环语句,但也是根据判断条件执行指令的,因此它与if语句有很多相似之处。
在判断条件方面,while语句与if语句完全相同,都是以输出布尔值结果的运算为主,最常用的也是比较运算。
在格式要求方面,while语句也与if语句一样,都是在关键词(while、else)所在的语句行末尾有一个“:”,“:”之后的执行语句要缩进,代表下一层级的语句。
以一个简单的实例,看一下while语句的运行规则:
In [1]: a = 1
while a <= 5:
print("a={},满足a <= 5的判断条件,继续循环运行。".format(a))
a += 1 # 赋值运算
else:
print("a={},不满足a <= 5的判断条件,循环终止。".format(a))
Out[1]: a=1,满足a <= 5的判断条件,继续循环运行。
a=2,满足a <= 5的判断条件,继续循环运行。
a=3,满足a <= 5的判断条件,继续循环运行。
a=4,满足a <= 5的判断条件,继续循环运行。
a=5,满足a <= 5的判断条件,继续循环运行。
a=6,不满足a <= 5的判断条件,循环终止。
关于while语句,还有如下几个知识点需要介绍:
1、常用结构
虽然上面给大家展示的是while...else...结构,但最常用的while结构是将else部分省略,只保留while部分。此时的语句结构就变成了:
while 判断条件:
执行语句
只要判断条件为真,就循环执行语句,直到判断条件为假,终止循环并结束。
while语句的这种常用结构,起到的主要作用就是循环执行某一程序。讲到这,大家是不是就想到了我们上一篇中编写的游戏程序,如果要让游戏循环运行,只要使用这个while语句就可以了。
由于在判断条件为真时,程序会循环运行无法终止,因此我们在使用while语句时,都会设计一个“计数”变量。通过总数以及每次循环后对变量的重新赋值,实现对运行总次数的控制,避免程序出现无限循环的情况。
In [2]: a = 5 # 运行的总次数
while a >= 1:
print("Hello World!")
a -= 1 # 改变判断条件中变量的值,避免无限循环
Out[2]: Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
2、无限循环
无限循环也叫死循环,是在程序编写的过程中,有意或者无意地将判断条件设置成永远为真的情况下产生的。
比如在上面的示例中,如果判断条件被误写成了a <= 5,程序就会无止境地运行下去了(因为a永远小于等于5)。终止无限循环的方法是点击运行程序中的“■”(Jupyter Notebook在菜单栏上,PyCharm在控制台上)。
In [3]: a = 5
while a <= 5:
print("Hello World!")
a -= 1
Out[3]: Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
...
当然,无限循环也并非一无是处,比如在一些服务器程序中,就要将程序设计成无限循环供用户持续使用。除非程序出现错误或者更新,否则是不需要终止的。
要想实现无限循环非常简单,对于上面的例子,也不需要设置“计数”变量了,只要将判断条件写成1 == 1就行了,大家可以试一下。
3、语句嵌套
对于while语句的嵌套来说,也不需要把它看得多么复杂,只要把嵌套的while语句当做一段执行语句本身就可以了。
但即使如此,也不建议大家对while语句进行嵌套。因为单单一层的while语句就很容易形成无限循环了,如果嵌套多个while语句,特别是在变量非常复杂的情况下,就更容易形成无限循环,而且很难查找到原因。
所以,只要让while语句起到让程序按照某一条件重复运行的作用就可以了。
以上就是对while语句的介绍,下面就用我们今天学到的知识,把“石头剪刀布”的程序完善一下。
大家可以通过右键之前保存的文件,点击Copy再点击Paste,实现文件的快速复制,并通过弹出的重命名窗口,给我们的新版游戏程序重命名。
在2.0版本中,我们将增加游戏的循环功能,使游戏能够按照指定的次数连续运行。
In [4]: import random # 因为要使用随机函数,需要先导入随机函数库
# 设置游戏的总次数,也可以使用input()函数通过输入的方法实现
times = 5
# 只使用while可以重复运行程序的功能
while times >= 1:
# 总次数、判断条件和重新赋值的公式,共同实现了对游戏总次数的控制,缺一不可
times -= 1
# 交互式输入过程,使用input()函数
user = input("请输入您要出的拳(石头、剪刀、布):")
# 使用choice()函数,实现在序列中随机选取一个元素,做为电脑出的拳
computer = random.choice(['石头', '剪刀', '布'])
# 以下是程序处理过程,直接按照游戏规则进行判断,根据判断结果进行输出
# 把所有游戏者赢的情况列举出来,任何一种情况出现,就输出游戏者胜利
if (user == '石头' and computer == '剪刀') or (user == '剪刀' and computer == '布')\
or (user == '布' and computer == '石头'):
print("您出的是:{},电脑出的是:{}。恭喜,您赢了!".format(user, computer))
# 打平的情况最容易描述,所以作为一个判断条件
elif user == computer:
print("您出的是:{},电脑出的是:{}。打平了!".format(user, computer))
# 其它情况就是游戏者输的情况,因为描述比较复杂,放在其它情况里,就不用写很复杂的判断条件了
else:
print("您出的是:{},电脑出的是:{}。很遗憾,您输了!".format(user, computer))
# 游戏结束的提示
print("游戏结束,如果还想继续,请重新运行程序。")
Out[4]: 请输入您要出的拳(石头、剪刀、布):石头
您出的是:石头,电脑出的是:布。很遗憾,您输了!
Out[5]: 请输入您要出的拳(石头、剪刀、布):剪刀
您出的是:剪刀,电脑出的是:剪刀。打平了!
Out[6]: 请输入您要出的拳(石头、剪刀、布):布
您出的是:布,电脑出的是:石头。恭喜,您赢了!
Out[7]: 请输入您要出的拳(石头、剪刀、布):石头
您出的是:石头,电脑出的是:石头。打平了!
Out[8]: 请输入您要出的拳(石头、剪刀、布):剪刀
您出的是:剪刀,电脑出的是:剪刀。打平了!
游戏结束,如果还想继续,请重新运行程序。
最后,再把PyCharm的截屏展示给大家,因为以后的程序会越来越长,可能就不每次都截屏展示了。大家可以看程序的代码,或者关注公众号回复关键词,免费下载文章中的相关文件和代码。
以上就是有关while语句的介绍了,虽然while帮我们实现了游戏的循环运行,但在日常编程中,还是不太推荐使用,一是稍不小心就会出现无限循环,二是while语句的大部分功能,使用我们后面要介绍的另外一个循环语句for也能够实现。
在下一篇中,我们将会学习一种非常重要的循环语句控制方法——循环的终止。应用该方法,可以使循环语句实现更加强大的功能,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
欢迎扫描下方二维码,关注“亦说Python”公众号,阅读《手把手陪您学Python》系列文章的其他篇目,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手16”,即可免费下载本篇文章所用示例语句。