转自:http://www.byhy.net/tut/py/basic/08/
布尔对象
点击这里,边看视频讲解,边学习以下内容
Python中有一种对象类型称之为布尔对象(英文叫 bool)。
布尔对象只有两种取值: True 和 False
对应 真 和 假, 或者说 是 和 否。
很多事情只有两种可能,是 或者 否。
比如: 今天是星期天吗?
要么 是 ,要么 否。
Python中的布尔对象 对应 是 和 否 只有两种取值。
其中 True 对应 是, False 对应 否。
布尔表达式
运算结果是布尔对象的表达式,就是 布尔表达式。
通常有如下几种
是否相等
是否相等的表达式 像这样
1 == 1
用 ==
连接两个比较对象。
如果 两个比较对象相等,解释器运算结果为 True
如果不相等,解释器运算结果为 False
请运行Python解释器命令行,输入如下语句
1 == 1
返回值为 True
1 == 2
返回值为 False
1 == '1'
返回值为 False。想一想,为什么?
'1' == '1'
返回值为 True
是否不相等
用 !=
连接两个比较对象。
如果两个比较对象不相等,解释器运算结果为 True
如果相等,解释器运算结果为 False
请运行Python解释器命令行,输入如下语句
1 != 1
返回值为 False
1 != 2
返回值为 True
1 != '1'
返回值为 True
'1' != '1'
返回值为 False
是否大于
用 >
连接两个比较对象。
如果前面的对象大于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
1 > 1
返回值为 False
1 > 0
返回值为 True
1 > 2
返回值为 False
是否大于等于
用 >=
连接两个比较对象。
如果前面的对象大于或者等于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
1 >= 1
返回值为 True
1 >= 0
返回值为 True
1 >= 2
返回值为 False
是否小于
用 <
连接两个比较对象。
如果前面的对象小于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
1 < 1
返回值为 False
1 < 0
返回值为 False
1 < 2
返回值为 True
是否小于等于
用 <=
连接两个比较对象。
如果前面的对象小于或者等于后面的对象,解释器运算结果为 True
否则,运算结果为 False
请运行Python解释器命令行,输入如下语句
1 <= 1
返回值为 True
1 <= 0
返回值为 False
1 <= 2
返回值为 True
连写比较表达式
比较的表达式可以 连着写
,像这样
num = 3
2 < num <= 5
返回值为 True,这个表达式 2 < num <= 5
等价于
num > 2 and num <=5
条件组合
点击这里,边看视频讲解,边学习以下内容
有的时候,布尔表达式 还会 组合起来 成为一个更大的表达式
布尔表达式 主要有3 种组合关系
且 的 条件组合
这种组合关系是用 and 关键字 连接的,如下
表达式1 and 表达式2
这种组合,只有表达式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 or 表达式2
这种组合,只要表达式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 一起计算,比如这个表达式
6 > 5 or 'sk' == 'sk' and 4 == 5
就要先计算
'sk' == 'sk' and 4 == 5
结果是 False
然后这个False 再和前面的计算,就是
6 > 5 or False
所以最后的结果是True
如果我们就是想要: 先计算前面的or 部分, 然后再和 后面 and 一起计算呢?
可以使用括号,像这样
(6 > 5 or 'sk' == 'sk') and 4 == 5
就要先计算
(6 > 5 or 'sk' == 'sk')
结果是 True
然后这个结果 True 再和前面的计算,就是
True and 4 == 5
所以最后的结果是False
可以看出, 不用的优先级会导致不同的结果
not 的 条件组合
这种组合其实就是把后面的布尔表达式的结果反过来
这种组合关系是用 not 关键字 的,如下
not 表达式1
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 or 'sk' == 'ok' and 4 > 3
先计算 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
可以这样分别调用该函数,看看什么结果
charge(3) # 执行 if 下面缩进的代码
charge(5) # 执行 else 下面缩进的代码
如果有更多的判断逻辑,就需要使用 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