使用布尔值进行分支逻辑,是Python语言开发的必要方式。
Python有一种叫做bool的变量类型。它有两个可能的值:True和False。
x = True
print(x)
print(type(x))
与其直接在我们的代码中放置True或False,我们通常从布尔运算符中获得布尔值。这些运算符是用来回答是/否问题的运算符。我们将在下面介绍一些这些运算符。
操作 | 描述 | 操作 | 描述 | |
---|---|---|---|---|
a == b |
a 等于 b |
a != b |
a 不等于 b |
|
a < b |
a 小于 b |
a > b |
a 大于 b |
|
a <= b |
a 小于等于 b |
a >= b |
a 大于等于 b |
def can_run_for_president(age):
"""Can someone of the given age run for president in the US?"""
# The US Constitution says you must be at least 35 years old
return age >= 35
print("Can a 19-year-old run for president?", can_run_for_president(19))
print("Can a 45-year-old run for president?", can_run_for_president(45))
“比较”通常能够达到你的期望。
3.0 == 3
但有时候,它们(这些操作)可能会有些麻烦。
'3' == 3
比较运算符可以与我们已经看到的算术运算符结合使用,用于表示几乎无限的数学测试范围。例如,我们可以通过检查一个数与2的模余是否为1来判断该数是否是奇数:
def is_odd(n):
return (n % 2) == 1
print("Is 100 odd?", is_odd(100))
print("Is -1 odd?", is_odd(-1))
记得在进行比较时使用==而不是=。如果你写n == 2,你是在询问n的值。当你写n = 2时,你是在改变n的值。
您可以使用“and”、“or”和“not”的标准概念来组合布尔值。实际上,用于进行组合的操作符是:and、or和not。
使用这些操作符,我们可以使我们的can_run_for_president函数(下面这个函数)更准确。
def can_run_for_president(age, is_natural_born_citizen):
"""Can someone of the given age and citizenship status run for president in the US?"""
# The US Constitution says you must be a natural born citizen *and* at least 35 years old
return is_natural_born_citizen and (age >= 35)
print(can_run_for_president(19, True))
print(can_run_for_president(55, False))
print(can_run_for_president(55, True))
您刚才猜到这些表达式的值了吧?
True or True and False ?
要回答这个问题,你需要弄清楚操作的顺序。
比如,“与”运算在“或”运算之前进行计算。这就是为什么上面的第一个表达式是True。如果我们从左到右进行计算,我们首先会计算出True “or” True(结果是True),然后将结果与False进行“与”运算,得到最终的值False。
你可以试着记住运算的优先顺序,但更安全的方法是使用大量的括号。这不仅有助于防止错误,还可以让阅读你代码的人更清楚你的意图。
例如,考虑以下表达式:
为天气做准备 = 带伞 or 雨大的程度 < 5 and 带帽子 or not 雨大的程度 > 0 and 是否为工作日
我想说的是,从今天的天气来看,只要我有伞,或者雨不太大并且我有帽子,我是安全的。除非是下雨的工作日,否则我还好。
但是我的Python代码不仅难以阅读,还有一个错误。通过添加一些括号,我们可以解决这两个问题。
为天气做准备 = 带伞 or (雨大的程度 < 5 and 带帽子) or not (雨大的程度 > 0 and 是否为工作日)
如果你认为它有助于可读性,可以添加更多的括号。
为天气做准备 = 带伞 or ((雨大的程度 < 5) and 带帽子) or (not (雨大的程度 > 0 and 是否为工作日))
我们还可以将其拆分成多行,以强调上述的三部分结构。
为天气做准备 = ( 带伞 or ((雨大的程度 < 5) and 带帽子) or (not (雨大的程度 > 0 and 是否为工作日)) )
布尔值在与条件语句结合时最为有用,使用关键字 if,elif 和 else。
条件语句,通常被称为if-then语句,允许你基于某个布尔条件的值来控制运行哪些代码片段。这里举个例子:
def inspect(x):
if x == 0:
print(x, "is zero")
elif x > 0:
print(x, "is positive")
elif x < 0:
print(x, "is negative")
else:
print(x, "is unlike anything I've ever seen...")
inspect(0)
inspect(-15)
if和else关键字在其他语言中经常被使用;更加独特的关键字是elif,是"else if"的缩写。
在这些条件子句中,elif和else块是可选的;此外,您可以包含任意数量的elif语句。
请特别注意使用冒号(:)和空格来表示代码的分离块。这与我们定义函数时的情况类似 - 函数头以冒号(:)结尾,下一行缩进4个空格。所有随后的缩进行都属于函数的主体,直到我们遇到一个未缩进的行,结束函数定义。
def f(x):
if x > 0:
print("Only printed when x is positive; x =", x)
print("Also only printed when x is positive; x =", x)
print("Always printed, regardless of x's value; x =", x)
f(1)
f(0)
我们已经见过int()函数(它将对象转换为整数),以及float()函数(它将对象转换为浮点数),所以你可能不会感到惊讶,Python还有一个bool()函数(它将对象转换为布尔值)。
print(bool(1)) # all numbers are treated as true, except 0
print(bool(0))
print(bool("asf")) # all strings are treated as true, except the empty string ""
print(bool(""))
# Generally empty sequences (strings, lists, and other types we've yet to see like lists and tuples)
# are "falsey" and the rest are "truthy"
我们可以在if条件和其他需要布尔值的地方使用非布尔对象。Python会隐式地将它们视为它们对应的布尔值。
if 0:
print(0)
elif "spam":
print("spam")
你可能没有意识到自己已经学到了多少。去试试实践性的编码问题,你会惊喜地发现你能做到多少。去尝试吧!