飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 Python简介

    • Python是什么
    • 安装与运行
    • 交互式解释器
    • 注释与编码规范
  • 第2章 变量与数据类型

    • 变量与对象
    • 整数 int
    • 浮点数 float
    • 复数 complex
    • 布尔值 bool
    • 字符串 str
    • 空值 None
    • 类型转换
  • 第3章 运算符与表达式

    • 算术运算符
    • 比较运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 身份与成员运算符
    • 海象运算符
    • 运算符优先级
  • 第4章 流程控制

    • if 语句
    • if-else 语句
    • if-elif-else 语句
    • match-case 语句
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 函数
    • break 与 continue
    • 循环的 else 子句
    • pass 语句
  • 第5章 数据结构

    • 列表创建与索引
    • 列表方法
    • 列表推导式
    • 元组
    • 序列解包
    • 集合
    • 字典创建与访问
    • 字典方法
    • 字典推导式
    • range 对象
  • 第6章 函数

    • 定义函数
    • 位置参数与关键字参数
    • 默认参数
    • 可变参数
    • 解包实参
    • 函数返回值
    • lambda 表达式
    • 文档字符串与注解
    • 作用域与命名空间
    • global 与 nonlocal
  • 第7章 模块与包

    • 模块导入
    • 模块搜索路径
    • 包与相对导入
    • 标准库概览
  • 第8章 文件与输入输出

    • 文件读写
    • 上下文管理器
    • 字符串格式化
    • JSON 与 CSV
  • 第9章 面向对象

    • 类与对象
    • 方法
    • 实例变量与类变量
    • 私有变量
    • 继承
    • 多重继承
    • 魔术方法
    • 属性装饰器
    • 数据类 dataclass
  • 第10章 异常处理

    • 语法错误与异常
    • try-except
    • 异常链与 raise
    • 清理操作
    • 自定义异常
  • 第11章 迭代器与生成器

    • 迭代器协议
    • 生成器
    • 生成器表达式
    • 迭代工具
  • 第12章 高级特性

    • 装饰器
    • 函数式编程
  • 第13章 工程实践

    • 测试与调试
    • 代码质量
    • 虚拟环境

逻辑运算符

Python 的逻辑运算符 and、or、not 用于组合和取反布尔条件。与其他语言不同,Python 的逻辑运算符不仅返回布尔值,还遵循独特的短路求值规则,返回决定结果的操作数本身。这一特性使它们在实际编程中远比单纯的"真/假判断"更加灵活。

not:逻辑非

not 是单目运算符,对操作数进行真值判断后取反。如果操作数为真,not 返回 False;如果为假,返回 True。

>>> not True
False
>>> not False
True
>>> not 0
True        # 0 为假,取反为真
>>> not "hello"
False       # 非空字符串为真,取反为假
>>> not None
True

not 的优先级低于比较运算符,因此 not a == b 被解析为 not (a == b),而非 (not a) == b。

>>> x = 5
>>> not x == 5
False       # 等价于 not (x == 5)
>>> (not x) == 5
False       # not x 得 False,False == 5 得 False

and:逻辑与

and 是双目运算符,当且仅当两个操作数都为真时返回真。但 Python 的 and 不直接返回 True 或 False,而是返回第一个假值操作数,或如果没有假值则返回最后一个操作数。

>>> True and False
False
>>> 3 and 5
5           # 两个都为真,返回最后一个
>>> 0 and 5
0           # 第一个为假,返回 0
>>> "hello" and "world"
'world'     # 两个非空字符串都为真,返回最后一个
>>> [] and "world"
[]          # 空列表为假,直接返回

这种返回值规则源于短路求值:如果第一个操作数为假,and 已经能确定整个表达式为假,于是直接返回第一个操作数,不再计算第二个。

>>> def side_effect():
...     print("副作用执行了")
...     return True
...
>>> False and side_effect()
False       # side_effect 不会被执行

or:逻辑或

or 返回第一个真值操作数,或如果没有真值则返回最后一个操作数。只要第一个操作数为真,or 就立即返回它,不再检查第二个。

>>> True or False
True
>>> 3 or 5
3           # 第一个为真,直接返回
>>> 0 or 5
5           # 第一个为假,返回第二个
>>> "" or "default"
'default'   # 空字符串为假,返回第二个
>>> None or 0 or [] or "fallback"
'fallback'  # 一路找真值,最后返回最后一个

短路特性让 or 可以安全地处理可能为空的变量:

>>> user_input = ""
>>> value = user_input or "默认值"
>>> value
'默认值'

真值判断

Python 中以下值在布尔上下文中被视为 False(称为"假值"):

  • None
  • False
  • 数字零:0、0.0、0j
  • 空序列和空容器:''、[]、()、{}、set()、range(0)

其余几乎所有对象都被视为 True("真值")。自定义类可以通过定义 __bool__() 或 __len__() 方法来控制自身的真值行为。

class EmptyContainer:
    def __len__(self):
        return 0

>>> container = EmptyContainer()
>>> bool(container)
False       # __len__ 返回 0,被视为假

短路求值的实用模式

短路求值不仅是优化手段,更是编写安全代码的重要工具。

安全属性访问

# 先判断对象存在,再判断属性
if user and user.is_active:
    print("用户活跃")

# 如果 user 为 None,user.is_active 不会执行,避免 AttributeError

默认值设置

# 获取配置值,不存在则使用默认值
port = config.get("port") or 8080

# 但要注意:如果合法值可能是 0,这种写法会错误地使用默认值
# 因为 0 是假值

对于可能为 0 的数值,应使用条件表达式:

port = config.get("port") if config.get("port") is not None else 8080

条件执行

# 仅在调试模式打印日志
debug and print(f"调试信息:{value}")

# 等价于
if debug:
    print(f"调试信息:{value}")

组合使用的陷阱

and 和 or 组合时,优先级规则至关重要:not > and > or。

>>> True or False and False
True        # 等价于 True or (False and False),不是 (True or False) and False

一个经典的陷阱是试图用 and/or 模拟条件表达式:

# 危险的写法(C 风格)
result = condition and value_if_true or value_if_false

# 当 value_if_true 为假值时会出错
>>> x = 0
>>> result = True and x or 100
>>> result
100         # 本意是 0,但 x 为假值导致返回 100

Python 2.5+ 提供了真正的条件表达式,应优先使用:

result = value_if_true if condition else value_if_false

返回值的应用

or 的"返回第一个真值"特性广泛用于设置默认值:

>>> def greet(name=None):
...     name = name or "访客"
...     print(f"你好,{name}")
...
>>> greet()
你好,访客
>>> greet("Alice")
你好,Alice

and 的"返回第一个假值"特性可用于参数校验:

>>> def divide(a, b):
...     b and a / b or "除数不能为零"
...
>>> divide(10, 2)
5.0
>>> divide(10, 0)
'除数不能为零'

但这种技巧性代码可读性较差,正式项目中建议使用显式 if 语句。

逻辑运算符的短路求值和特殊返回值规则,是 Python"一切皆对象"哲学的直接体现。and 和 or 返回操作数本身而非强制转换为布尔值,这让它们可以自然地融入赋值、函数参数、序列操作等场景。理解真值判断规则和优先级,是写出既简洁又安全的条件代码的基础。

上一页
赋值运算符
下一页
位运算符