pythonPython Syntactic Sugar以及注意事项速查手册
ShiroRikka📚 Python 语法糖速查手册(学习优化版)
1. 🔹 ==
vs is
vs in
速查表(基础必会)
一句话理解:区分值相等、对象同一性、成员存在,避免低级错误。
运算符 |
作用 |
正确用法 |
错误示例 |
== |
值相等 (比较内容) |
if name == "admin":
if [] == []: # True |
if name == None: # 避免,改用 is None |
is |
同一对象 (比较内存地址) |
if user is None: # ✅ 强制规范
if flag is True: # 仅限True/False |
if user is "admin": # ❌ 危险(字符串驻留陷阱) |
in |
成员存在 (检查容器) |
if "a" in "abc":
if 3 in [1,2,3]: |
if "x" in "a,b,c": # 注意:返回False(不是子串) |
💡 关键区别:
1 2 3 4 5 6
| a = [1, 2]; b = [1, 2] a == b a is b
'py' in 'python' 'x' in ['a','b']
|
⚠️ 核心注意事项:
None
必须用 is
:if x is None
(解释器保证单例)
- 字符串/数字慎用
is
:仅限 True
/False
/None
in
优先替代 or
:if role in ["admin", "mod"]
比 if role=="admin" or role=="mod"
更简洁
🛠 使用场景:
- 条件判断(登录验证、空值检查)
- 数据过滤(检查列表/字典是否存在)
2. 🔹 三元表达式(条件表达式)
一句话理解:一行写简单 if-else,替代基础条件判断。
✅ 语法:
💡 示例:
1 2 3 4 5 6 7 8
| result = "奇数" if num % 2 else "偶数"
status = "登录" if is_login else "未登录"
flags = [True, False]; text = ["高" if f else "低" for f in flags]
|
⚠️ 核心注意事项:
- 仅限表达式:不能包含语句(如
return
、for
)
- 禁止嵌套:避免
a if x else b if y else c
(改用普通 if)
- 不可赋值:
(x=1) if True else (x=2)
语法错误
🛠 使用场景:
- 变量简单赋值
- 列表推导式中的条件分支
- Lambda 函数内部逻辑
3. 🔹 列表、字典、集合推导式
一句话理解:用一行代码创建新序列,替代简单循环。
✅ 语法:
1 2 3
| [表达式 for 变量 in 可迭代对象 if 条件] {键:值 for 变量 in 可迭代对象 if 条件} {表达式 for 变量 in 可迭代对象 if 条件}
|
💡 示例:
1 2 3 4 5 6 7 8 9 10
| squares = [x*x for x in range(5)]
names = ["tom", "jerry", "bob"] filtered = [name.upper() for name in names if len(name)>3]
original = {"a":1, "b":2} inverted = {v:k for k,v in original.items()}
|
⚠️ 核心注意事项:
- ≤2层逻辑:嵌套超过2层需要改用普通循环(可读性下降)
- 避免副作用:推导式内不要修改外部变量
- 不替代复杂逻辑:需多次遍历时用
for
循环
🛠 使用场景:
- 数据清洗(过滤无效值)
- 格式转换(单位/大小写转换)
- 创建新序列(替代
map
+filter
)
4. 🔹 lambda(匿名函数)
一句话理解:临时小函数,一行搞定简单逻辑。
✅ 语法:
💡 示例:
1 2 3 4 5 6 7 8 9
| add = lambda a,b: a+b; add(2,3)
pairs = [(3,"c"), (1,"a"), (2,"b")] sorted(pairs, key=lambda x: x[0])
list(map(lambda x: x*2, [1,2,3]))
|
⚠️ 核心注意事项:
- 单行限制:不能写多行代码或
if-else
语句
- 调试困难:报错显示
<lambda>
,不易定位
- 复杂逻辑用
def
:超过20字符的表达式改用正式函数
🛠 使用场景:
sorted
/max
的 key
参数
map
/filter
的转换函数
- 简单回调(如事件处理)
5. 🔹 生成器表达式(Generator)
一句话理解:按需生成数据的“懒加载”序列,处理大数据不占内存。
✅ 语法:
1
| (表达式 for 变量 in 可迭代对象 if 条件)
|
💡 示例:
1 2 3 4 5 6 7 8 9 10 11 12
| gen = (x**2 for x in range(3))
print(next(gen)) print(next(gen)) print(next(gen))
with open("big.log") as f: errors = (line for line in f if "ERROR" in line) print(next(errors))
|
⚠️ 核心注意事项:
- 只能遍历一次:迭代完后无法重用(需重建)
- 不存全部数据:每次
next()
才计算下一个值
- 与列表区别:
[x for x]
立即计算,(x for x)
懒加载
🛠 使用场景:
- 大文件处理(避免内存溢出)
- 无限序列(如传感器数据流)
- 流式计算(管道式数据处理)
6. 🔹 装饰器(Decorator)
一句话理解:不改原函数代码,动态添加功能(如计时、重试)。
✅ 语法:
1 2 3
| @装饰器(参数) def 函数(参数): 函数逻辑
|
- 本质:
函数 = 装饰器(函数)
- 执行顺序:多个装饰器时从下往上执行(
@a @b
→ a(b(函数))
)
💡 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import time from functools import wraps
def repeat(time=3): """重复执行函数的装饰器。""" def decorator(func): @wraps(func) def wrapper(*args, **kwargs): for _ in range(time): result = func(*args, **kwargs) return result return wrapper return decorator
@repeat(2) def fetch_data(): print("数据...")
fetch_data()
|
⚠️ 核心注意事项:
- 必须返回结果:
wrapper
需 return func(*args, **kwargs)
- 参数通吃:始终用
*args, **kwargs
接收参数
- 保留元信息:必须用
@wraps(func)
(避免函数名丢失)
- 避免无限递归:内部调用
func
而非 wrapper
🛠 使用场景:
- 性能监控(
@timer
)
- 权限验证(
@login_required
)
- 异常处理(
@retry
)
- 缓存优化(
@cache
)
7. 🔹 with
语句(资源管理)
一句话理解:自动安全释放资源,出错也能清理。
✅ 语法:
💡 示例:
1 2 3 4 5 6 7 8 9 10 11
| with open("data.txt", "r") as f: content = f.read()
with db.connect() as conn: conn.execute("SELECT * FROM users")
with lock: shared_data.update()
|
⚠️ 核心注意事项:
- 仅限上下文管理器:对象需实现
__enter__
/__exit__
- 替代 try-finally:比手动
f.close()
更可靠
- 不跨作用域:资源离开
with
块即释放
🛠 使用场景:
- 文件操作(强制规范)
- 网络/数据库连接
- 线程锁管理
✅ 核心概念速查表(优化版)
概念 |
核心语法 |
一句话口诀 |
新手重点 |
== /is /in |
x is None |
值等用==,对象同用is |
None 必用 is |
三元表达式 |
"A" if cond else "B" |
条件判断一行写 |
禁止嵌套 |
列表推导式 |
[x*2 for x in range(5)] |
推导一行代循环 |
≤2层逻辑 |
lambda |
lambda x: x+1 |
匿名函数临时用 |
单行表达式 |
生成器 |
(x for x in range(5)) |
数据用时才生成 |
只能遍历一次 |
装饰器 |
@timer |
函数增强不改码 |
记住 @wraps |
with |
with open() as f: |
资源管理自动关 |
文件必用 |
📎 附:30秒记忆口诀
🎯 值等双等对象is,三元条件一行记,
推导替换简单循,lambda单行临时用,
生成器省内存,装饰器增强函数,
with自动关资源,安全高效不泄漏!