程序控制语句
1. 布尔类型
概要
在跟踪程序状态或程序中重要的条件方面,布尔值提供了一种高效的方式。
bool
类型其实是 int
类型的字类:
isinstance(True, bool) # True
isinstance(False, bool) # True
isinstance(True, int) # True
isinstance(False, int) # True
在 Python 中,可以使用关键字 and, or, not
来执行布尔运算:
True and False # False
False or True # True
(30 > 45) or (27 < 30) # True
not True # False
not (3 > 4) # True
注意:尽管按照优先级规则上述括号可以消去,但是适当加入括号增强其可读性也是非常有用的。
and
运算符被隐式链接在以下布尔表达式中:a < b < c # a < b and b < c a == b == c # a == b and b == c
运算优先级
- 最高:
<, >, <=, >=, !=, ==
- 次之:
not
- 最低:
and, or
短路运算
布尔运算符
and
和or
也被称为短路运算符:它们的参数从左至右解析,一旦可以确定结果解析就会停止。例如,如果 A 和 C 为真而 B 为假,那么 A and B and C 就不会解析 C 了。当作用于普通值而非布尔值时,短路操作符的返回值是一个变量:
x and y
: 若 x 为假,返回 x,否则,直接返回 y。def and_as_function(x, y): """x and y 与之等价""" if not x: return x else: return y
实际上,
and
运算表达式中: 有假则返回假;无假则返回最后一个真。x or y
:若 x 为真,返回 x,否则,直接返回 y。def or_as_function(x, y): """x or y 与之等价""" if x: return x else: return y
实际上,
or
运算表达式中:有真则取第一个真;无真则返回假。
有趣的是这意味着,当执行语句
True or x
时,变量 x 不必被定义,因为它总是返回True
. 同样地,这也适用于语句False and x
.
布尔值的转换规则
Bool | False | True |
---|---|---|
string | '' | 非空字符串 |
number | 0 | 非零 |
list | [] | 非空列表 |
tuple | () | 非空元组 |
array | array([]), array([0]) | $array([a])(a\neq0)$ |
若array数组含一个以上元素,异常。
2. 循环语句
循环语句都可带有else
子句,它会在循环耗尽一可迭代对象(使用for
)或循环条件变为假值(使用while
)时被执行,但如果此循环被break
语句终止则不会执行else
子句。
也就是说,这里的
else
子句更像try…except
语句中的else
子句,而不像if…else…
语句中的else
子句。
使用range()
函数时,还可指定步长:
list(range(2, 11, 2)) # [2, 4, 6, 8, 10]
活用标志:在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态,这个变量被称为标志,充当了程序的交通信号灯。可以让程序在标志为True
的时候继续运行,并在任何事件导致标志的值为False
时让程序停止运行:

拓展思路:以while True打头的循环将不断运行,直到遇到break语句。
for
循环是一种遍历列表的有效方式,但在for
循环中不应修改列表,否则将导致Python难以跟踪其中的元素。若要在遍历列表的同时对其进行修改,可使用while
循环。



双循环列表解析表达式:
>>> [(a,b) for a in range(3) for b in range(4,6)]
[(0, 4), (0, 5), (1, 4), (1, 5), (2, 4), (2, 5)]
相当于:
>>> tar = []
>>> for a in range(3):
... for b in range(4,6):
... tar.append((a,b))
...
>>> tar
[(0, 4), (0, 5), (1, 4), (1, 5), (2, 4), (2, 5)]
3. 条件语句
if
条件和对应的执行语句若想放一行必须同时写上 else
和 相应的执行语句:

return
语句同上,若放在一行必须同时有 if
和 else
.
else
是一句包罗万象的语句,只要不满足任何if
或elif
中的条件测试,其中的代码就会执行,这可能会引入无效甚至恶意的数据。if-elif-else
结构功能强大,但仅适合用于只有一个条件满足的情况:遇到通过了的测试后,Python就跳过余下的测试。