Python 运算符与表达式

Python 算术、比较、逻辑与身份运算符规则;真值测试、短路求值、链式比较,以及表达式在业务分支中的可靠用法。

#type / concept #status / growing #tech / dev #resource / python #tech / lang / python

[!info] 关联笔记

Python 运算符与表达式

这个概念为什么出现

控制流、推导式、断言与数据清洗都建立在表达式上。若不清楚:

  • /// 的差别
  • and/or 返回操作数本身
  • 链式比较 a < b < c
  • is==

就会在价格计算、权限判断与空值处理里埋雷。

[!abstract] 一句话理解 Python 表达式按优先级与结合性求值;逻辑运算短路并返回操作数,比较可链式书写,身份与相等必须分开。

最小可运行示例

先把示例放进业务场景,再看代码:

场景:电商结算计算应付金额与权限门闩

结算服务需要:

  • 用整数分做金额,避免 float
  • 会员折扣与满减的条件组合
  • 权限:既要登录又要未冻结
# checkout_expressions.py
# 业务意图:用清晰表达式计算应付分,并判断是否可下单。
# 教学点:
# - // 与 % 用于整数分;
# - and/or 短路;
# - 链式比较让区间判断更可读。

def payable_cents(price_cents: int, vip: bool, coupon_off: int) -> int:
    # 会员 9 折;再减优惠券;最低 0 分。
    base = price_cents * 90 // 100 if vip else price_cents
    after_coupon = base - coupon_off
    return after_coupon if after_coupon > 0 else 0


def can_place_order(logged_in: bool, frozen: bool, age: int) -> bool:
    # 必须登录、未冻结,且年龄在 18..120(链式比较)。
    return logged_in and (not frozen) and (18 <= age <= 120)


def first_nonempty(*labels: str) -> str:
    # or 返回第一个真值操作数,常用于默认展示名。
    result = ""
    for label in labels:
        result = result or label
    return result or "anonymous"


def main() -> None:
    print("payable:", payable_cents(1000, True, 50))
    print("can order:", can_place_order(True, False, 20))
    print("display:", first_nonempty("", "", "alice"))
    print("div:", 5 / 2, "floor:", 5 // 2, "mod:", 5 % 2)


if __name__ == "__main__":
    main()

建议运行:

python checkout_expressions.py

期望输出:

payable: 850
can order: True
display: alice
div: 2.5 floor: 2 mod: 1

结合场景再看三个关注点

  1. 金额用整数分 + //,比 float 折扣更可控。
  2. and/or 不只返回布尔,可能返回操作数——赋值时要小心类型。
  3. 链式比较 18 <= age <= 120 等价于两个比较的 and,不是元组比较。

核心概念与准确模型

常用类别

类别例子备注
算术+ - * / // % **/ 真除;// 向下取整除
比较== != < <= > >=可链式
逻辑and or not短路;and/or 返回操作数
身份is is not比身份
成员in not in容器/串
位运算`&^ << >> ~`

短路

  • a and ba 为假则返回 a,否则返回 b
  • a or ba 为真则返回 a,否则返回 b

海象运算符(了解)

:= 在表达式内赋值(3.8+),适合 while (line := f.readline()) 一类,避免滥用降可读性。

边界情况与反直觉行为

  1. 负数整除// 向负无穷取整,(-5) // 2 == -3
  2. 浮点比较:不要对计算结果直接 ==
  3. 混合类型比较:在 3.x 中任意对象乱序比较可能直接 TypeError

常见误区

[!warning] 常见误区:把 and/or 当一定返回 bool 错误理解:结果类型总是 True/False。
正确模型:返回决定结果的那个操作数;需要布尔时用 bool() 或直接用于 if

工程实践

  • 复杂条件拆成命名布尔变量。
  • 权限判断显式写 not frozen,避免双重否定嵌套。
  • 金额、库存用整数运算路径单测钉死。

本节总结

表达式是控制流的燃料。先掌握算术边界、短路与身份/相等,再写分支与循环会稳很多。

自测题

  1. 0 or "default" 的值是什么?
  2. a < b < cb 有副作用的属性访问时如何求值?
参考答案
  1. "default"(0 为假,返回后者)。
  2. 大致等价于 a < b and b < cb 只求值一次(语言保证链式比较中间表达式只算一次)。

延伸阅读与资料来源

资料类型支撑内容
Expressions reference规范运算符与求值
stdtypes – boolean ops文档and/or 语义
创建于 2026/7/15 更新于 2026/7/15