Python 学习笔记(第二期)——基础语法(下篇):运算符全解与实战演练

知识衔接:Python 学习笔记(第一期)——基础语法(上篇):环境搭建与数据基石

更多Python知识:Python基础入门

我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~

📖 引言:数据的“加工厂”

在上一期中,我们完成了Python环境的搭建,认识了变量和各种各样的数据类型——数字、字符串、列表、元组、集合、字典。如果把数据比作食材,那么现在我们的“厨房”里已经堆满了新鲜的蔬菜、肉类和调料。

但食材堆在那里是不会变成美味佳肴的。我们需要切、剁、炒、煮、调味——这些对食材的加工操作,对应到编程中就是运算符。运算符是连接数据与逻辑的桥梁,它们让静态的数据“活”起来,进行加减乘除、比较大小、判断真假、按位运算……可以说,程序之所以能“计算”,核心就在于运算符。

本下篇将带您系统掌握Python中所有常用运算符,并通过四个完整的综合实战项目,将这些知识融会贯通。学完本篇,您将具备独立编写小型实用程序的能力。

— Compiled and Authored by Whisky — July 9 th, 2026

📑 本期目录

  1. 算术运算符(+ - * / // % **
  2. 赋值运算符(含海象运算符 :=
  3. 比较运算符(含链式比较)
  4. 逻辑运算符(含短路求值)
  5. 成员运算符(in / not in
  6. 位运算符(& | ^ ~ << >>,含补码图解)
  7. 运算符优先级(完整速查表)
  8. 综合实战演练(四个完整案例)
  9. 总结与知识点一览表

正文

一、算术运算符

算术运算符是最直观的运算符,用于执行数学运算。假设 a = 10b = 3,下表展示了所有算术运算符的行为:

运算符 名称 示例 结果 说明
+ 加法 a + b 13 两数相加
- 减法 a - b 7 两数相减
* 乘法 a * b 30 两数相乘
/ 真除法 a / b 3.333... 结果总是浮点数
// 整除(地板除) a // b 3 向下取整,返回整数部分
% 取余(模运算) a % b 1 返回除法的余数
** 幂运算 a ** b 1000 计算 a 的 b 次方

💡 白话理解/// 的区别是初学者最容易混淆的点。您可以这样记——/ 是“精确除法”,哪怕结果是整数,它也非要给你带个 .0// 是“整除”,只管商的部分,余数直接扔掉(向下取整)。例如 7 // 23-7 // 2-4(因为 -3.5 向下取整是 -4)。

混合运算的类型提升规则

当不同类型的数字混合运算时,Python会自动进行临时类型转换,遵循“向更高精度”提升的原则:

  • 整型 + 浮点型 → 浮点型
  • 整型 + 复数 → 复数
  • 浮点型 + 复数 → 复数
print(10 / 2.0)      # 5.0(整型10被提升为浮点型)
print(10 - (3 + 5j)) # (7 - 5j)(整型10被提升为复数)

二、赋值运算符

赋值运算符的作用是将一个值赋给变量。等号 = 是最基本的赋值运算符。

2.1 基本赋值与链式赋值
# 单个赋值
num = 10

# 链式赋值(多个变量指向同一个值)
x = y = z = 1      # x、y、z 均为 1

# 平行赋值(元组解包)
a, b = 1, 2        # a = 1, b = 2
2.2 复合赋值运算符

复合赋值运算符将算术运算与赋值合二为一,让代码更简洁:

运算符 示例 等价于
+= num += 2 num = num + 2
-= num -= 2 num = num - 2
*= num *= 2 num = num * 2
/= num /= 2 num = num / 2
//= num //= 2 num = num // 2
%= num %= 2 num = num % 2
**= num **= 2 num = num ** 2
count = 5
count += 3   # 等价于 count = count + 3
print(count) # 8
2.3 海象运算符 :=(Python 3.8+)

海象运算符是Python 3.8引入的新特性,它允许在表达式内部为变量赋值,因形似海象的眼睛和长牙而得名(:=)。

典型场景:在循环或条件判断中,同时完成赋值和判断,避免重复计算。

# 传统写法(需要先赋值,再判断)
data = input("请输入内容:")
while len(data) == 0:
    print("内容不能为空!")
    data = input("请输入内容:")

# 海象运算符写法(在while条件中直接赋值)
while (data := input("请输入内容:")) == "":
    print("内容不能为空!")

注意:海象运算符的优先级较低,当与比较运算符混用时,记得加括号 () 明确优先级。

三、比较运算符

比较运算符用于比较两个值的大小或相等关系,返回布尔值 TrueFalse。假设 x = 5y = 8

运算符 名称 示例 结果
== 等于 x == y False
!= 不等于 x != y True
> 大于 x > y False
< 小于 x < y True
>= 大于等于 x >= y False
<= 小于等于 x <= y True

⚠️ 常见误区= 是赋值,== 才是比较相等。初学者常把 if score = 100 写成这样,会报语法错误。正确的写法是 if score == 100

3.1 链式比较(Python独有语法)

Python支持将多个比较运算符串联在一起,这在其他语言中是不常见的,但非常直观:

score = 85

# 传统写法(使用 and 连接)
if score >= 60 and score < 80:
    print("合格")

# 链式比较(更符合数学直觉)
if 60 <= score < 80:
    print("合格")

四、逻辑运算符

逻辑运算符用于组合多个布尔表达式,返回布尔值。Python使用英文单词作为逻辑运算符,比符号(&&||!)更易读。

运算符 名称 示例 说明
and 逻辑与 a and b 两边都为 True 时返回 True
or 逻辑或 a or b 任意一边为 True 时返回 True
not 逻辑非 not a 取反,TrueFalseFalseTrue
4.1 短路求值(重要特性)

逻辑运算符的求值遵循“短路”原则:当结果已经确定时,就不再计算后续表达式

  • and:如果左边为 False,整个表达式必定为 False,不再计算右边。
  • or:如果左边为 True,整个表达式必定为 True,不再计算右边。
def print_and_return(value):
    print(f"被调用了,值为 {value}")
    return value

# and 短路:左边为 False,右边不执行
result = print_and_return(False) and print_and_return(True)
# 输出:被调用了,值为 False
# 注意:print_and_return(True) 没有被调用

# or 短路:左边为 True,右边不执行
result = print_and_return(True) or print_and_return(False)
# 输出:被调用了,值为 True
# 注意:print_and_return(False) 没有被调用

💡 思维误区:逻辑运算符返回的不一定是 TrueFalseandor 返回的是决定结果的最后一个操作数

  • x and y:如果 x 为假,返回 x;否则返回 y。
  • x or y:如果 x 为真,返回 x;否则返回 y。
print(0 and 100)   # 0(0 为假,直接返回 0)
print(5 and 100)   # 100(5 为真,返回第二个操作数)
print(0 or 100)    # 100(0 为假,返回第二个操作数)
print(5 or 100)    # 5(5 为真,直接返回 5)

五、成员运算符

成员运算符用于判断一个元素是否属于某个序列(字符串、列表、元组、集合、字典的键等)。

运算符 说明 示例
in 如果指定元素在序列中,返回 True 't' in 'Python'True
not in 如果指定元素不在序列中,返回 True 't' not in 'Python'False
# 字符串中的成员判断
print('o' in 'Python')   # True

# 列表中的成员判断
print(3 in [1, 2, 3])    # True

# 字典中的成员判断(判断的是键,不是值)
person = {"name": "Tom", "age": 18}
print("name" in person)  # True(判断键是否存在)
print("Tom" in person)   # False("Tom" 是值,不是键)

六、位运算符

位运算符将整数转换为二进制形式,然后按位进行运算。虽然日常开发中位运算用得不多,但在底层开发、网络协议解析和性能优化场景中非常重要。

假设 a = 9(二进制 00001001),b = 3(二进制 00000011):

运算符 名称 示例 结果 说明
& 按位与 a & b 1 两位都为1时结果为1
` ` 按位或 `a b`
^ 按位异或 a ^ b 10 两位不同(一个0一个1)时结果为1
~ 按位取反 ~a -10 0变1,1变0(含符号位)
<< 左移 a << 1 18 所有位左移,右侧补0
>> 右移 a >> 1 4 所有位右移,左侧补0
6.1 位运算的二进制示意图

按位与(&:只有两位都是1,结果位才是1。

  00001001  (9)
& 00000011  (3)
-----------
  00000001  (1)

按位或(|:只要有一位是1,结果位就是1。

  00001001  (9)
| 00000011  (3)
-----------
  00001011  (11)

按位异或(^:两位不同时结果位为1,相同时为0。

  00001001  (9)
^ 00000011  (3)
-----------
  00001010  (10)

按位左移(<<:左移 n 位等价于乘以 2^n。

  00001001  (9)
<< 1
-----------
  00010010  (18)  ← 9 * 2 = 18

按位右移(>>:右移 n 位等价于整除 2^n。

  00001001  (9)
>> 1
-----------
  00000100  (4)   ← 9 // 2 = 4
6.2 按位取反(~)的详细计算

按位取反是最容易让初学者困惑的运算符。以 ~9 为例,计算过程如下:

  1. 确定补码:9 是正数,正数的原码 = 反码 = 补码,所以 9 的补码为 00001001
  2. 对补码取反:得到新的补码 11110110
  3. 将补码转换为原码(即我们能看到的值):符号位(最高位)不变,其余位取反,然后 +1。
    • 11110110 的符号位为 1(表示负数)
    • 其余位取反:00001001,再 +1:00001010 = 10
    • 最终结果为 -10
print(~9)  # -10

记忆口诀~x 等价于 -x - 1。例如 ~9 = -10~(-9) = 8

七、运算符优先级

当表达式中包含多个运算符时,优先级决定了计算的先后顺序。下表按优先级从高到低排列:

优先级 运算符 说明
最高 (expressions...) 圆括号(强行改变优先级)
** 幂运算
+x, -x, ~x 正号、负号、按位取反
*, /, //, % 乘法、除法、整除、取余
+, - 加法、减法
<<, >> 左移、右移
& 按位与
^ 按位异或
` `
in, not in, is, is not, <, <=, >, >=, !=, == 比较运算符、成员运算符、身份运算符
not 逻辑非
and 逻辑与
or 逻辑或
最低 = 及各种复合赋值 赋值运算符

💡 黄金法则:当不确定优先级时,不要犹豫,直接加括号 ()。加括号不仅让优先级明确,还能让代码的可读性大幅提升。例如 (a + b) * ca + b * c 更清晰地传达了意图。

a, b, c = 2, 3, 4

# 不加括号,先算幂再算乘
result1 = c ** b * a   # 4**3 * 2 = 64 * 2 = 128

# 加括号,先算乘法再算幂
result2 = c ** (b * a) # 4**(3*2) = 4**6 = 4096

print(result1)  # 128
print(result2)  # 4096

八、综合实战演练

理论学得再多,不如亲手敲一遍代码。以下四个案例将综合运用本期所学的各类运算符,覆盖实际开发中的常见场景。

实战一:打印购物小票

需求描述:模拟超市收银系统,根据商品名称、单价和购买数量,计算总金额并打印格式化的购物小票。

涉及知识点:算术运算符、赋值运算符、字符串格式化(f-string)、转义字符(\t\n

# 购物小票打印程序

# 商品信息(模拟用户输入或预设)
product_name = "农夫山泉矿泉水"
price = 2.5          # 单价(元)
quantity = 3         # 购买数量

# 计算总金额
total = price * quantity

# 打印购物小票
print("=" * 40)
print("          欢 迎 光 临")
print("=" * 40)
print(f"商品:{product_name}")
print(f"单价:¥{price:.2f}")
print(f"数量:{quantity}")
print("-" * 40)
print(f"合计:¥{total:.2f}")
print("=" * 40)
print(f"实收:¥{total:.2f}")
print(f"找零:¥0.00")
print("-" * 40)
print("  感谢您的惠顾,欢迎下次光临!")
print("=" * 40)

预期输出

========================================
          欢 迎 光 临
========================================
商品:农夫山泉矿泉水
单价:¥2.50
数量:3
----------------------------------------
合计:¥7.50
========================================
实收:¥7.50
找零:¥0.00
----------------------------------------
  感谢您的惠顾,欢迎下次光临!
========================================

逐行解读

  • "=" * 40:利用字符串与整数的乘法,生成一条40个等号组成的分隔线。
  • f"单价:¥{price:.2f}":.2f 表示保留两位小数,确保金额显示规范。
  • total = price * quantity:算术乘法计算总价。
实战二:蚂蚁森林植树证书

需求描述:蚂蚁森林用户通过低碳行为积攒能量,能量达标后可申请种树,系统会生成一张植树证书。本案例模拟生成植树证书信息。

涉及知识点:字典数据类型、字符串格式化(f-string)、字符串拼接(+ 运算符)

# 蚂蚁森林植树证书生成程序

# 用户证书信息(模拟数据)
certificate = {
    "user_name": "张三",
    "tree_type": "梭梭树",
    "plant_date": "2026-07-08",
    "tree_number": "ZSLF202607080001",
    "location": "甘肃省武威地区民勤县",
    "organization": "中国扶贫基金会"
}

# 生成证书信息
print()
print("*" * 50)
print(" " * 16 + "🌳 植树证书 🌳")
print("*" * 50)
print(f"\n  尊敬的 {certificate['user_name']}:")
print(f"\n  感谢您参与蚂蚁森林公益项目!")
print(f"\n  您于 {certificate['plant_date']} 申请种植的")
print(f"  {certificate['tree_type']},已被 {certificate['organization']}")
print(f"  认领,将种植到 {certificate['location']}。")
print(f"\n  🌱 树苗编号:{certificate['tree_number']}")
print("\n" + "*" * 50)
print("  一棵树,一片林,让地球更美好!")
print("*" * 50)

预期输出

**************************************************
                🌳 植树证书 🌳
**************************************************

  尊敬的 张三:

  感谢您参与蚂蚁森林公益项目!

  您于 2026-07-08 申请种植的
  梭梭树,已被 中国扶贫基金会
  认领,将种植到 甘肃省武威地区民勤县。

  🌱 树苗编号:ZSLF202607080001

**************************************************
  一棵树,一片林,让地球更美好!
**************************************************

逐行解读

  • " " * 16:用空格进行缩进,实现标题居中效果。
  • certificate['user_name']:通过键访问字典中的值。
  • "\n" * 2:用换行符增加段落间距。
实战三:摄氏温度 ↔ 开氏温度转换

需求描述:绝对温标(开氏温标)是热力学中的重要参数,其零度对应摄氏温度的 -273.15℃。本程序接收用户输入的摄氏温度,计算并输出对应的开氏温度。

涉及知识点:算术运算符、input() 函数、float() 类型转换、f-string 格式化

# 摄氏温度转开氏温度

# 获取用户输入的摄氏温度
celsius = input("请输入摄氏温度(℃):")
celsius = float(celsius)  # 将字符串转换为浮点数

# 计算开氏温度(K = ℃ + 273.15)
kelvin = celsius + 273.15

# 输出结果
print(f"{celsius}℃ 对应的开氏温度为:{kelvin:.2f}K")

预期输出

请输入摄氏温度(℃):25
25.0℃ 对应的开氏温度为:298.15K

扩展:增加华氏温度转换

# 摄氏温度转华氏温度(华氏度 = 摄氏度 × 9/5 + 32)
fahrenheit = celsius * 9 / 5 + 32
print(f"{celsius}℃ 对应的华氏温度为:{fahrenheit:.2f}℉")

预期输出

25.0℃ 对应的华氏温度为:77.00℉
实战四:BMI 指数计算器

需求描述:BMI(身体质量指数)是国际上常用的衡量人体胖瘦程度和是否健康的标准。计算公式为:BMI = 体重(kg) / 身高(m)²。本程序接收用户输入的身高和体重,计算 BMI 值并给出健康评估。

涉及知识点:算术运算符(*/**)、比较运算符、逻辑运算符、if 条件判断(综合运用)

# BMI 指数计算器

# 获取用户输入
height = input("请输入您的身高(单位:米):")
weight = input("请输入您的体重(单位:公斤):")

# 类型转换(字符串 → 浮点数)
height = float(height)
weight = float(weight)

# 计算 BMI(体重 / 身高²)
bmi = weight / (height * height)

# 简化写法:bmi = weight / height ** 2

print(f"\n您的 BMI 指数为:{bmi:.2f}")

# 根据 BMI 值给出评估(使用比较运算符和链式比较)
if bmi < 18.5:
    assessment = "体重过轻 🟡"
elif 18.5 <= bmi < 24.9:
    assessment = "正常范围 ✅"
elif 24.9 <= bmi < 29.9:
    assessment = "体重过重 🟠"
else:
    assessment = "肥胖 🔴(建议适当运动、合理饮食)"

print(f"评估结果:{assessment}")

预期输出(以身高1.75米,体重70公斤为例):

请输入您的身高(单位:米):1.75
请输入您的体重(单位:公斤):70

您的 BMI 指数为:22.86
评估结果:正常范围 ✅

逐行解读

  • height ** 2:幂运算符计算身高的平方,等价于 height * height
  • 18.5 <= bmi < 24.9:链式比较,同时判断 BMI 是否大于等于18.5且小于24.9。
  • 代码中包含了输入校验的扩展思路——可以结合 isdigit() 方法判断用户输入是否合法。
实战五:简单计算器(附加案例)

需求描述:实现一个支持加减乘除四则运算的简单计算器,用户输入两个数字和运算符,程序输出计算结果。

涉及知识点:条件判断、算术运算符、input() 输入处理

# 简单计算器

# 获取用户输入
num1 = float(input("请输入第一个数字:"))
operator = input("请输入运算符(+ - * /):")
num2 = float(input("请输入第二个数字:"))

# 根据运算符执行计算
if operator == "+":
    result = num1 + num2
elif operator == "-":
    result = num1 - num2
elif operator == "*":
    result = num1 * num2
elif operator == "/":
    if num2 == 0:
        result = "错误:除数不能为0!"
    else:
        result = num1 / num2
else:
    result = "错误:不支持的运算符!"

print(f"{num1} {operator} {num2} = {result}")

预期输出

请输入第一个数字:10
请输入运算符(+ - * /):/
请输入第二个数字:3
10.0 / 3.0 = 3.3333333333333335

九、扩展知识:字符编码与字节关系

在文件操作和网络传输中,字符编码是一个必须了解的知识点。不同的编码方式下,同一个字符占用的字节数可能不同:

编码方式 适用语言 一个英文字符 一个中文字符
ASCII 英文 1 字节 不支持
GBK 中文(国标) 1 字节 2 字节
UTF-8 国际通用 1 字节 3 字节
Unicode 国际通用 2 字节 2 字节

实际开发建议:统一使用 UTF-8 编码,它兼容性最好,是跨平台、跨语言的首选。在 Python 中打开文件时,指定 encoding='utf-8' 可以避免乱码问题。

📝 总结与知识点一览表

核心知识点汇总

类别 核心内容 易错点提醒
算术运算符 + - * / // % ** 区分 /(真除法)和 //(整除)
赋值运算符 =、复合赋值、海象运算符 := = 是赋值,== 是比较
比较运算符 == != > < >= <=,链式比较 不要写成 =>=<(语法错误)
逻辑运算符 and or not,短路求值 短路求值可能跳过右边表达式的执行
成员运算符 innot in 字典中判断的是键,不是值
位运算符 `& ^ ~ << >>`
优先级 圆括号最高,赋值最低 不确定就加括号!

常用运算符速查表

运算符 功能 示例 结果
** 幂运算 2 ** 10 1024
// 整除 10 // 3 3
% 取余 10 % 3 1
:= 海象运算符(表达式内赋值) while (n := len(s)) > 0 赋值并判断
== 判断相等 5 == 5 True
!= 判断不等 5 != 3 True
and 逻辑与 True and False False
or 逻辑或 True or False True
not 逻辑非 not True False
in 成员判断 'a' in 'abc' True
& 按位与 9 & 3 1
` ` 按位或 `9
^ 按位异或 9 ^ 3 10
~ 按位取反 ~9 -10
<< 左移 9 << 1 18
>> 右移 9 >> 1 4

常见错误排查指南

错误现象 大概率原因 解决方案
TypeError: unsupported operand type(s) 不同类型的数据进行了不支持的运算(如字符串 + 数字) 使用类型转换函数 int()float()str() 统一类型
ZeroDivisionError: division by zero 试图除以0 使用 if 判断除数不为0再执行除法
ValueError: invalid literal for int() 尝试将非数字字符串转换为整数 先用 isdigit() 校验输入内容
逻辑运算结果与预期不符 混淆了 and / or 的返回值(不一定是布尔值) 记住:and 返回第一个假值或最后一个真值
位运算结果与预期不符 未考虑符号位和补码机制 使用较小的正数验证,确认逻辑正确后再扩展

生产/学习最佳实践

  1. 善用括号:当表达式包含多种运算符时,主动添加括号 () 让计算顺序一目了然。代码是写给人类读的,其次才是给机器执行的。
  2. 避免“魔法数”:不要在代码中直接写出莫名其妙的数字,应该用有意义的常量名代替。例如 TAX_RATE = 0.13 比直接写 0.13 更清晰。
  3. 优先使用 in 代替多个 or:条件判断中,if x == 1 or x == 2 or x == 3 不如 if x in [1, 2, 3] 简洁优雅。
  4. 短路求值的妙用:可以用 or 实现默认值设置——name = input_name or "匿名用户",当用户未输入时自动使用默认值。

🔜 下期预告

本期我们全面掌握了Python的运算符体系,并通过购物小票、蚂蚁森林证书、温度转换和BMI计算器四个实战项目,将理论知识落地为可运行的程序。至此,Python基础语法的核心内容(变量、类型、运算符)已全部学完。

下一期(第三期) ,我们将进入 流程控制 的世界——学习如何使用 if / elif / else 让程序拥有“判断能力”,如何使用 whilefor 让程序具备“重复执行”的能力,以及如何用 breakcontinue 精细化控制循环流程。同时,我们还将完成计算器、猜数字、逢7拍手、五子棋棋盘和房贷计算器等一系列有趣的实战项目。敬请期待!


本期(基础语法·下篇)到此结束。 如果您在使用过程中发现任何问题或有改进建议,欢迎随时提出!

— Compiled and Authored by Whisky — July 9 th, 2026
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐