布尔对象:
Python中有一种对象类型称之为布尔对象(英文叫bool)。
布尔对象只有两种取值,True和False。对应的是真和假,或者说是和否。True对应的是,False对应的是否。
我觉得这句话是一个关键:
这个布尔对象正好对应着我们现实世界的某些条件是不是成立。例如今天是星期天吗?
我们判断是真还是假。
再举一个例子,我们shell脚本中也有判断语句。-e filename,判断文件是否存在。-f 判断文件是否存在等等。都是返回布尔值。
布尔表达式:
bash
>>> 1 == 1
True
使用 == 来连接两个比较对象。
bash
>>> 1 == '1'
False
我们也可以连写:
bash
num = 3
print(2 < num <= 5)
条件组合:
有的时候,布尔表达式还会组合起来成为一个更大的表达式。
布尔表达式有三种组合关系。
逻辑且:and
bash
True and True # 结果为 True
True and False # 结果为 False
False and True # 结果为 False
False and False # 结果为 False
表达式1 和表达式2 都成立了,最终结果才能成立。
任何一个表达式为false,结果都是false。
逻辑或:or
bash
True or True # 结果为 True
True or False # 结果为 True
False or True # 结果为 True
False or False # 结果为 False
表达式任何一个计算结果为True,最终结果都成立True。
两个表达式计算结果都为False,结果才为False。
逻辑非:not
bash
not True # 结果为 False
not False # 结果为 True
not 加在条件表达式的前面,会反转前面的结果。
上面的这些布尔表达式都表示了一个结果,True或False。
那么,这些表达式有什么用呢?
主要是用在判断语句 中。非常基础的非常重要的语法要求。
判断语句是根据某个条件,决定是否要执行一些代码。
判断语句是以if语句开头的。
bash
def registerUser():
phone = input('请输入你的手机号码(不超过11个字符):')
if len(phone) > 11:
print('输入错误!手机号码超过了11个字符')
print('函数结束')
registerUser()
如果 if 关键字 后面的条件 对应的表达式 运算结果 为 True ,就表示条件成立,就去执行 下面缩进的 代码。
如果 if 后面的表达式结果为 False 就不会执行它 。
在编写Shell脚本的时候,我们多添加if判断条件语句,可以将一些条件进行约束,将某个大的范围约束、缩小到某个条件内。
bash
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('执行 存储用户信息到数据库 的操作...')
print('函数结束')
registerUser()
这种if语句结构,都是通过条件表达式进行判断。
跟c语言中的单分支、双分支和多分支一样的。
这些逻辑表达式,确实是需要好好地理顺才行的。
如果我们要求在输入检查条件全部通过之后,执行存储用户信息到数据库的操作,可以写到最后的else语句中。
bash
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('执行 存储用户信息到数据库 的操作...')
函数执行某个功能前,要做一些条件检查,如果这些条件任何一个不满足,后续的操作就不要做了。
bash
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('执行 存储用户信息到数据库 的操作...')
结合return语句,这种程序的可读性更好。
某个国家的计费计算:
|-------|---------|
| 里程 | 收费 |
| <= 3 | 20元/每公里 |
| > 3 | 15元/每公里 |
这是典型的双分支if-else结构:
bash
def charge(miles):
if miles <= 3:
unit = 20
else:
unit = 15
return miles * unit
print(charge(3))
print(charge(5))
那如果我们这么写:
bash
def charge(miles):
if miles <= 3:
unit = 20
if miles > 3:
unit = 15
return miles * unit
print(charge(3))
print(charge(5))
也是可以得到正确的结果。
但是这两个程序还是有区别的。
if-else,双分支结构只执行其中一个分支。而两个if语句,两个if语句都会进行判断。效率没有if-else高。
如果这个出租车的计费规则更复杂些:
|------------------|---------|
| 里程 | 收费 |
| <= 3 公里 | 20元/每公里 |
| > 3 公里 <= 5 公里 | 15元/每公里 |
| > 5 公里 <= 8 公里 | 12元/每公里 |
| > 8 公里 | 10元/每公里 |
那这种情况就用多分支结构进行处理:
bash
def charge(miles):
if miles <= 3:
unit = 20
elif 3 < miles <= 5:
unit = 15
elif 5 < miles <= 8:
unit = 12
else:
unit = 10
return miles * unit
print(charge(1))
print(charge(4))
print(charge(7))
print(charge(10))
elif后面有一个条件表达式,而else没有。
条件判断的嵌套:
bash
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
有的时候,条件判断成立或者不成立,后面要做什么,还需要再次分情况处理。
这时候往往需要在缩进的代码中再次进行条件判断。
bash
def charge(miles, duration):
if miles <= 3:
if duration <= 1:
unit = 20
return miles * unit
else:
unit = 22
return miles * unit
elif miles > 3:
if duration <= 1:
unit = 15
return miles * unit
else:
unit = 18
return miles * unit
另外,在这个场景中还有一些比较特殊的情况。
要细心地对这些进行梳理,各种情况,把程序才能写好。细心和耐心。