# python3小白课:if分支结构 ### 顺序结构 当我们没有指定代码运行结构的时候,python是一条路走到黑的,即从上往下一行行解析执行代码,排在前面的先执行,排在后面的后执行。 但我们的世界都是一条路走到黑的吗? 比如小白同学很不喜欢下雨,一下雨就不想出门,那么小白同学会这么想:出门前看看外面的天气,如果是大晴天,就出门,如果下雨,就不出门。 这样的需求顺序结构就无法解决。这时候我们就需要用到if分支结构了。 --- ### if分支结构 if是如果的意思,那么它就可以用来控制我们的判断条件让程序判断一下,if语句有几种写法形式,照着小白同学的例子,我们可以写下如下的伪代码方便大家理解(注意不是真正的python代码): ```python # coding:utf-8 # 写法1 if "外面大晴天": "出门咯~" # 写法2,else表示否则,后面不需要跟条件表达式,囊括所有其他的可能性 if "外面大晴天": "出门咯~" else: "坚决不出门" # 写法3,elif为else if单词的合并,表示否则如果,后面需要跟条件表达式。允许有多个elif if "外面大晴天": "出门咯~" elif "外面大暴雨": "坚决不出门" else: "看看情况再说" ``` 通过上述伪代码,我们可以可以清晰的看到if分支结构的多种判断条件的写法方式以及对应怎么执行,分析上述代码,我们可以总结出if结构有如下几个写法注意点: * if分支结构以if开头,后面跟随判断的条件表达式,如果表达式结果返回True,则执行if区段下面的语句,如果为False,则不执行会往下看 * 接下来如果有elif语句,会继续判断是否符合条件,如果为True,则执行elif下面的语句,否则继续往下 * 当下面再没有elif的时候,如果没有else语句,则分支运行结束,但如果有else语句,则直接运行else语句下面定义的python语句 * 需要注意,每个结构写完条件表达式之后的冒号`:`,不要漏掉了 * 结构下的可执行语句,大家应该很容易注意到我都是用了缩进的,这是python编程语言相比其他编程语言的一大特色(其他编程语言可能用花括号`{}`或者`end`等关键字来表示流程控制区段范围),python强制这些流程控制结构都需要采用缩进的方式来表达层级关系,比如`"出门咯~"`是缩进的,就表示它是if语句块下面要执行的分支代码,这样定义的好处是,遇到流程控制的时候,通过缩进就可以很容易区分那些是流程控制语句块下的代码,对于强迫症患者来说这是相当美观的。但它的不足之处也很明显,那就是代码编写时需要特别注意缩进,如果该缩进却没缩进,解释器是会报错的,缩进问题有时候搞疯很多人。 > [!question] > > 那么如何缩进呢? 我个人一般使用一个`Tab`键的制表符距离表示缩进一层,如果层级嵌套,比如if语句可以嵌套if语句,那么就根据层级关系放适当数量的Tab距离。当然,你也可以用四个空格键来缩进(你喜欢两个空格其实也可以,但不要有时候缩进两个空格,有时候四个)。实际编写中,建议统一规范,是统一空格键还是Tab键,有时候混着用解释器也是可能报错的。一些不错的IDE可以实现一键自动帮你转换成其中一种,很少有这样的困扰,比如`pycharm`就能做到。 来一个嵌套的例子: ```python # coding:utf-8 a = 10 if a >= 5: if a >= 8: print("大于8") else: print("大于等于5小于8") elif a < 0: print("小于0") else: print("介于0到5之间") ``` > [!danger] > > 不需要缩进的地方请不要随意缩进,比如一个顺序结构,顺着下来就行了,就没必要缩进了。 我们来看点没有好好遵循缩进原则所造成问题的例子(我们可以存到一个py文件中来运行): ```python # coding:utf-8 a = input("你的语文考试多少分?") if int(a) < 90: print("成绩不过关,继续努力哦~") print("哇你真棒呀,都90分以上啦!") ``` 上述代码执行后,如果我们输入一个90分以上的分数,则输出的结果在逻辑上是没有问题的。但当我们输入一个90分以下的分数时,`print("哇你真棒呀,都90分以上啦!")`这句代码也被执行了,因为它没有缩进,没有在if分支结构中,是无论如何都会执行的。 --- ### if结构的判断条件 if结构后面的条件一定要是条件表达式吗?其实也不一定的,它后面的条件还能跟字符串、列表、元组、字典等等东西,这些东西也能判断出True或者False。 你需要记住的是下面这些,它们在进行if判断的时候会返回False,其他均返回True。这是if语句很容易判断返回的内容是否为空值的`神器`: `False、 None、 0、 ""、 ()、 []、 {}` ```python # coding:utf-8 # 其他的类似,我们就不一一列举了,大家请自己尝试,这里拿空字符串做例子 a = "" if a: print("a不是空字符串") else: print("a为空字符串") ``` --- ### if分支的逻辑错误 使用if分支时,有时候虽然程序不报错,但代码却犯了逻辑错误(这种错误是你的代码运行逻辑跟业务逻辑有差异,达不到你想要的效果,但在python解释器的语法上是过关的可以运行的。逻辑错误是我们编写代码的过程中比较难以发现的一种错误,因为解释器不会报错你能马上查问题,而是通过查看运行结果来分析的方式来判断我们写的是否有问题,它对于编程人员的逻辑思维、空间抽象思维的要求较高。但大家不要怕,遇到这种情况的时候,可以通过一些IDE软件的调试功能或者将逻辑抽象出来进行抽丝剥茧式的分析,是可以发现并解决问题的,相信你解决之后也会很有成就感),也就是没有达到我们要的业务效果。 我们来举个简单的例子: ```python # coding:utf-8 score = 85 if score > 60: print("及格") elif score > 80: print("良好") elif score > 90: print("优秀") ``` 我们来看下上面的例子,乍看之下我们的判断条件都没有问题,60分以上的算及格,80分以上的算良好,90分以上的算优秀。那么我们的成绩score为85分,怎么也算良好这一档,对吧? 执行代码,我们发现给我们返回的结果是:`"及格"` 咦?怎么不是良好呢?其实在这里我们就犯了一个逻辑错误。85分是不是也大于60分?是的,所以在流程控制中,我们直接就从及格那里跑出来了,根本没有进行后面是否大于80分的判断。 这就是一个简单的逻辑错误,那么我们应该怎么修改呢?我们可以加上范围限制条件: ```python # coding:utf-8 score = 85 if score > 60 and score <= 80: print("及格") elif score > 80 and score <= 90: print("良好") elif score > 90: print("优秀") ``` 通过这样的修改,我们就实现了每段判断的范围限定,就能输出`良好`啦。 有的同学思路很快,能想出下面更好的办法: ```python # coding:utf-8 score = 85 if score > 90: print("优秀") elif score > 80: print("良好") elif score > 60: print("及格") ``` 这段代码没有添加and,只是调换了一下几个判断条件的写的顺序,也能实现我们的效果,分析一下,既然我们都是往大于的方向进行判断,那么我们应该先判断最大的,当90不满足的时候,才能判断是否大于80这一档,在判断这一档的时候,已经隐含了一个条件,那就是肯定`<= 90`,所以一定不可能是`优秀`,这时候我们就不会错漏了。 通过上述几个简单例子的学习,大家是不是对逻辑错误有了更加形象的认识?在编写代码时,我们需要多思考流程控制的最佳逻辑,这样有助于训练我们的编程逻辑思维,对大家是很有帮助的。 --- ### if表达式 之前介绍三目运算符的时候介绍过一行的if表达式写法。这里不再赘述。 当我们只有if判断想要写在一行的时候,也可以这么写: ```python # coding:utf-8 a = 10 if a > 5 : print("大于5") ``` --- ### pass占位符 pass表示通过的意思,在python中,如果流程控制结构后面的代码执行体,我们不打算执行任何代码或者打算不进行任何代码处理,或者我们还没想好要执行啥,那么在编写时,不能够留空,会报错,这时候我们可以用`pass`来作为执行体的占位符,代码运行到这里就不执行任何代码往下了。 ```python # coding:utf-8 score = 85 if score > 90: print("优秀") elif score > 80: # 这里不写任何可执行的语句,可以写个pass,如果满足条件进来了,也不会执行任何东西 pass elif score > 60: print("及格") ``` ### 单词释义 | 单词 | 释义 | | ----- | ------------------------------------------------------------ | | if | 如果 | | elif | else if合在一起的写法,其他语言可能是用的else if这样的,python注意用elif,表示否则如果 | | else | 否则 | | score | 成绩 | | pass | 通过 |