Python 教程(八):高级特性【高逼格代码】

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

小结:高逼格代码的几个原则

  1. 能用推导式就用(列表/字典/集合/生成器)
  2. 优先使用 with 上下文
  3. 善用装饰器和 @property
  4. 善用 else 子句和 super()
  5. 用 dataclass 代替普通类(Python 3.7+)
  6. 写代码时多考虑可读性与简洁性的平衡

下一期想看什么高级特性?
A. 迭代器 & 生成器深入
B. 描述符(Descriptor)
C. 元编程(metaclass、new 等)
D. 异步编程(asyncio)
E. 其他你想看的主题

告诉我字母,我们继续!

文章已创建 4138

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部