跳到主要内容

函数与装饰器

函数是 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