在上一篇《手把手陪您学Python》14——交互式输入中,我们了解了使用input()函数与计算机实现交互输入的方法,同时学习了如何使用PyCharm编写和运行程序。
另外,在上一篇的文末还给大家留了一道思考题,就是如何在提示内容显示完成后,换行让使用者进行输入。答案是不是很简单,只要在提示内容字符串的最后加上换行符“\n”就可以了。
从本篇开始,将与大家一起,在学习控制流语句的过程中,应用过去学习的知识,编写一些我们自己的小程序,让大家真正进入程序员的行列。
今天我们将要介绍的控制流语句是判断语句if,也可以叫做条件语句,都是一个意思。
一个典型的if语句结构如下所示:
if 判断条件:
执行语句1
else:
执行语句2
且不说这个规则的语法结构,其本身的含义就很好理解,翻译成自然语言就是:
如果判断条件为真,就执行语句1,否则(即判断条件为假)就执行语句2。
使用流程图来表示,更是一目了然:
这其中,关键词if是必须的,else是可以省略的。也就是当判断条件为真时执行语句,判断条件为假时什么也不执行。
关于if语句,还有如下几个知识点需要介绍:
1、判断条件:
只要输出结果是布尔值类型(也就是True或者False)的运算,都可以作为判断条件。比如我们之前学习的比较运算(>、>=、<、<=、==、!=)、成员运算(in、not in)、身份运算(is、not is)等,这其中最常用的又是比较运算。
由于在演示实例时,Jupyter Notebook的界面更加友好,在知识点的学习过程中,我们还是先使用Jupyter Notebook进行实例的演示,等到最后编写程序的时候,我们再使用PyCharm。(以后的文章中也会采取这样的方式。)
In [1]: if 2 > 1: # 比较运算
print("判断条件为真。")
else:
print("判断条件为假。")
Out[1]: 判断条件为真。
In [2]: if 1 in [2, 3, 4]: # 成员运算
print("判断条件为真。")
else:
print("判断条件为假。")
Out[2]: 判断条件为假。
In [3]: a = 257
b = 257
if a is b: # 身份运算,为什么判断条件为假?请参考《手把手陪您学Python》13——运算
print("判断条件为真。")
else:
print("判断条件为假。")
Out[3]: 判断条件为假。
如果需要同时对多个条件进行判断,还需要使用到逻辑运算(and、or、not)。
In [4]: if 2 > 1 and 3 < 2: # 逻辑运算and
print("判断条件为真。")
else:
print("判断条件为假。")
Out[4]: 判断条件为假。
In [5]: if 2 > 1 or 3 < 2: # 逻辑运算or
print("判断条件为真。")
else:
print("判断条件为假。")
Out[5]: 判断条件为真。
In [6]: if not 2 > 1: # 逻辑运算not
print("判断条件为真。")
else:
print("判断条件为假。")
Out[6]: 判断条件为假。
In [7]: if not 2 > 1 and 3 > 2 or (4 > 3 and 3 < 5): # 混合逻辑运算
print("判断条件为真。")
else:
print("判断条件为假。")
Out[7]: 判断条件为真。
另外,之前讲到过,0可以代表False,非0数字可以代表Ture,所以理论上以数字作为输出值的运算,都可以作为判断条件。只不过这样的判断条件没有任何意义,没有人这么写程序,完全可以用比较函数a == 0或者a != 0代替作为判断条件。
In [8]: if 2 * 3: # 数字运算,只要结果不为零就为真,一般不这样设置判断条件
print("判断条件为真。")
else:
print("判断条件为假。")
Out[8]: 判断条件为真。
In [9]: a = 2 * 3
if a != 0: # 使用a == 0或者a != 0,作为判断条件
print("判断条件为真。")
else:
print("判断条件为假。")
Out[9]: 判断条件为真。
2、多条件判断
之前我们介绍的if...else..是一种典型的if语句结构,但常用的if语句结构中,还包括了elif这样一个判断条件标识符。而且还可以通过使用多个elif,实现多条件判断。其语句结构如下所示:
if 判断条件1:
执行语句1
elif 判断条件2:
执行语句2
elif 判断条件3:
执行语句3
else:
执行语句4
翻译成自然语言就是:
如果判断条件1为真,就执行语句1,否则就看判断条件2;如果判断条件2为真,就执行语句2,否则就看判断条件3;如果判断条件3为真,就执行语句3,否则就执行语句4。
在进行多条件判断时,else也是可以省略的。因为无论是在普通的if语句结构中,还是在这种多条件判断中,else都代表着“其它”情况。如果不想对“其它”情况执行任何语句,就可以进行省略。
多条件判断应用场景很多,我们最后要做的project就是一个多条件判断的实例。现在先用一个简单的实例进行说明。
In [10]: a = 3.5
if a < 0:
print("a为负数。")
elif a % 2 == 0:
print("a为偶数。")
elif a % 2 == 1:
print("a为奇数。")
else:
print("a不是正整数。")
Out[10]: a不是正整数。
3、语句嵌套
除了使用elif实现多条件判断外,还可以通过多个if语句嵌套的方式,实现多条件的判断。虽然叫做语句嵌套,但并不必把它理解为一个多么高深的技术,只不过就是某一判断条件下的执行语句本身就是一个if语句结构而已。这么理解的话,就更加方便大家日后的应用了,而不必想着如何去进行嵌套。
if 判断条件1:
执行语句1
elif 判断条件2:
执行语句2
if 判断条件2-1:
执行语句2-1
elif 判断条件2-2:
执行语句2-2
else:
执行语句2-3
else:
执行语句3
虽然上面的语句结构看上去有点复杂,但换汤不换药,都是从if语句的基础结构衍生出来的。大家可以尝试将其翻译成自然语言,如果没有问题,那么就说明已经对if语句的含义完全掌握了。
最后,再将上面的例子用语句嵌套的方式表达一下,请大家注意其中的区别。
In [11]: a = 3.5
if a < 0:
print("a为负数")
elif a > 0:
if a % 2 == 0:
print("a为偶数。")
elif a % 2 == 1:
print("a为奇数。")
else:
print("a不是正整数")
else:
print("a为0。")
Out[11]: a不是正整数
4、语法格式:
掌握了if语句的含义,剩下的就是格式要求了。
因为我们之前学习的都是单行的代码,所以并没有太多的格式要求。但是到了控制流语句这里就不一样了,它们有着严格的符号、格式和缩进要求,否则就会报错。但说起来也很简单,只要注意两点就可以了。
一是在每一个关键词语句后都要有一个“:”(注意是英文冒号),也就是if、elif、else所在的语句行。
二是在每一个冒号后的执行语句,都要缩进,代表是下一层级的语句。一般用Tab键就可以直接实现缩进,Jupyter Notebook和PyCharm等软件也会在输入“:”后回车,自动完成缩进动作。如果在语句嵌套等情况下,存在多层级的语句结构,那么就要在上一层级的缩进位置再次缩进,程序一般也都能自动实现。
这种格式要求与显示方式,正是Python语言友好的体现。语句的层级结构通过缩进一目了然,非常易读。实现方式也非常简便,Tab一下就能搞定。
5、三元运算
在《手把手陪您学Python》13——运算一文中,我们提到过三元运算,因为当时没有介绍if语句,所以省略的该部分内容。现在,有了上面的基础,就可以了解一下三元运算了。
三元运算其实就是简化的if...else...语句结构,只要把整个语句都写在同一行就可以了,语义上没有任何区别,也没有“:”、缩进等格式要求。唯一需要注意的是,三元运算是一个运算,其结果是要赋值给一个变量的,而这个值是通过if...else...语句结构和其中的表达式来计算的。
三元运算可以用如下结构来表示:
a = 表达式1 if 判断条件 else 表达式2
翻译成自然语言就是:
如果判断条件为真,a的值等于表达式1的结果,否则a的值等于表达式2的结果。
In [12]: a = 2
b = "奇数" if a % 2 == 1 else "偶数" # 这里的表达式是字符串
print("a是{}。".format(b))
Out[12]: a是偶数。
In [13]: a = 2
b = a * 2 if a < 2 == 1 else a ** 2 # 这里的表达式是算数运算
print(b)
Out[13]: 4
以上就是有关判断语句if的知识点,下面我们将编写一个实例,使用的就是判断语句if,以及我们以前学过的知识。现在,大家可以先关闭Jupyter Notebook了,我们将使用PyCharm来编写这个程序。
今天,我们要编写的实例是我们非常熟悉的“石头剪刀布”游戏。游戏的整个过程就是我们上一篇讲到的完整的信息流执行过程,先是交互式输入,之后进行程序处理,最后输出结果。
输入部分就是由程序的使用者输入出拳的内容,石头、剪刀还是布。
程序处理包括两个部分,一是电脑随机出拳,二是电脑根据游戏规则,判断胜负。
输出部分就是游戏的胜负结果。
下面就把整个程序文本和PyCharm截屏一并展示给大家,其中对于程序语句的解释都使用注释进行了说明。
In [14]: import random # 因为要使用随机函数,需要先导入随机函数库
# 交互式输入过程,使用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))
Out[14]: 请输入您要出的拳(石头、剪刀、布):布
Out[15]: 您出的是:布,电脑出的是:石头。恭喜,您赢了!
从上面的截图中大家可以看到,程序的最上方有一段注释内容(使用三引号"""),描述了程序的一些基本信息。建议大家也可以这么去做,一是可以记录一下程序的内容,避免日后遗忘;二是可以通过这种记录,看到自己学习Python的历程。有些程序还可能会随着我们学习到的东西越来越多,写的越来越好、越来越简洁,这些都是我们不断成长的过程。
另外,在第20行程序的最后有一个“\”,这个符号是用来把较长的一行代码换行继续输入的标识符。如果不写“\”就会被程序认为是新的一行代码,无论是格式要求上,还是程序内容上,都有可能出错。
在PyCharm输入代码的过程中,会有很多便利性的提示。比如使用过的变量会提供补齐,格式错误或者语法错误都有相应的黄色波浪线或者红色波浪线提示。大家可以将鼠标移到提示处,就能够看到相关的建议或者提示内容了。PyCharm不但功能强大,连很多的细节都做的特别出色,这也是为什么推荐大家使用这款软件的原因了。
至此,我们就完成了第一个真正意义上的Python程序,大家可以多玩几把,享受一下自己的学习成果。
不过在游戏的过程中,大家是否也感觉到了一些不方便的地方?比如每次都要运行完一次程序才能玩,如果输入过程出错就会报错中断等等。
这些确实都是我们这个版本中的不足之处。不过没关系,目前才只是V1.0版本,在后面的学习中,我们不仅会完善这个版本的不足之处,还会不断丰富这个游戏的功能。利用下一篇将要介绍的while()函数,就可以实现游戏的连续运行,而不需要我们每次都手工运行了,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
欢迎扫描下方二维码,关注“亦说Python”公众号,阅读《手把手陪您学Python》系列文章的其他篇目,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手15”,即可免费下载本篇文章所用示例语句。