函数与装饰器
函数是 Python 的一等公民。掌握参数、闭包与装饰器,是写出可复用代码的关键。
函数参数:*args 与 **kwargs
- 位置参数按顺序传,关键字参数按名传
*args收集多余位置参数为元组**kwargs收集多余关键字参数为字典- 顺序固定:位置参数 → 默认值 →
*args→ 仅关键字参数 →**kwargs
def log(level, *args, sep=" ", **kwargs):
print(f"[{level}]", *args, sep=sep, **kwargs)
闭包
闭包是引用了外层作用域变量的内层函数。外层变量被捕获而非复制,修改时需用 nonlocal。
def make_counter():
n = 0
def inc():
nonlocal n
n += 1
return n
return inc
装饰器
装饰器是可调用对象,接受函数并返回函数。常用于日志、鉴权、缓存等横切关注点。
import functools
def logger(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"call {func.__name__}")
return func(*args, **kwargs)
return wrapper
functools.wraps 用于保留原函数的 __name__、__doc__ 等元信息,便于调试与文档生成。
带参数的装饰器
外层函数接收参数,返回真正的装饰器。
def repeat(times):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return [func(*args, **kwargs) for _ in range(times)]
return wrapper
return decorator
lambda 的限制
lambda 只能写单个表达式,不能包含语句或注解。常用于短小的回调,如 sorted(data, key=lambda x: x[1]),复杂逻辑请用 def。