布尔值(Booleans)

Python 有一种类型叫做 bool,它只有两个可能的取值:TrueFalse

x = True
print(x)
print(type(x))

通常我们不是直接在代码中写 TrueFalse,而是通过布尔运算符来得到布尔值。
这些运算符用于回答是/否类型的问题。
下面我们将介绍常见的运算。

比较运算(Comparison Operations)

操作 含义
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):
    """判断给定年龄的人能否在美国竞选总统?"""
    # 美国宪法规定必须至少 35 岁
    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))

比较通常与预期一致:

print(3.0 == 3)

但有时也会令人困惑:

print('3' == 3)

比较运算可以与算术运算结合使用来表示各种数学测试。
例如,可以通过取模来检测奇数:

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 的值是否等于 2,而写 n = 2 则是把 2 赋值给 n。

布尔值的组合

可以使用 andornot 来组合布尔值。
下面把前面的函数做得更准确一些:

def can_run_for_president(age, is_natural_born_citizen):
    """判断给定年龄和公民身份的人是否能在美国竞选总统?"""
    # 美国宪法规定必须是天生公民并且至少 35 岁
    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))

快速猜一猜下面这个表达式的值:

print(True or True and False)

为了解这个表达式,需要知道运算优先级。
andor 之前被求值,所以上面的表达式是 True
如果从左到右先算 True or True,结果为 True,再与 Falseand 会得到 False,这不是正确的求值顺序。

你可以查看优先级说明,但更好的做法是多用括号,既能避免错误也能让代码更易读。

例如,考虑:

prepared_for_weather = have_umbrella or rain_level < 5 and have_hood or not rain_level > 0 and is_workday

我想表达的意思是:

  • 如果我有伞就安全;
  • 或者如果雨不大并且有帽子也安全;
  • 否则,只有在下雨并且是工作日时我才不安全。

添加括号可以修复可读性与潜在错误:

prepared_for_weather = have_umbrella or (rain_level < 5 and have_hood) or not (rain_level > 0 and is_workday)

你也可以用更多括号或分行来增强可读性:

prepared_for_weather = (
    have_umbrella 
    or ((rain_level < 5) and have_hood) 
    or (not (rain_level > 0 and is_workday))
)

条件语句(Conditionals)

布尔值最有用的场景之一是与条件语句结合,使用 ifelifelse
条件语句允许根据布尔条件决定执行哪些代码。
例如:

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)

elif 是 “else if” 的缩写;
elifelse 块都是可选的,可以有任意多个 elif

注意
冒号(:)和缩进用于表示代码块,这与定义函数时的语法相同。

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)

布尔转换(Boolean conversion)

Python 有 bool() 函数,可以将值转换为布尔值:

print(bool(1))   # 除 0 外的数字都被视为 True
print(bool(0))
print(bool("asf"))  # 非空字符串为 True
print(bool(""))
# 一般来说,空序列(字符串、列表、元组等)是 False,其他为 True

在需要布尔值的地方可以直接使用非布尔对象,Python 会隐式将其转换为相应的布尔值:

if 0:
    print(0)
elif "spam":
    print("spam")
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐