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