判断语句
布尔对象
Python中有一种对象类型称之为布尔对象(英文叫 bool)。
布尔对象只有两种取值: True 和 False
对应 真 和 假, 或者说 是 和 否。
很多事情只有两种可能,是 或者 否。
比如: 今天是星期天吗?
要么 是 ,要么 否。
Python中的布尔对象 对应 是 和 否 只有两种取值。
其中 True 对应 是, False 对应 否。
布尔表达式
运算结果是布尔对象的表达式,就是 布尔表达式。
通常有如下几种
是否相等
是否相等的表达式 像这样
用 ==
连接两个比较对象。
如果 两个比较对象相等,解释器运算结果为 True
如果不相等,解释器运算结果为 False
请运行Python解释器命令行,输入如下语句
返回值为 True
返回值为 False
返回值为 False。想一想,为什么?
返回值为 True
是否不相等
用 !=
连接两个比较对象。
如果两个比较对象不相等,解释器运算结果为 True
如果相等,解释器运算结果为 False
请运行Python解释器命令行,输入如下语句
返回值为 False
返回值为 True
返回值为 True
返回值为 False
是否大于
用 >
连接两个比较对象。
如果前面的对象大于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
返回值为 False
返回值为 True
返回值为 False
是否大于等于
用 >=
连接两个比较对象。
如果前面的对象大于或者等于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
返回值为 True
返回值为 True
返回值为 False
是否小于
用 <
连接两个比较对象。
如果前面的对象小于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
返回值为 False
返回值为 False
返回值为 True
是否小于等于
用 <=
连接两个比较对象。
如果前面的对象小于或者等于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
返回值为 True
返回值为 False
返回值为 True
连写比较表达式
比较的表达式可以 连着写
,像这样
返回值为 True,这个表达式 2 < num <= 5
等价于
条件组合
有的时候,布尔表达式 还会 组合起来 成为一个更大的表达式
布尔表达式 主要有3 种组合关系
逻辑且
这种组合关系是用 and 关键字 连接的,如下
这种组合,只有表达式1 和 表达式2 都成立 (也就是计算结果都为True),最终的结果才成立(为True)
任何一个表达式为 False ,结果都是False
你可以打开Python解释器,依次输入如下的语句,看看结果是什么
True and True # 结果为 True
True and False # 结果为 False
False and True # 结果为 False
False and False # 结果为 False
num1 = 5
str1 = 'ok'
num1 > 4 and str1 == 'ok' # 结果为 True
num1 > 4 and str1 == 'bad' # 结果为 False
num1 > 6 and str1 == 'ok' # 结果为 False
num1 > 6 and str1 == 'bad' # 结果为 False
num1 > 4 and str1 == 'ok' and num1 > 5 # 结果为 False
逻辑或
这种组合关系是用 or 关键字 连接的,如下
这种组合,只要表达式1 和 表达式2 任何一个成立 (也就是任何一个计算结果为True),最终的结果都成立(为True)
如果两个表达式计算结果都为 False ,结果才是False
你可以打开Python解释器,依次输入如下的语句,看看结果是什么
True or True # 结果为 True
True or False # 结果为 True
False or True # 结果为 True
False or False # 结果为 False
num1 = 5
str1 = 'ok'
num1 > 4 or str1 == 'ok' # 结果为 True
num1 > 4 or str1 == 'bad' # 结果为 True
num1 > 6 or str1 == 'ok' # 结果为 True
num1 > 6 or str1 == 'bad' # 结果为 False
num1 > 6 or str1 == 'ok' or num1 != 5 # 结果为 True
num1 > 6 or str1 == 'sk' or num1 != 5 # 结果为 False
如果 and 和 or 一起使用, 注意 是先计算 and 部分, 其结果 再和 or 一起计算,比如这个表达式
就要先计算
结果是 False
然后这个False 再和前面的计算,就是
所以最后的结果是True
如果我们就是想要: 先计算前面的or 部分, 然后再和 后面 and 一起计算呢?
可以使用括号,像这样
就要先计算
结果是 True
然后这个结果 True 再和前面的计算,就是
所以最后的结果是False
可以看出, 不用的优先级会导致不同的结果
逻辑非
这种组合其实就是把后面的布尔表达式的结果反过来
这种组合关系是用 not 关键字 的,如下
not 加在条件表达式1的前面,会反转其结果。
表达式1 计算结果为True, 最终的结果为 False
表达式1 计算结果为False,最终的结果为 True
你可以打开Python解释器,依次输入如下的语句,看看结果是什么
not True # 结果为 False
not False # 结果为 True
num1 = 5
str1 = 'ok'
not num1 > 4 # 结果为 False
not str1 == 'sk' # 结果为 True
如果not、 and 和 or 一起使用, 注意 是先计算 not , 再计算 and 部分, 最后再计算 or
这样的表达式
先计算 not 4 > 6
得到 True
再计算 'sk' == 'ok' and 4 > 3
得到 False
将上面的结果 用 or 连接 ,就是 True or False
,所以最后结果是 True
如果大家想了解完整的Python运算符的优先级,可以点击这里,参考官网操作符优先级表
判断语句
上面的这些布尔表达式都表示了一个结果, True 还是 False。
那么这些表达式有什么用呢?
主要是用在判断语句中。
判断语句是根据 某个条件 决定是否要执行一些代码。
判断语句是以 if
关键字开头。
来看下面的例子,实现一个注册用户手机信息的函数,输入的手机号码不能超过11位。
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
print('函数结束')
如果 if
关键字 后面的条件 对应的表达式 运算结果 为 True
,就表示条件成立,就去执行 下面缩进的
代码。
如果 if
后面的表达式结果为 False 就不会执行它 。
有的时候,程序 不仅仅 判断在某个条件成立时,做一些处理, 还要求 在这个条件不成立时
,做另外的处理。
if 后面的条件不成立要做什么,Python 中 用 else
关键字,
比如,我们要求 如果用户输入的 手机号码长度正确,要给出输入正确的提示
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
else:
print('手机号码输入正确')
print('函数结束')
注意, else 和 if 对齐,else 情况下的代码 也要缩进。
else 表示在 if 后面的条件不成立时,要做一些事。 if ... else
构成了一种 非此即彼 的判断关系。
有的时候,在if 条件不成立的情况下, 要做什么, 还需要进一步的判断
, 不能简单的就用一个else 来表示。
比如:用户输入的手机号码 长度不超过11个字符
条件满足,不能就直接判定 手机号码输入正确, 还得判断输入的 是不是都是数字
。
这时候, 可以这样写
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
# 还需要进一步判断 输入的是否全数字
elif not phone.isdigit() : # isdigit 是字符串对象的方法,下一章会学到
print('输入错误!手机号码必须全是数字')
else:
print('手机号码输入正确')
print('函数结束')
其实,这样的写法,很好理解, elif 就是 else if 的简写,表示
在 条件不成立(else) 的情况下, 还需要进一步的判断 (if)。
有的时候,情况更加复杂,还需要更多的判断,Python中可以 使用更多的elif
。
比如,判断输入的手机号码是否有效,除了检查 长度、全数字字符, 还要检查是否以数字 1 开头、
可以这样写
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
# 还需要进一步判断 输入的是否全数字
elif not phone.isdigit() :
print('输入错误!手机号码必须全是数字')
# 判断是否以数字1 开头
elif not phone.startswith('1') : # startswith 是字符串对象的方法,下一章会学到
print('输入错误!手机号码必须以数字1开头')
else:
print('手机号码输入正确')
print('函数结束')
根据实际需求, elif 可以 无限量的
增加下去。
如果我们要求在输入检查条件全部通过后, 执行存储用户信息到数据库的操作,可以写在最后的else分支,如下
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
elif not phone.isdigit() :
print('输入错误!手机号码必须全是数字')
elif not phone.startswith('1') :
print('输入错误!手机号码必须以数字1开头')
else:
print('手机号码输入正确')
print('执行 存储用户信息到数据库 的操作...')
上面的函数是一个典型的例子:函数执行某个功能前,要做一些条件检查, 如果这些条件任何一个不满足, 后续的操作就不要做了。
这样的情况下,结合 return 语句,还有另外一种写法,如下
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
# 下面任何一个检查条件不通过,直接 return 返回
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
return
if not phone.isdigit() :
print('输入错误!手机号码必须全是数字')
return
if not phone.startswith('1') :
print('输入错误!手机号码必须以数字1开头')
return
# 前面的条件检查全部通过
print('手机号码输入正确')
print('执行 存储用户信息到数据库 的操作...')
这样写, 省略了很多的 elif、 else ,可读性更好。
我们再看一个例子。
我们假设 某个国家的 出租车 计费 有如下规则。
里程 | 收费 |
---|---|
<= 3公里 | 20 元/每公里 |
>3公里 | 15 元/每公里 |
我们要写一个函数,计算费用,可以这样写
def charge(miles):
if miles <=3:
print('20 元/每公里')
unit = 20
else:
print('15 元/每公里')
unit = 15
return miles*unit
可以这样分别调用该函数,看看什么结果
如果有更多的判断逻辑,就需要使用 elif 了
比如,计费规则更多一些
里程 | 收费 |
---|---|
<= 3公里 | 20 元/每公里 |
>3公里 且 <= 5公里 | 15 元/每公里 |
>5公里 且 <= 8公里 | 12 元/每公里 |
>8公里 | 10 元/每公里 |
就可以这样写
def charge(miles):
if miles <=3:
print('20 元/每公里')
unit = 20
elif miles <=5: # 当不满足 miles <=3 的时候
print('15 元/每公里')
unit = 15
elif miles <=8: # 当不满足 miles <=3 也不满足miles <=5 的时候
print('12 元/每公里')
unit = 12
else: # 当不满足 miles <=3 也不满足 miles <=5 也不满足 miles <=8 的时候
print('10 元/每公里')
unit = 10
return miles*unit
解释器执行上面的条件语句的时候,是顺序进行判断的,
当第1个条件 miles <=3
成立的话,就执行对应下面的缩进代码,
如果不成立,继续看后面的 elif 的条件 miles <=5
。 如果成立,就执行对应下面的缩进代码
如果不成立,继续看后面的 elif 的条件 miles <=8
。 如果成立,就执行对应下面的缩进代码
如果不成立,就执行最后的else 对应下面的缩进代码,
注意 elif 和else 的区别是 :
elif 后面会有一个 条件表达式, 而 else 没有
当然 if 和 elif 后面 的条件表达式可以是一个复合表达式,比如
计费规则 和乘车时间 也有关系
里程 | 时间 | 收费 |
---|---|---|
<= 3公里 | <= 1小时 | 20 元/每公里 |
>3公里 | <= 1小时 | 15 元/每公里 |
def charge(miles, duration):
if miles <= 3 and duration <= 1:
print('20 元/每公里')
return miles*20
elif miles > 3 and duration <= 1 :
print('15 元/每公里')
return miles*15
条件判断嵌套
有的时候,条件判断成立或者不成立, 后面要做什么, 还需要再次分情况处理。
这时,往往需要 缩进的代码中 再次进行 条件判断
比如,如果上面的计费规则更多一些
里程 | 时间 | 收费 |
---|---|---|
<= 3公里 | <= 1小时 | 20 元/每公里 |
> 1小时 | 22 元/每公里 | |
>3公里 | <= 1小时 | 15 元/每公里 |
> 1小时 | 18 元/每公里 |
就可以像下面这样,在条件判断后面缩进的代码里面继续使用条件判断
def charge(miles, duration):
if miles <= 3 :
if duration <= 1:
print('20 元/每公里')
return miles*20
else:
print('22 元/每公里')
return miles*22
elif miles > 3 :
if duration <= 1:
print('15 元/每公里')
return miles*15
else:
print('18 元/每公里')
return miles*18
要注意的是 里面的条件判断 成立后的代码还要 再次缩进。
if 语句后面也可以没有else 或者 elif
比如
def charge(miles, isKing):
# 如果乘客是国王,就可以免费
if isKing:
return 0
if miles <=3:
print('20 元/每公里')
return miles*20
else:
print('15 元/每公里')
return miles*15
课内练习
请大家实现一个程序, 对天气的人体舒适度进行评估。 该程序运行起来先询问用户
用户输入气温(比如28.3)后,再询问用户
用户输入气压(比如270)后进行如下判断:
- 如果气温 > 30 或者 < -8:显示:不舒适
- 如果气压 > 300 或者 < 20: 显示:不舒适
- 如果 25 < 气温 <= 30 并且 200 < 气压 <= 300:显示:比较舒适
- 如果 10 < 气温 <= 25 并且 100 < 气压 <= 200: 显示:特别舒适
- 如果 -8 <= 气温 <=10 并且 20 <= 气压 <= 100: 显示:比较舒适
- 其他情况: 显示 本程序不能判断
请大家自行完成。
这题可以考验 什么时候用 if 什么时候用 elif , 初学者经常搞不清这点。
请看下面我和实战班学员的交流
https://www.bilibili.com/video/BV1GJ411q7io?p=12