Python函数一篇搞定,从入门到装饰器
Python函数系统学习笔记来了,建议收藏慢慢看。
一、函数基础
Python用def定义函数,函数是第一类对象,可以赋值给变量、塞进列表、当参数传递。
参数类型非常灵活:
- 位置参数:按顺序传入
- 关键字参数:用name=value指定,顺序随意,可读性更好
- 默认参数:调用时可省略,但千万别用可变对象做默认值
- *args:收集多余位置参数为元组
- **kwargs:收集多余关键字参数为字典
参数固定顺序:位置参数 / *args / 关键字参数 / **kwargs
二、默认参数经典陷阱
def f(x, lst=[]): 这样写是错的!默认列表在定义时创建一次,多次调用共享同一个对象。正确做法是lst=None,在函数体里创建新列表。
三、作用域LEGB规则
变量查找顺序:Local -> Enclosing -> Global -> Built-in
函数内有赋值操作的变量默认为局部变量,修改外部变量要用global或nonlocal声明。
四、闭包
内层函数捕获外层作用域变量,即使外层函数已返回依然有效。常用于带状态的函数和工厂模式。
五、lambda表达式
匿名函数,只能有一个表达式。适合做排序key等简单回调,逻辑复杂就用def。
六、装饰器(重点)
本质是接收函数、返回新函数的高阶函数,不改原代码就能增强功能。
三层结构:接收原函数 -> 定义wrapper -> 返回wrapper
带参数的装饰器需要三层嵌套。
关键习惯:wrapper必须加@wraps(func),保留原函数元信息。
常见用途:日志记录、计时、权限校验、重试机制。
七、生成器
yield让函数暂停执行,下次调用从暂停处继续。内存友好,适合大数据流处理。
生成器表达式用圆括号,是列表推导式的惰性版本,百万级数据只占200字节。
八、工具三件套
- itertools:permutations排列、combinations组合、groupby分组、chain串联
- functools:lru_cache缓存结果、singledispatch按类型分发、partial固定参数
- operator:itemgetter比lambda更快,用于排序key
以上每一点都是日常开发反复用到的,建议收藏对照练习。