HOWTO · Python

Python 中的 if not 语句

本教程演示了在 Python 中使用 if not 语句。

本页内容

Python 的 if not 语法会在 not 后的表达式为假时执行代码块。它适合明确表达否定条件,例如检查是否尚未达到某个阈值、某个标志是否为假,或集合中是否没有项目。代码块仍须遵守 if 语句通常的缩进规则。

Python 中 if not 的含义

not 是布尔运算符,会将其后表达式的真值反转。Python 会先计算比较,再计算 not,因此 if not x > 10: 的意思是“如果 x > 10 为假”。它等价于 if not (x > 10):。这并不表示 if 本身有一个通用的相反形式。对于较长的条件,加上括号有助于看清预期的分组方式。

运行下面的示例:

本节中的代码以及显示的标签或输出仍为英文。

x = 5

if not x > 10:
    print("x is not greater than 10")

当 x = 5 时,x > 10 为假,因此 not 会使条件变为真,Python 随即进入缩进代码块。如果 x 大于 10,条件就会为假,代码块会被跳过。示例打印的内容是“x is not greater than 10”,这段英文文本在代码中保持原样。

在比较和布尔值中使用 if not

你可以像上面那样直接否定比较结果,也可以测试布尔变量。例如,if not is_logged_in: 会在 is_logged_in 为 False 时进入代码块。与显式地将布尔值和 == False 比较相比,这种写法通常更清楚;变量名应表达其含义,让条件读起来自然。

也可以用不同的运算符改写比较,使其采用肯定形式。例如,对于普通数值,not (x == 10) 和 x != 10 表示相同的测试。选择最容易读懂的写法。如果括号能帮助区分被否定的表达式与其他条件,就保留括号。

检查集合是否为空

列表、元组、字典和集合等内置容器在不含任何项目时,在条件判断中为假。因此,if not items: 是处理空集合的一种简洁写法。非空容器为真,即使其中一个或多个元素本身是假值也一样。其他常见的假值包括 False、None、数值零和空字符串;自定义对象可以定义自己的真值,因此不要假设所有对象都遵循容器的行为。

本节中的代码以及显示的标签或输出仍为英文。

items = []

if not items:
    print("The list is empty.")

这项检查可让程序在处理列表前,先选择处理空列表的路径。但它本身不能确保之后的索引操作安全:代码仍须避免访问不存在的元素。示例打印“ The list is empty.”这段英文文本在代码中保持原样。

检查某个项目是否不在集合中

要测试某个值是否不存在,请使用 Python 的成员运算符 not in。与在成员资格测试前写 not 相比,这种写法更直接地表达了意图。例如,if 4 not in numbers: 只会在 4 不是 numbers 的元素时执行代码块。等价的分组写法 if not (4 in numbers): 也有效,但 not in 是更惯用的形式。

本节中的代码以及显示的标签或输出仍为英文。

numbers = [1, 2, 3]

if 4 not in numbers:
    print("4 is missing")

成员资格检查适用于列表、字符串、集合和字典键。对于字典,item in mapping 检查的是键;它不会搜索字典的值。示例打印“4 is missing”,这段英文文本在代码中保持原样。

将 if not 与其他条件组合

如果每个条件都必须为真,就将否定测试与 and 组合;如果至少一个条件为真即可,就与 or 组合。Python 会先计算 not,再计算 and 和 or;对于较复杂的逻辑,可以使用括号明确表达。应从所需状态出发理解整个条件,因为否定两个以 and 连接的独立条件,与否定组合后的整个表达式并不相同。

本节中的代码以及显示的标签或输出仍为英文。

is_logged_in = False
is_admin = False

if not is_logged_in and not is_admin:
    print("Access denied. Please log in.")
else:
    print("Continue")

在这个示例中,两个否定条件都为真,因此会执行第一个代码块。如果任一标志为真,组合后的 and 条件就为假,于是会执行 else 代码块。示例打印的英文内容是“Access denied. Please log in.”或“Continue”,这些文本在代码中保持原样。else 分支处理的是条件的另一种结果;它不会改变 not 对其表达式的求值方式。