偷懒小技巧:Python 的语法糖
·
文章目录
Python 的语法糖是些"偷懒小技巧"——不影响功能,但能让代码更短、更顺、更像人话。整理了些高频实用的:
1. 推导式(列表/字典/集合)
用一行搞定"循环+条件+生成序列",替代冗长的 for 循环。
# 列表推导式(替代 for+append)
nums = [i*2 for i in range(5) if i%2==0] # [0, 4]
# 字典推导式(替代 for+键值对)
dict1 = {k: v*2 for k, v in {'a':1, 'b':2}.items() if v>1} # {'b':4}
# 集合推导式(去重+生成)
set1 = {i%3 for i in range(10)} # {0,1,2}
2. 三元表达式
一行搞定简单的 if-else 判断,替代四五行的分支。
# 替代:
# if score >=60:
# res = "及格"
# else:
# res = "不及格"
res = "及格" if score >=60 else "不及格"
3.切片操作
Python的切片操作是处理序列(列表、字符串、元组等)的强大语法糖,通过简洁的[start:stop:step]格式,能快速实现截取、反转、跳步等操作,避免冗长的循环代码。以下是具体用法示例:
# 基础序列(以列表为例,字符串、元组用法相同)
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
text = "abcdefghij"
# 1. 基本切片:[start:stop](左闭右开,默认步长1)
print(nums[2:5]) # 从索引2取到4(不含5)→ [2, 3, 4]
print(text[3:7]) # 字符串切片 → "defg"
# 2. 省略参数:自动补全默认值
print(nums[:5]) # 省略start → 从开头取到4 → [0, 1, 2, 3, 4]
print(nums[3:]) # 省略stop → 从3取到末尾 → [3, 4, 5, 6, 7, 8, 9]
print(nums[:]) # 省略所有 → 复制整个序列 → [0, 1, 2, ..., 9]
# 3. 负数索引:从末尾开始计数(-1是最后一个元素)
print(nums[-3:]) # 取最后3个 → [7, 8, 9]
print(nums[:-2]) # 取到倒数第2个(不含)→ [0, 1, 2, 3, 4, 5, 6, 7]
print(nums[-5:-2]) # 从倒数第5到倒数第3 → [5, 6, 7]
# 4. 步长控制:[start:stop:step]
print(nums[::2]) # 步长2 → 隔一个取一个 → [0, 2, 4, 6, 8]
print(nums[1::3]) # 从1开始,步长3 → [1, 4, 7]
# 5. 反转序列:步长为-1(最常用的反转语法糖)
print(nums[::-1]) # 反转列表 → [9, 8, 7, ..., 0]
print(text[::-1]) # 反转字符串 → "jihgfedcba"
# 6. 切片赋值(仅列表支持,字符串/元组不可变)
nums[2:5] = [20, 30, 40] # 替换索引2-4的元素
print(nums) # → [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
nums[5:8] = [500] # 长度不匹配时自动扩展/收缩
print(nums) # → [0, 1, 20, 30, 40, 500, 8, 9]
# 7. 清空列表(保留容器)
nums[:] = []
print(nums) # → []
核心优势:
- 无需手动写循环截取,一行代码完成复杂操作
- 支持负数索引和步长,轻松处理"从末尾取n个"、"反转"等场景
- 切片操作返回新序列,不修改原序列(除非主动赋值)
无论是处理列表、截取字符串还是反转序列,切片都能让代码更简洁直观,是Python中最受欢迎的语法糖之一。
### 4. 星号表达式(*)
灵活解包/收集元素,替代手动处理可变参数或拆分序列。
```python
# 解包序列
a, *mid, b = [1,2,3,4,5] # a=1, mid=[2,3,4], b=5
# 合并列表
list1 = [1,2]
list2 = [3,4]
merged = [*list1, *list2] # [1,2,3,4]
# 函数可变参数
def func(*args): # args 收集所有位置参数成元组
print(args)
func(1,2,3) # (1,2,3)
5. 装饰器(@)
给函数/类"戴帽子",在不修改原代码的情况下加功能(日志、缓存等),替代手动嵌套调用。
def log(func):
def wrapper(*args):
print(f"调用了{func.__name__}")
return func(*args)
return wrapper
@log # 等价于:add = log(add)
def add(a,b):
return a+b
add(1,2) # 打印"调用了add",返回3
6. with 语句
自动处理资源(文件、连接等)的"打开-关闭",替代 try-finally 一堆收尾代码。
# 替代:
# f = open("file.txt")
# try:
# data = f.read()
# finally:
# f.close()
with open("file.txt", "r") as f:
data = f.read() # 自动关闭文件
7. 海象运算符(:=,3.8+)
在表达式里直接赋值,少写一行代码(尤其适合条件判断时)。
# 替代:
# n = len(list1)
# if n > 5:
# print(n)
if (n := len(list1)) > 5: # 赋值+判断一步到位
print(n)
8. 链式比较
直接连写比较条件,替代用 and 拼接的冗长表达式。
# 替代:18 < age and age < 60
if 18 < age < 60:
print("成年且未退休")
9. f-string(3.6+)
字符串格式化的"天花板",比 % 和 format 更直观,支持表达式嵌入。
name = "张三"
age = 20
# 替代:"我叫%s,今年%d岁" % (name, age)
print(f"我叫{name},今年{age+1}岁") # 直接嵌变量/表达式
10. 字典合并(**)
快速合并多个字典,替代 update 或循环赋值。
d1 = {'a':1}
d2 = {'b':2}
merged = {** d1, **d2} # {'a':1, 'b':2}(重复键后者覆盖)
这些语法糖的核心是"少写废话"——让代码聚焦逻辑,而不是格式。熟练了之后,写起来顺,读起来也爽。
更多推荐




所有评论(0)