#到目前为止,我们编写的程序都是简单的按语句顺序一条一条执行的,本节将介绍让程序选择执行语句的方法。
1、布尔变量的作用
1 #布尔变量我们在前面的章节已经有所接触,前面的运算符中多处提到的True、False就是布尔变量,布尔变量一般对应的是布尔值(也称作真值,布尔值这个名字是根据对真值做过大量研究的George Boole命名的)。 2 #下面的值在作为布尔表达式时,会被解释器看作假(false): 3 False None0 ""()[]{} 4 #换句话说,标准值False和None、所有类型的数字0(包括浮点型、长整型和其他类型)、空序列(如空字符串、空元组和空列表)以及空字典都为假。其他值都为真,包括原生的布尔值True。 5 Python中所有值都能被解释为真值,这可能不是很明白什么意思,但理解这点非常有用。在Python中,标准的真值有True和Fale两个。在其他语言中,标准的真值为0(表示假)和1(表示真)。事实上,True和False只不过是1和0的另一种表现形式,作用相同,例如: 6 >>> True 7 True 8 >>> False 9 False 10 >>> True=1 11 SyntaxError: can't assign to keyword 12 >>> True==1 13 True 14 >>> False==0 15 True 16 >>> True==0 17 False 18 >>> False==1 19 False 20 >>> True+False+2 21 3 22 #由上面的输出结果看到,在Python中,True和1等价,False和0等价。 23 #布尔值True和False属于布尔类型,bool函数可以用来转换其他值,例如: 24 >>> bool('good good study') 25 True 26 >>> bool("") 27 False 28 >>> bool(3) 29 True 30 >>> bool(0) 31 False 32 >>> bool([1]) 33 True 34 >>> bool([]) 35 False 36 >>> bool() 37 False 38 #由输出结果看到,可以用bool函数做boolean值转换。 39 #因为所有值都可以用作布尔值,所以几乎不需要对他们呢进行显示转换,Python会自动转换这些值。 40 #尽管[]和""都为假,即bool([])==bool("")==False,不过他们本身不相等,即[]!=""。其他不同类型的假值也是如此,如()!=False.
2、if语句
1 #真值可以联合使用,首先看如下代码: 2 #! /usr/bin/python3 3 # -*- coding:UTF-8 -*- 4 #if 基本用法 5 6 greeting='hello' 7 if greeting=='hello': 8 print('hello') 9 #该示例执行结果如下: 10 =================== RESTART: D:/Python/workspace/if基本用法.py =================== 11 hello 12 #该示例为if条件执行语句的一个实现示例。如果条件(在if和冒号之间的表达式)判定为真,后面的语句块(本例中是print语句)就会被执行;如果条件判定为假吗,语句块就不会被执行,
1 #上图中的小黑点为if语句的起点,往后执行到条件语句(条件语句如greeting=='hello'),如果条件为真,就执行条件代码,然后结束这个if条件语句;如果条件为假,就跳过这段条件代码,这个if条件语句就直接结束。 2 #在if语句块中还可以执行一些复杂操作,例如: 3 #! /usr/bin/python3 4 # -*- coding:UTF-8 -*- 5 #if 基本用法 6 7 8 greeting='hello' 9 if greeting=='hello': 10 student={'小智':'1001','小明':'1002','小强':'1003','小王':'1004'} 11 print('字典元素个数为:%d个'%len(student)) 12 student.clear() 13 print('字典删除后元素个数为:%d个'%len(student)) 14 =================== RESTART: D:/Python/workspace/if基本用法.py =================== 15 字典元素个数为:4个 16 字典删除后元素个数为:0个 17 #此处的if语句块由多条语句组成,编写过程中要注意保持语句的缩进一致,否则在执行时会报错。 18 #if语句的条件判定除了使用==外,还可以使用>(大于)、<(小于)、>=(大于等于)、<=(小于等于)等条件符表示大小关系。除此之外,还可以使用各个函数或方法返回值作为条件判定。使用条件符的操作和使用==一样,使用函数或表达式的操作在后面继续详细介绍。 19 #在练习的过程中,要习惯编写示例中开头两行的写法,即一下两行代码: 20 #! /usr/bin/python3 21 # -*- coding:UTF-8 -*- 22 #习惯写这两行代码可以帮助我们在代码移植和编码问题上避免很多问题。代码移植时,如果从windows移植到linux系统上,就必须加上第一行代码。代码中有中文时,如果不加第二行,就很容易出现乱码的情况。
3、else子句
1 #在if语句的示例中,当greeting的值为hello时,if后面的条件执行结果为True,进去下面的语句块执行相关语句。如果greeting的值不是hello,就不能进入语句块,如果想显示相关提示,比如告诉我们greeting的值不为hello或执行的不是if中的语句快,该怎么操作呢?示例如下: 2 #! /usr/bin/python3 3 # -*- coding:UTF-8 -*- 4 #else子句的用法 5 6 greeting='hi' 7 if greeting=='hello': 8 print('hello') 9 print('该语句块在if中,greeting的值是hello') 10 else: 11 print('该语句块不在if中,greeting的值不是hello') 12 #这段程序加入了一个新条件子句--else子句。之所以叫子句,是因为else不是独立语句,只能作为if语句的一部分。使用else子句可以增加一种选择。 13 #该程序的输出结果如下: 14 ==================== RESTART: D:/Python/workspace/else.py ==================== 15 该语句块不在if中,greeting的值不是hello 16 #由输出结果看到,if语句块没有被执行,执行的是else子句中的语句块。同if语句一样,else子句中的语句块也可以编写复杂语句。 17 #需要注意的是else子句后面没有条件判定。
4、elif子句
1 #在else子句的示例中,如果除if条件外,还有多个子条件需要判定,该怎么办? 2 #Python为我们提供了一个elif子句,elif是else if的简写,意思为具有条件的else的子句,例如: 3 #! /usr/bin/python3 4 # -*- coding:UTF-8 -*- 5 #elif子句的用法 6 7 num=10 8 if num>10: 9 print('num的值大于10') 10 elif 0<=num<=10: 11 print('num的值介于0到10之间') 12 else: 13 print('num的值小于10') 14 #由以上程序可知,elif需要和if、else子句联合使用,不能独立使用,并且必须以if语句开头,可以选项是否以else子句结尾。 15 #程序的输出结果如下: 16 ==================== RESTART: D:/Python/workspace/elif.py ==================== 17 num的值介于0到10之间 18 #由输出结果得知,这段程序执行的是elif子句中的语句块,即elif子句的条件判定结果为true,所以执行这个子句后的语句块。
5、嵌套代码块
1 #我们前面讲述了if语句、else子句、elif子句,这几个语句可以进行条件的选择判定,不过我们在实际的开发过程中可能需要一些更加复制的操作,例如: 2 #! /usr/bin/python3 3 # -*- coding:UTF-8 -*- 4 #嵌套代码块 5 6 num=10 7 if num%2==0: 8 if num%3==0: 9 print('你输入的数字可以整除2和3') 10 elif num%4==0: 11 print('你输入的数字可以整除2和4') 12 else: 13 print('你输入的数字可以整除2,但不能整除3和4') 14 else: 15 if num%3==0: 16 print('你输入的数字可以整除3,但不能整除2') 17 else: 18 print('你输入的数字不能整除2和3') 19 #由上面的程序可知,在if语句的语句块中还存在if语句、语句块以及else子句,else子句的语句块也存在if语句和else子句。 20 #上面的程序输出结果如下: 21 =================== RESTART: D:/Python/workspace/嵌套代码块.py =================== 22 你输入的数字可以整除2,但不能整除3和4 23 #由输出结果看到,执行的是if语句块中的else子句的语句块。 24 #在Python中,该示例使用的这种结构的代码称作嵌套代码。所谓嵌套代码,是指把if、else、elif等条件语句再放入if、else、elif条件语句块中,作为深层次的条件判定语句。
6、更多操作
1 #前面的章节了解了运算符,这里将对其中一下设计条件运算的运算符做进一步的了解。 2 ①、is:同一性运算符 3 #is运算符比较有趣,例如: 4 >>> x=y=[1,2,3] 5 >>> z=[1,2,3] 6 >>> x==y 7 True 8 >>> x==z 9 True 10 >>> x is y 11 True 12 >>> x is z 13 False 14 #再最后一个语句之前,一切看起来都很好,都在意料之中,不过最后一个语句却出现了问题,为什么x和z相等却不相同呢? 15 #这是因为is运算符用于判定同一性而不是相等性。变量x和y被绑定在同一个列表上,而变量z被绑定在另一个具有相同数量和顺序的列表上。他们的值可能相等,却不是同一个对象。 16 #也可以从内存的角度思考,即它们所指向的内存空间不一样,x和y指向同一块内存空间,z指向另一块内存空间。 17 #再来看示例: 18 >>> x=[1,2,3] 19 >>> y=[1,5] 20 >>> x is not y 21 True 22 >>> del x[2] 23 >>> x 24 [1, 2] 25 >>> y[1]=2 26 >>> y 27 [1, 2] 28 >>> x==y 29 True 30 >>> x is y 31 False 32 #在上面的程序中,列表x和y一开始是不同的列表,后面将列表值更改为相等,但还是两个不同的列表,即两个列表值相等却不等同。 33 #总上所述,使用==运算符判定两个对象是否相等,使用is判定两个对象是否等同(是否为同一对象)。 34 35 ②、比较字符串和序列 36 #字符串可以按照字母排列顺序进行比较,我们在前面的章节已经了解了。 37 #其他序列比较的不是字符串而是元素的其他类型,例如: 38 >>> [1,2]<[2,1] 39 True 40 >>> [1,2]>[2,1] 41 False 42 >>> [1,2]==[1,2] 43 True 44 >>> [1,2]==[2,1] 45 False 46 #由操作结果看到,也可以对列表进行操作。 47 #如果一个序列中包括其他序列元素,比较规则也适用于序列元素,例如: 48 >>> [2,[1,2]]<[2,[1,3]] 49 True 50 >>> [2,[2,2]]<[2,[1,3]] 51 False 52 #由操作结果看到,也可以对嵌套列表进行比较操作。 53 54 ③、布尔运算符 55 #我们已经讲述了不少布尔运算的操作,不过有时要检查一个以上的条件,如果按照前面的操作方式,就会多走一些弯路,例如: 56 #! /usr/bin/python3 57 # -*- coding:UTF-8 -*- 58 #布尔运算符 59 60 num=10 61 if num<=10: 62 if num>=5: 63 print('num的值介于5到10之间') 64 else: 65 print('num的值不介于5到10之间') 66 else: 67 print('num的值不介于5到10之间') 68 #上面的程序在写法上没什么问题,但是走了一些不必要的弯路,可以将代码编写得更简介: 69 #! /usr/bin/python3 70 # -*- coding:UTF-8 -*- 71 #布尔运算符 72 73 num=10 74 if num<=10 and num>=5: 75 print('num的值介于5到10之间') 76 else: 77 print('num的值不介于5到10之间') 78 #或者 79 if 5<= num <=10: 80 print('num的值介于5到10之间') 81 else: 82 print('num的值不介于5到10之间') 83 #上面的程序明显更加简洁、易懂。 84 #and运算符用于连接两个布尔值,并在两者都为真时返回真,否则返回假。与and同类的还有or和not两个运算符。 85 #布尔运算符有一个有趣的特性:只有在需要求值时才求值。举例来说,表达式x and y需要两个变量都为真时才为真,所以如果x为假,表达式就会立刻返回false,无论y的值是多少。实际上,如果x为假,表达式就会返回x的值,否则返回y的值。这种行为被称为短路逻辑(short-circuit logic)或惰性求值(lazy evaluation)。布尔运算符通常被称为逻辑运算符,这种行为同样适用于or。在表达式x or y中,x为真时直接返回x的值,否则返回y值。注意,这意味着在布尔运算符后面的代码都不会被执行。
7、断言
1 #在Python中,有一个和if语句工作方式非常相近的关键字,其工作方式类似如下伪代码: 2 if not condition: 3 crash program 4 #在Python中为什么需要这样的代码呢? 5 #在没完善一个程序之前,我们不知道程序会在哪里出错,与其在运行时崩溃,不如在出现错误条件时就崩溃。一般来说,可以要求一些条件必须为真。在Python中,assert关键字能实现这种工作方式,例如: 6 >>> x=3 7 >>> assert x>0,"x is not zero or negative" 8 >>> assert x%2==0,"x is not an even number" #提示x不是偶数 9 Traceback (most recent call last): 10 File "<pyshell#23>", line 1, in <module> 11 assert x%2==0,"x is not an even number" #提示x不是偶数 12 AssertionError: x is not an even number 13 #由上面的输出结果看到,当assert后面的条件为真时,程序正常运行;当assert后面的条件为假时,输出错误信息。错误的提示信息由我们自己定义,这个错误提示信息可以称为异常参数。asser的异常参数是在断言表达式后添加的字符串信息,用来解释断言并更容易知道问题出在哪里。 14 #使用assert断言是学习Python的好习惯,Python assert断言句语格式及用法很简单。 15 #使用asser断言时,要注意以下几点: 16 ①、assert断言是用来声明某个条件是真的。 17 ②、如果你非常确信你使用的列表中至少有一个元素,想要检验这一点,并在它非真时引发一个错误,那么assert语句在这种情况下就很合适了。 18 ③、assert语句失败时,会引发一个assertionERROR。