Python中且或非怎么写?and、or、not关键字用法详解
假设你正在编写一个系统校验逻辑:需要确认“账号状态正常”且“密码输入正确”,或者“用户属于管理员组”或“具备临时授权”,同时还要断言“该账号没有被风控锁定”。许多有 C、Java 或 JavaScript 基础的开发者直觉会去寻找 &&、|| 和 !。但在 Python 中,逻辑上的“且、或、非”并不使用符号,而是直接采用纯英文小写单词:and(且)、or(或)与 not(非)。本文将系统梳理这三个关键字的具体写法、运行逻辑、短路机制与典型避坑细节。
一、核心写法与对照:为什么不是 &&、||、!
在 Python 语言设计哲学中,强调代码的可读性与接近自然语言的表达。因此布尔逻辑运算直接使用单词定义:
- 且(AND):使用关键字
and。当且仅当左右两边条件均为真时,整体判定为真。 - 或(OR):使用关键字
or。左右两边只要有一个条件为真,整体判定即为真。 - 非(NOT):使用关键字
not。单目运算符,用于反转后面的布尔值,真变假、假变真。
and、or、not 错写成 &、|、~。在 Python 中,& 和 | 是按位运算符(Bitwise Operators),用于对整数的二进制位进行逐位计算,运算优先级高于比较运算符,并不等同于条件判断中的逻辑控制。如果在条件语句中乱用 &,往往会导致难以排查的语法或逻辑异常。
二、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 运算时,遵循严格的从左到右求值顺序,并采用短路求值策略。短路求值是指:一旦根据左侧表达式已经能够绝对确定整个逻辑式的最终结果,解释器将立即停止执行,右侧所有剩余表达式均不再被执行或计算。
短路规则明确定义:
- 对于
A and B: 解释器首先计算A。如果A为假,无论B是什么,整个式子都不可能为真。此时发生短路,直接结束判定,B完全不被执行。 - 对于
A or B: 解释器首先计算A。如果A为真,无论B是什么,整个式子必然已经为真。此时发生短路,直接结束判定,B完全不被执行。
利用短路机制进行安全防御编程
短路机制在实战中非常实用,常用于避免程序发生运行时抛错(如空指针、键不存在或除零错误):
# 场景 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)。
利用 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 即为 "张三"。
七、运算符优先级与高频避坑指南
当多个逻辑运算符与算术、比较运算符混用在同一个表达式中时,必须清楚它们的执行顺序。逻辑运算符的优先级从高到低依次为:
not(最高,单目操作)and(次之)or(最低)
陷阱一:误写为 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。对于复杂的组合条件表达式,始终推荐使用圆括号()显式划分层级。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













