Python中且或非怎么写?and、or、not关键字用法详解

小鹿同学
小鹿同学
发布时间:2026-10-20 | 3人浏览过
原创

假设你正在编写一个系统校验逻辑:需要确认“账号状态正常”且“密码输入正确”,或者“用户属于管理员组”或“具备临时授权”,同时还要断言“该账号没有被风控锁定”。许多有 C、Java 或 JavaScript 基础的开发者直觉会去寻找 &&、|| 和 !。但在 Python 中,逻辑上的“且、或、非”并不使用符号,而是直接采用纯英文小写单词:and(且)、or(或)与 not(非)。本文将系统梳理这三个关键字的具体写法、运行逻辑、短路机制与典型避坑细节。

一、核心写法与对照:为什么不是 &&、||、!

在 Python 语言设计哲学中,强调代码的可读性与接近自然语言的表达。因此布尔逻辑运算直接使用单词定义:

  • 且(AND):使用关键字 and。当且仅当左右两边条件均为真时,整体判定为真。
  • 或(OR):使用关键字 or。左右两边只要有一个条件为真,整体判定即为真。
  • 非(NOT):使用关键字 not。单目运算符,用于反转后面的布尔值,真变假、假变真。
特别提醒:切勿将 and、or、not 错写成 &、|、~。在 Python 中,& 和 | 是按位运算符(Bitwise Operators),用于对整数的二进制位进行逐位计算,运算优先级高于比较运算符,并不等同于条件判断中的逻辑控制。如果在条件语句中乱用 &,往往会导致难以排查的语法或逻辑异常。
Python中且或非怎么写?and、or、not关键字用法详解
图 1:Python 逻辑运算符与常见语言语法对照及核心特性矩阵

二、and 关键字(逻辑且)的具体应用

and 连接两个或多个条件,只有当所有参与判断的子条件全部成立时,整个组合表达式的结果才为真。只要其中任何一个条件判断为假,结果就直接判定为假。

基础布尔运算示例

# 基础布尔测试
print(True and True)    # 输出: True
print(True and False)   # 输出: False
print(False and False)  # 输出: False

# 实际业务场景:多维度筛选
user_age = 25
has_driving_license = True

if user_age >= 18 and has_driving_license:
    print("满足驾驶准入资格")
else:
    print("暂不符合准入条件")

在上面的业务示例中,只有当 user_age >= 18 为 True 且 has_driving_license 为 True 时,才会进入租车资格分支。

三、or 关键字(逻辑或)的具体应用

or 同样连接多个子条件,只要其中任意一个条件满足要求(值为真),整个表达式的判断即可通过。只有当所有子条件全部为假时,结果才为假。

基础使用与备选降级

# 基础布尔测试
print(True or False)   # 输出: True
print(False or False)  # 输出: False

# 场景:权限认证(满足任一身份即可操作)
is_superadmin = False
is_project_owner = True

if is_superadmin or is_project_owner:
    print("允许修改当前项目配置")

四、not 关键字(逻辑非)的具体应用

not 属于单目运算符,放在单个条件或布尔变量的前面。其作用是将原本为 True 的值翻转为 False,将原本为 False 的值翻转为 True。

常见写法与 Pythonic 规范

is_connected = False

# 正确且地道的 Pythonic 写法
if not is_connected:
    print("网络连接已断开,正在尝试重连...")

# 不推荐的冗余写法(初学者容易犯的代码繁琐)
# if is_connected == False:

在 Python 中,直接使用 if not x: 远比 if x == False: 更推荐。这不仅更加精练,而且能利用 Python 的真假值判定机制对空列表、None 等空值对象进行优雅过滤。

五、深度机制:短路求值(Short-circuit Evaluation)

Python 解释器在执行 and 与 or 运算时,遵循严格的从左到右求值顺序,并采用短路求值策略。短路求值是指:一旦根据左侧表达式已经能够绝对确定整个逻辑式的最终结果,解释器将立即停止执行,右侧所有剩余表达式均不再被执行或计算。

短路规则明确定义:

  1. 对于 A and B: 解释器首先计算 A。如果 A 为假,无论 B 是什么,整个式子都不可能为真。此时发生短路,直接结束判定,B 完全不被执行。
  2. 对于 A or B: 解释器首先计算 A。如果 A 为真,无论 B 是什么,整个式子必然已经为真。此时发生短路,直接结束判定,B 完全不被执行。
Python中且或非怎么写?and、or、not关键字用法详解
图 2:Python 解释器在 and 与 or 下的短路求值分支流程与提前返回机制

利用短路机制进行安全防御编程

短路机制在实战中非常实用,常用于避免程序发生运行时抛错(如空指针、键不存在或除零错误):

# 场景 1:防御除零错误(ZeroDivisionError)
count = 0
total = 100

# 如果 count 为 0,左边 count != 0 判定为假,右边 total / count 永远不会被执行
if count != 0 and (total / count) > 10:
    print("均值达标")
else:
    print("样本为0或均值未达标")

# 场景 2:防止字典键访问或对象为空报错
user_profile = None
# 若 user_profile 为 None,左边判定为假,右边访问属性的操作自动短路跳过
if user_profile is not None and user_profile.is_active:
    print("有效活跃用户")

六、进阶本质:返回值不只是 True/False

许多初学者认为 and 和 or 运算的最终结果一定是一个布尔值(True 或 False)。其实不然!

在 Python 底层,任何对象都可以参与真值测试(Truthy & Falsy)。and 与 or 运算符返回的本质是“最终决定表达式真假的那个操作数本身”,而不是一个新创建的布尔类型。

Python 中常见假值对象(Falsy):

  • 数值类的零:0, 0.0, 0j
  • 空序列与集合:""(空字符串), [](空列表), ()(空元组), {}(空字典), set()
  • 特殊常量:None, False

除了上述明确列出的对象外,绝大多数对象在默认情况下都被视作真值(Truthy)。

Python中且或非怎么写?and、or、not关键字用法详解
图 3:Python 真假值测试(Truthy/Falsy)规则与逻辑操作数直接返回推导演示

利用 or 赋予默认值(Fallback)的经典技巧

# 传统方式
input_str = ""
if input_str:
    user_name = input_str
else:
    user_name = "匿名用户"

# 利用 or 的返回值特性的优雅单行写法
user_name = input_str or "匿名用户"
print(user_name)  # 输出: 匿名用户

由于空字符串 "" 被视作假值,or 运算符将继续评估右侧表达式并将其作为最终结果返回。如果 input_str 为 "张三",其为真值直接短路返回,user_name 即为 "张三"。

七、运算符优先级与高频避坑指南

当多个逻辑运算符与算术、比较运算符混用在同一个表达式中时,必须清楚它们的执行顺序。逻辑运算符的优先级从高到低依次为:

  1. not(最高,单目操作)
  2. and(次之)
  3. or(最低)
Python中且或非怎么写?and、or、not关键字用法详解
图 4:运算符优先级层级体系与条件判断常见陷阱对照解析

陷阱一:误写为 if x == 1 or 2:

很多新手希望能判断变量 x 是否是 1 或 2,于是直觉写成:

x = 5

# 错误示范:
if x == 1 or 2:
    print("x 是 1 或者 2")  # 此行必然会被错误执行!

原因剖析:根据优先级规则,== 优先于 or 计算,该式会被解释为 (x == 1) or (2)。虽然 x == 1 为 False,但右侧的数字 2 是一个非零数值,其真假值判定始终为 True!因此整个 if 分支永远为真。

规范修正方法:

# 规范写法 1:分别书写完整子条件
if x == 1 or x == 2:
    pass

# 规范写法 2:利用 in 操作符(推荐,更适合多值匹配)
if x in (1, 2):
    pass

陷阱二:混淆 not a == b 与 a != b

虽然 not a == b 在语法上等同于 not (a == b),最终能得到不等于的效果,但在可读性上容易引起维护者的困惑。对于值不相等的判断,应当直接使用 a != b,清晰明确。

特性妙用:优雅的链式连续比较

如果需要判定一个数值是否处于某个开闭区间内,在许多语言中必须使用 && 连接两段比较,如 x >= 10 && x <= 20。而 Python 支持直接像数学公式一样连续书写:

score = 85

# 推荐写法:Python 独有的链式比较
if 80 <= score <= 90:
    print("良好评级")

# 等价于显式 and 连接:
# if 80 <= score and score <= 90:

Python 解释器会自动将其展开为 and 逻辑,并且保证中间的操作数只会被求值一次,既保证了执行效率,又极大提升了代码阅读舒适度。

八、总结回顾

掌握 Python 中的且、或、非,核心可归纳为以下四点:

  • 语法形式:使用纯英文关键字 and(且)、or(或)、not(非),严禁使用 &&、||、!。
  • 短路求值:从左向右执行,and 遇到首个假值即止,or 遇到首个真值即止,善用该特性规避空引用和除零异常。
  • 本质返回:操作符返回的是决定最终真假的操作数原型,常用于 val = x or default 的备选赋值。
  • 优先原则:优先级为 not > and > or。对于复杂的组合条件表达式,始终推荐使用圆括号 () 显式划分层级。
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表