对于if 分支,还有一个很容易出现的逻辑错误,这个逻辑错误并不属于语法问题,但引起错误的可能性更大。看下面程序。
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/01
# @Author : Laopi
age = 50
if age >18:
print('青年人')
elif age>40:
print('中年人')
elif age>60:
print('老年人')
从表面上看,上面的程序没有任何问题:人的年龄大于18岁是青年人,年龄大于40岁是中年人,年龄大于60岁是老年人。但运行上面程序,就会发现打印结果是:青年人。而实际上希望45岁应被判断为中年人-这显然出现了一个问题。
对于任何的if else语句,从表面上看,else 后没有任何条件,或者elif后只有一个条件,但这不是真相,因为else 的含义是“否则”,else本身就是一个条件。这也是把if,else 后的代码块统称为条件执行体的原因,else 的隐含条件是对前面条件取反。因此,上面代码实际上可改写为
age = 50
if age >18 and age<=40:
print('青年人')
elif age>40 and age <=60:
print('中年人')
elif age>60:
print('老年人')
也可以更简洁写到下面这种
age = 50
if age>60:
print('老年人')
elif age>40:
print('中年人')
elif age>18:
print('青年人')
上面的程序其实暗含很多含义,如下:
age = 50
if age>60:
print('老年人')
#在原本的if条件中增加了else的隐含条件
elif age>40 and age<=60:
print('中年人')
#在原本的if条件中增加了else的隐含条件
elif age>18 and age<=60 and age<=40:
print('青年人')
上面程序的判断逻辑即转为如下三种情形。
1)age大于60岁,判断为“老年人”
2)age大于40岁,且age小于或等于60岁,判断为“中年人”
3)age大于18岁,且age小于或等于40岁,判断为“青年人”
上面的判断逻辑才是实际希望看到的。
因此,当使用ifelse 语句进行流程控制时,一定不要忽略了else所带的隐含条件。
如果每次都去计算if 条件和else 条件的交集也是一件非常烦的事情,为了避免出现上面的错误,在使用 if else 语句时有一条基本规则:总是优先把包含范围小的条件放在前面处理。对比age>60和age>18两个条件,明显age>60的范围更小,所以应该先处理age>60的情形。
小技巧:在使用 if else分支语句时,一定要先处理包含范围更小的情形。