本文将探索:
【探索内容】
到此之前,我们所写的程序,语句都是逐条执行的。条件语句,可以使得程序选择是否执行特定的语句块。
所谓的选择执行在我们生活中很常见:如果明天疫情结束,我们就去外面吃火锅庆祝(当然也可说:如果明天疫情结束,我们就去外面吃火锅庆祝;否则,我们就在家学习。)如果你点赞,作者就会很开心。等等。我们需要判断假设条件是真或假(即假设条件是否发生),明天疫情结束吗?你会给作者点赞吗?
而在计算机中,通过布尔值表明True(真)或False(假)。
1.布尔值
布尔值也称真值,是以在真值方面做出了巨大贡献的George Boole命名的。用作布尔表达式(如用作if语句中的条件)时,下面的值都将被解释器视为假:
False None 0 "" () [] {}
标准值False和None、各种类型(包括浮点数、复数等)的数值0、空序列(如空字符串、空元组和空列表)以及空映射(如空字典)都被视为假,而其他各种值都被视为真(包括特殊值True)。
虽然可供选择的真值非常多,但标准真值为True和False,实际上, True和False不过是0和1的别名。
布尔值True和False属于类型bool,而bool与list、 str和tuple一样,可用来转换其他的值。
2. if 语句
这就是if语句,能够有条件地执行代码。这意味着如果条件( if和冒号之间的表达式)为前面定义的真,就执行后续代码块(这里是一条print语句);如果条件为假,就不执行。
你或许注意到了,栗子第3行代码前面有一些空格,实际上,python通过缩进代码(即在前面加4个空格或者直接按下Tab键,注意二者不要混用)来创建代码块。代码块是一组语句,可在满足条件时执行( if语句),可执行多次(循环),等等。
3. else子句
如果你愿意,可使用else子句增加一种选择(之所以叫子句是因为else不是独立的语句,而是if语句的一部分)。
当输入86后,计算机判断if语句中grade >= 90不成立,将跳过下一行(即栗子中第3行)缩进的代码块,来到第4行else子句,而后进入else子句内部,继续运行第5行内容。即没有执行第一个代码块(因为条件为假),将进入第二个代码块。
4. elif 子句
有时候,要检查多个条件,可使用elif。 elif是else if的缩写,由一个if子句和一个else子句组合而成,也就是包含条件的else子句。
注:if语句,当其中的一个条件满足,执行相应代码块后,直接跳出if语句。如栗子中,程序从第1行开始运行,而后第2行,发现条件不成立,跳过第三行代码块,来到第4行,条件成立,执行第5行,而后不再执行第6~11行内容。
5.更复杂的条件
来瞅瞅条件执行中最有趣的部分——条件本身。
5.1比较运算符
在python中有8种比较运算符,还有两种具有相同语法优先级的运算in
和not in
,它们被iterable或实现了__contains__()
方法的类型所支持。
特别注意,x==y 和x is y的区别;x == y 意味着变量x及变量y指向的内存中,存储的数据相等;而x is y 意味着变量x及变量y指向同一个内存地址。特别注意:不要将is用于数和字符串等不可变的数据类型。鉴于Python在内部处理这些对象的方式,这样做的结果是不可预测的。
5.2 布尔运算符(逻辑运算符) --- and
, or
, not
这些属于布尔运算,按优先级升序排列:
注释:
- 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。
- 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。
not
的优先级比非布尔运算符低,因此not
a
==
b
会被解读为not
(a
==
b)
而a
==
not
b
会引发语法错误。
即布尔运算符有趣的特征:只做必要的计算。例如,仅当x和y都为真时,表达式x and y才为真。因此如果x为假,这个表达式将立即返回假,而不关心y。
【题外话】
1.本节对于小白极易出错地方,冒号漏写,或错写为分号或中文状态下冒号,或者不该出现冒号的地方强行添加冒号;
2.注意缩进格式时,不要tab键和空格键混合用。养成一个好习惯会受益无穷,而坏习惯有时候虽然也能运行出正确结果,但是为未来埋下了bug的种子,后患无穷。
【挑战】
1.思考栗子中问题出在哪里?