Day 03:运算符与流程控制
🎯 学习目标:掌握 Python 全部运算符(7 大类),熟练编写分支和循环逻辑
1. 算术运算符
a, b = 10, 3
print(a + b) # 13 加法
print(a - b) # 7 减法
print(a * b) # 30 乘法
print(a / b) # 3.3333333333333335 除法(结果始终是 float)
print(a // b) # 3 整除(向下取整)
print(a % b) # 1 取余(模运算)
print(a ** b) # 1000 幂运算(10³)
# 整除的行为
print(10 // 3) # 3
print(-10 // 3) # -4 ← 注意!向下取整所以是 -4 不是 -3
print(10 // -3) # -4
# 取余的妙用
print(17 % 5) # 2 判断是否整除:17 ÷ 5 余 2
print(17 % 2) # 1 判断奇偶:余 1 → 奇数
print(18 % 2) # 0 余 0 → 偶数
# 幂运算
print(2 ** 10) # 1024
print(16 ** 0.5) # 4.0 (开平方)
取余的常见应用
- 判断奇偶:
n % 2
- 循环索引:
index % length
- 提取个位:
n % 10
2. 赋值运算符
# 基本赋值
x = 10
# 复合赋值
x += 5 # x = x + 5
x -= 3 # x = x - 3
x *= 2 # x = x * 2
x /= 4 # x = x / 4
x //= 2 # x = x // 2
x %= 3 # x = x % 3
x **= 2 # x = x ** 2
# 多重赋值(Python 特色)
a, b, c = 1, 2, 3 # 同时给多个变量赋值
# 交换变量(一行搞定,不需要临时变量!)
a, b = b, a
print(a, b) # 2, 1
# 链式赋值
x = y = z = 100 # 三个变量都赋值为 100
3. 比较(关系)运算符
print(10 == 10) # True 等于
print(10 != 5) # True 不等于
print(10 > 5) # True 大于
print(10 < 5) # False 小于
print(10 >= 10) # True 大于等于
print(10 <= 5) # False 小于等于
# 链式比较(Python 特色!)
age = 25
print(18 <= age <= 60) # True ← 等价于 18 <= age and age <= 60
# 字符串也可以比较(按字典序)
print("abc" < "abd") # True
print("A" < "a") # True(大写 ASCII 值 < 小写)
4. 逻辑运算符
# and:两边都为 True 才返回 True
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
# or:至少一边为 True 就返回 True
print(True or False) # True
print(False or False) # False
# not:取反
print(not True) # False
print(not False) # True
短路运算(重要!⭐)
# and 短路:左边为 False 时,右边不执行
def check():
print("check 被调用了")
return True
print(False and check()) # 只输出 False,check() 没有被调用!
# or 短路:左边为 True 时,右边不执行
print(True or check()) # 只输出 True,check() 没有被调用!
# 利用短路做默认值
name = ""
display_name = name or "匿名用户" # "匿名用户"
# 原理:空字符串是 False,所以 or 返回右边
5. 位运算符
位运算直接操作二进制位,效率极高:
a, b = 0b1100, 0b1010 # a=12, b=10
# & 按位与:两位都为 1 才为 1
print(bin(a & b)) # 0b1000 = 8
# | 按位或:至少一位为 1 就为 1
print(bin(a | b)) # 0b1110 = 14
# ^ 按位异或:两位不同为 1
print(bin(a ^ b)) # 0b0110 = 6
# ~ 按位取反
print(~a) # -13(补码机制)
# << 左移:二进制位向左移,右边补 0(每移一位 = ×2)
print(5 << 1) # 10 = 5×2
print(5 << 2) # 20 = 5×4
print(5 << 3) # 40 = 5×8
# >> 右移:二进制位向右移,左边补符号位(每移一位 = ÷2)
print(16 >> 1) # 8 = 16÷2
print(16 >> 2) # 4 = 16÷4
print(16 >> 3) # 2 = 16÷8
6. 成员运算符
# in:判断元素是否在容器中
print("a" in "Python") # False
print("th" in "Python") # True
print(3 in [1, 2, 3, 4]) # True
print("name" in {"name": "张三"}) # True(判断 key)
# not in:不在
print(5 not in [1, 2, 3]) # True
7. 身份运算符
# ==:判断值是否相等
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True (值相等)
print(a is b) # False (不同对象,不同内存地址)
print(a is c) # True (同一对象)
# Python 的整数缓存(-5 到 256)
x = 256
y = 256
print(x is y) # True (Python 缓存了小整数)
x = 257
y = 257
print(x is y) # 可能是 False(超出缓存范围,创建了不同对象)
==vsis
==比较值 |is比较是否是同一个对象
日常开发里 99% 的情况用
==,is主要用于判断is None
8. Python 编码规范
正式开发前,先了解 Python 社区统一的代码风格——PEP 8:
# 缩进:用 4 个空格(不要混用 Tab!)
if True:
print("缩进 4 个空格") # ✅
# print("Tab 缩进") # ❌
# 空格:运算符两边各一个空格
x = 1 + 2 # ✅
x=1+2 # ❌
# 逗号后面加空格
items = [1, 2, 3] # ✅
items = [1,2,3] # ❌
# 函数参数逗号后加空格
def func(a, b, c): # ✅
pass
# 过长的行可以用括号换行
result = (long_function_name(arg1, arg2, arg3)
+ another_function(arg4))
# 导入:每个导入独占一行
import os # ✅
import sys # ✅
import os, sys # ❌
善用工具
以后学了 ruff/black 等格式化工具,可以一键自动格式化代码,不需要手动调整。
9. 单分支 if
# 基本语法
age = 18
if age >= 18:
print("已成年")
print("可以进入网吧")
# if 后面的条件可以是任意表达式
score = 85
if score >= 60:
print(f"成绩 {score} 及格")
# 利用"非零即真"的特性
count = 5
if count: # count != 0
print(f"还有 {count} 个")
10. 双分支 if-else
age = 16
if age >= 18:
print("已成年")
else:
print("未成年")
# 实际应用:登录验证
password = input("请输入密码:")
if password == "123456":
print("✅ 登录成功")
else:
print("❌ 密码错误")
11. 多分支 if-elif-else
score = 85
if score >= 90:
grade = "优秀"
elif score >= 80:
grade = "良好"
elif score >= 70:
grade = "中等"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"
print(f"成绩等级:{grade}")
# 因此条件的顺序很重要!
12. 嵌套分支
# 电影票判断
age = 25
has_ticket = True
is_vip = False
if has_ticket:
if age >= 18:
if is_vip:
print("VIP 成人场,请进")
else:
print("普通成人场,请进")
else:
print("未成年人场,请进")
else:
print("请先购票")
# 可以用提前 return 或逻辑运算简化
13. match-case 语句(Python 3.10+,⭐新特性)
传统 if-elif 判断多个值比较啰嗦,match-case 更优雅:
# 传统写法
status_code = 404
if status_code == 200:
msg = "成功"
elif status_code == 301 or status_code == 302:
msg = "重定向"
elif status_code == 404:
msg = "未找到"
elif status_code == 500:
msg = "服务器错误"
else:
msg = "未知"
# match-case 写法(Python 3.10+)
status_code = 404
match status_code:
case 200:
msg = "成功"
case 301 | 302: # | 表示"或"
msg = "重定向"
case 404:
msg = "未找到"
case 500:
msg = "服务器错误"
case _: # _ 表示默认(类似 else)
msg = "未知"
print(msg) # "未找到"
# match 可以做更复杂的模式匹配
point = (0, 5)
match point:
case (0, 0):
print("原点")
case (0, y):
print(f"在 Y 轴上,y={y}") # 匹配这个!
case (x, 0):
print(f"在 X 轴上")
case (x, y):
print(f"坐标 ({x}, {y})")
# 输出:"在 Y 轴上,y=5"
什么时候用 match-case
- 多分支判断且条件都是等值比较
- 需要解构数据(如坐标、元组)
- Python 3.10 以下版本不支持,注意兼容性
14. 三目运算符
# 语法:结果1 if 条件 else 结果2
age = 20
status = "成年" if age >= 18 else "未成年"
print(status) # "成年"
# 等价于:
if age >= 18:
status = "成年"
else:
status = "未成年"
# 可以嵌套(但不推荐,可读性太差)
score = 85
result = "优秀" if score >= 90 else ("良好" if score >= 80 else "一般")
15. while 循环
15.1 基本语法
# 打印 0 到 4
count = 0
while count < 5:
print(f"第 {count} 次循环")
count += 1
# 输出:0, 1, 2, 3, 4
15.2 三种关键条件
# ⚠️ 无限循环必须有退出条件!
while True:
user_input = input("输入 'quit' 退出:")
if user_input == "quit":
break # 跳出循环
15.3 while-else
# else 在循环正常结束(非 break)时执行
count = 0
while count < 3:
print(count)
count += 1
else:
print("循环正常结束") # ✅ 会执行
# 如果被 break 中断,else 不执行
count = 0
while count < 10:
if count == 3:
print("提前退出!")
break
count += 1
else:
print("循环正常结束") # ❌ 不会执行(被 break 了)
15.4 实际应用
# 数字猜谜游戏
import random
answer = random.randint(1, 100)
guess = None
attempts = 0
while guess != answer:
guess = int(input("猜一个 1-100 的数:"))
attempts += 1
if guess > answer:
print("大了")
elif guess < answer:
print("小了")
print(f"🎉 恭喜!答案就是 {answer},你用了 {attempts} 次")
速记卡(面试闪卡)
Q1:一句话讲清「Day 03:运算符与流程控制」到底是什么?
A:Python 运算符有七大类,流程控制靠缩进划分代码块;面试常考短路求值、整除向下取整、以及 is(同对象)和 ==(同值)的区别。
Q2:七大类运算符速览 —— 怎么理解?
A:运算符像厨房调料:算术(+ - * / // %)管计算,赋值(+=)管存值,比较(==)管判断,逻辑(and/or)管组合,位(& | ^)管二进制,成员(in)管”在不在”,身份(is)管”是不是同一个”。记住 // 是向下取整,-10//3=-4。
Q3:短路求值与逻辑返回值 —— 怎么理解?
A:and 左边为假就直接返回假、不跑右边;or 左边为真就不跑右边——这就是”短路”。更反直觉:and/or 返回的是那个值本身而非 True/False(1 and 2 得 2)。像问”你有空且愿意?“,前一句否就懒得听后一句。
Q4:is vs == 与整数缓存 —— 怎么理解?
A: 比"值相等",is 比"是不是同一个对象(内存地址)"。日常 99% 用 ,is 主要判 None。坑:Python 缓存 -5~256 小整数,is 在这区间会骗你返回 True。像两本人一模一样的书,== 说内容同,is 说是不是同一本。
Q5:流程控制——分支与循环 —— 怎么理解?
A:分支用 if/elif/else,注意 elif 排他(命中即停,顺序重要);循环用 while/for,while-else 在未被 break 时执行。match-case(3.10+)做模式匹配更优雅。缩进就是代码块边界,少一格就报错。
Q6:核心速记主线有哪些?
-
七大类运算符:算术/赋值/比较/逻辑/位/成员/身份
-
整除 // 向下取整;链式比较 18<=age<=60
-
短路:and/or 遇假/真即停,返回原值非布尔
-
is 比对象身份、== 比值;小整数 -5~256 有缓存
口诀
A:七类运算符先记牢,算术赋值比较逻辑位;
成员身份各司职,整除向下莫忘掉。
短路求值懒执行,and or 返原值不布尔;
is 比身份 == 比值,小整数缓存要记熟。
相关链接
- 上一篇:02_进制与数据类型
Python 运算符分类图
graph TD A[Python 运算符] --> B["算术运算符<br/>+ - * / // % **"] A --> C["赋值运算符<br/>= += -= *= /= //= %= **="] A --> D["比较运算符<br/>== != > < >= <="] A --> E["逻辑运算符<br/>and or not"] A --> F["位运算符<br/>& | ^ ~ << >>"] A --> G["成员运算符<br/>in not in"] A --> H["身份运算符<br/>is is not"] B --> B1["整除向下取整<br/>-10//3=-4"] B --> B2["幂运算开方<br/>16**0.5=4.0"] D --> D1["链式比较<br/>18<=age<=60"] E --> E1["短路求值<br/>False and 其他=False"] G --> G1["字符串包含<br/>'a' in 'abc'=True"]
常见坑点
1. 整除向下取整陷阱
print(10 // 3) # 3
print(-10 // 3) # -4 ← 不是 -3!
print(10 // -3) # -4
-
原理:
//是向下取整(floor division),不是截断 -
类比:数轴上向左取整,-3.33 向左是 -4
-
解决:需要截断用
int(a / b)
2. 浮点数除法精度
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
-
原因:0.1 和 0.2 在二进制中是无限循环小数
-
解决:使用
decimal.Decimal('0.1')或整数运算
3. 链式比较的短路特性
x = 5
print(1 < x < 10) # True
print(1 < x > 10) # False ← x>10 为 False,但不会报错
print(1 < x < 3) # False ← x<3 为 False
- 原理:链式比较相当于
1 < x and x < 10,短路求值
4. is vs == 的混淆
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True(值相等)
print(a is b) # False(不是同一个对象)
print(a is a) # True(同一个对象)
-
规则:
==比较值,is比较内存地址(id) -
坑点:小整数缓存(-5~256)可能导致
is返回 True
5. 逻辑运算符的返回值
print(1 and 2) # 2 ← 不是 True!
print(0 or 5) # 5 ← 不是 True!
print(1 or 2) # 1 ← 不是 True!
-
原理:
and返回第一个假值或最后一个真值;or返回第一个真值或最后一个假值 -
记忆:
x and y→ 如果 x 为假返回 x,否则返回 y
6. 成员运算符的效率
# 列表查找 O(n)
print(3 in [1, 2, 3, 4, 5]) # True
# 集合查找 O(1)
print(3 in {1, 2, 3, 4, 5}) # True
# 字符串查找 O(n)
print('a' in 'abc') # True
-
优化:频繁查找用集合(set)而非列表(list)
-
下一篇:04_循环与列表