02.1
一等函数
函数可作为变量赋值、存入容器、当作参数与返回值,这是函数式风格的基础。
def apply(op, a, b): return op(a, b)
add = lambda x, y: x + y
print(apply(add, 2, 3)) # 502.2
lambda 与高阶
lambda 表达匿名小函数;map/filter/sorted 等高阶函数配合可声明式处理集合(推导式常更可读)。
names = sorted(users, key=lambda u: u.name)
values = list(map(int, ["1", "2", "3"]))02.3
闭包
内部函数捕获外层变量形成闭包,常用于工厂函数与状态封装。
def counter():
n = 0
def inc():
nonlocal n
n += 1
return n
return inc
c = counter(); print(c(), c()) # 1 202.4
装饰器
装饰器是"接收函数、返回新函数"的高阶函数,用于日志、缓存、权限等横切逻辑,语法用 @。
import time, functools
def timed(f):
@functools.wraps(f)
def wrapper(*a, **k):
t = time.time(); r = f(*a, **k); print(f"{f.__name__}: {time.time()-t:.3f}s")
return r
return wrapper
@timed
def slow(): time.sleep(0.1)02.5
类与继承
用 class 建模,__init__ 初始化、self 指代实例;支持单/多重继承与方法重写。
class Animal:
def __init__(self, name): self.name = name
def speak(self): raise NotImplementedError
class Dog(Animal):
def speak(self): return f"{self.name} 汪"02.6
dataclass
@dataclass 自动生成 __init__/__repr__/__eq__,让数据类声明变得极简。
from dataclasses import dataclass, field
@dataclass
class User:
id: int
name: str
tags: list[str] = field(default_factory=list)可变默认用 field
与函数默认参数同理,dataclass 中用 field(default_factory=list) 避免共享可变默认。
02.7
特殊方法
__str__/__eq__/__len__ 等魔法方法让自定义对象融入语言内建操作。
class Vector:
def __init__(self, x, y): self.x, self.y = x, y
def __add__(self, o): return Vector(self.x+o.x, self.y+o.y)
def __repr__(self): return f"V({self.x},{self.y})"02.8
常见陷阱
用 functools.wraps(f) 包裹内层,保留 __name__/__doc__,对文档与调试至关重要。
类变量若赋可变对象会在实例间共享。可变状态应放在 __init__ 里作为实例属性。
02.9