写Python五年的人,有四年在假装懂。这不是贬低——是作者Aashish Kumar在Medium上的原话。他的代码能跑、能上线、没人投诉,但遇到装饰器、生成器、元类这些词,只能点头附和,然后默默Google。
文档看过无数遍,真正开窍靠的是某个具体例子。就像你学骑车,看再多力学原理不如摔一跤。本文15个概念,每个都配了那个"让人拍大腿"的代码片段。
可变默认参数:Python最著名的坑
def add_item(item, items=[]): items.append(item); return items —— 这个写法,80%的Python开发者栽过。
第一次调用add_item(1)返回[1],没问题。第二次调用add_item(2)返回[1, 2],很多人当场懵掉。默认参数在函数定义时求值,不是调用时。列表作为可变对象,被所有调用共享。
修复方案用None做哨兵:def add_item(item, items=None): if items is None: items = []。作者花了两年才真正内化这个区别,之前只是机械地"最佳实践"照抄。
装饰器:不是语法糖,是代码的"插件系统"
作者早期把@logger当成神秘咒语。转折点是把装饰器理解为"在不修改原函数的情况下加功能"。
手写一个计时器:def timer(func): def wrapper(*args, **kwargs): start = time.time(); result = func(*args, **kwargs); print(f"{func.__name__} took {time.time()-start:.2f}s"); return result; return wrapper。三层嵌套看清本质——装饰器是高阶函数返回高阶函数。
带参数的装饰器更绕:@retry(max_attempts=3)需要再包一层。作者说这时候画个调用栈图,比读十遍文档管用。
生成器:省内存的"水龙头"思维
处理GB级JSON文件时,列表推导式直接爆内存。换成生成器表达式(expr for x in data),内存压在200MB以下。
yield关键字的关键认知:函数执行到yield就暂停,状态冻结,下次从断点继续。这不是"返回多个值",是"把函数变成可恢复的计算过程"。作者类比:列表是装满水的桶,生成器是按需开水龙头。
send()方法让生成器变成双向通道:value = yield result。这个特性支撑了Python的协程生态,但90%的人没用过。
上下文管理器:with语句的隐藏协议
作者用了三年with open(),没问过为什么。直到自己实现__enter__和__exit__,才理解这是"资源获取即初始化"的Python化表达。
contextlib模块的contextmanager装饰器把生成器变成上下文管理器。三行代码替代一个类:@contextmanager def managed_resource(): resource = acquire(); try: yield resource; finally: release()。
Selenium和Playwright的浏览器自动化重度依赖这个模式。作者评论:没搞懂上下文管理器就写自动化脚本,等于开着漏油的车上高速。
元类:99%的人不需要,但得知道存在
作者把元类比作"类的类"。type(name, bases, namespace)动态创建类,继承type则控制类的创建过程。
实际用例:ORM框架用元类把类属性映射到数据库字段。Django的Model基类就是元类魔法。作者建议:除非写框架,否则别碰。但面试被问到时,能说出"元类控制类创建,装饰器控制实例行为"就够了。
其他十个概念同样配有"顿悟时刻"的代码:描述符协议、闭包与延迟绑定、多重继承的MRO、协程与async/await、GIL的真相、__slots__的内存优化、弱引用与循环GC、functools的partial和lru_cache、数据类的演进(dataclasses)、模式匹配的结构化拆解。
作者最后留了道开放题:你学Python时,哪个例子让你从"照抄"变成"真懂"?他的答案是装饰器——当他不再纠结@符号,而是画出函数返回函数的调用链时,整个Python的高级特性突然连成了网。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.