Python 教程(八):高级特性【高逼格代码】
Python 之所以“高级”,很大程度上是因为它提供了很多优雅、简洁但又功能强大的特性。下面列出一些真正能让代码看起来“高逼格”的高级写法,按实用性和“装X”程度排序。
1. 列表推导式 + 条件 + 嵌套(List Comprehension + 条件 + 嵌套)
# 普通写法
squares = []
for x in range(10):
if x % 2 == 0:
squares.append(x**2)
# 高逼格写法
squares = [x**2 for x in range(10) if x % 2 == 0]
更装X:嵌套 + 多条件
# 找出 1~100 内能被 3 或 5 整除的数的平方
result = [x**2 for x in range(1, 101) if x % 3 == 0 or x % 5 == 0]
# 笛卡尔积(高逼格经典)
colors = ['红', '绿', '蓝']
sizes = ['S', 'M', 'L']
products = [(c, s) for c in colors for s in sizes]
# [('红', 'S'), ('红', 'M'), ('红', 'L'), ('绿', 'S'), ...]
2. 生成器表达式(Generator Expression)——内存杀手克星
# 列表推导式 → 一次性生成整个列表(占内存)
squares_list = [x**2 for x in range(1000000)]
# 生成器表达式 → 按需生成(几乎不占内存)
squares_gen = (x**2 for x in range(1000000))
# 常用场景
total = sum(x**2 for x in range(1000000)) # 不创建中间列表
largest = max(x**2 for x in range(1000000))
3. 字典/集合推导式(Dict / Set Comprehension)
# 快速创建 {数字: 平方}
squares_dict = {x: x**2 for x in range(10)}
# 集合去重 + 过滤
unique_lengths = {len(word) for word in ['apple', 'banana', 'cherry', 'date']}
# {5, 6, 4}
4. 带 else 的循环(for … else / while … else)
# 寻找质数(找不到就执行 else)
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
else:
return True
更高级用法:搜索是否存在
names = ["Alice", "Bob", "Charlie"]
target = "David"
for name in names:
if name == target:
print("找到了!")
break
else:
print("没找到...")
5. 上下文管理器 with 语句(with 魔法)
# 普通写法
f = open('data.txt', 'r')
try:
data = f.read()
finally:
f.close()
# 高逼格写法
with open('data.txt', 'r') as f:
data = f.read() # 自动关闭
自定义上下文管理器(装X必备)
from contextlib import contextmanager
@contextmanager
def timer(label=""):
import time
start = time.perf_counter()
try:
yield
finally:
elapsed = time.perf_counter() - start
print(f"{label} 耗时: {elapsed:.4f}s")
# 使用
with timer("计算大列表"):
sum(range(10_000_000))
6. 装饰器(Decorator)——函数的“化妆师”
# 简单计时装饰器
import time
from functools import wraps
def timer(func):
@wraps(func) # 保留原函数元信息
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
print(f"{func.__name__} 耗时: {elapsed:.4f}s")
return result
return wrapper
@timer
def slow_add(a, b):
time.sleep(1)
return a + b
print(slow_add(3, 5))
7. @property + @setter + @deleter(优雅属性)
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name.upper()
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError("名字必须是字符串")
self._name = value
@name.deleter
def name(self):
print("删除名字!")
del self._name
p = Person("alice")
print(p.name) # ALICE
p.name = "Bob" # 正常赋值
print(p.name) # BOB
del p.name # 删除名字!
8. 多继承 + super()(MRO 优雅调用)
class A:
def say(self):
print("A says hi")
class B(A):
def say(self):
super().say()
print("B says hi")
class C(A):
def say(self):
super().say()
print("C says hi")
class D(B, C):
def say(self):
super().say()
print("D says hi")
D().say()
# 输出(按 MRO 顺序):
# A says hi
# C says hi
# B says hi
# D says hi
9. 切片赋值(Slice Assignment)——列表神操作
lst = [1, 2, 3, 4, 5]
# 替换中间部分
lst[1:4] = [99, 100]
print(lst) # [1, 99, 100, 5]
# 删除一段
lst[2:4] = []
print(lst) # [1, 99, 5]
# 插入(不替换)
lst[1:1] = [7, 8, 9]
print(lst) # [1, 7, 8, 9, 99, 5]
10. 枚举 + 具名元组(NamedTuple)+ 数据类(dataclass)
# 传统元组
point = (3, 4)
print(point[0]) # 不直观
# 具名元组(更直观)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x, p.y) # 3 4
# Python 3.7+ 更推荐 dataclass
from dataclasses import dataclass
@dataclass
class PointDC:
x: float
y: float
def distance(self):
return (self.x**2 + self.y**2)**0.5
p = PointDC(3, 4)
print(p.distance()) # 5.0
小结:高逼格代码的几个原则
- 能用推导式就用(列表/字典/集合/生成器)
- 优先使用 with 上下文
- 善用装饰器和 @property
- 善用 else 子句和 super()
- 用 dataclass 代替普通类(Python 3.7+)
- 写代码时多考虑可读性与简洁性的平衡
下一期想看什么高级特性?
A. 迭代器 & 生成器深入
B. 描述符(Descriptor)
C. 元编程(metaclass、new 等)
D. 异步编程(asyncio)
E. 其他你想看的主题
告诉我字母,我们继续!