![]()
Medium上有个Python专栏,350万月活读者追着看。作者Abdur Rahman干了件扎心的事——他翻了自己十年写崩的代码,发现最蠢的错误都不是框架用错,是基本功里的「小聪明」缺了位。
「你不是靠写更多代码变强的,是靠写更少蠢代码。」
这话他写在文章开头,底下程序员集体破防。我扒完他列的9个技巧,发现个规律:全是Python标准库里藏着的「暗门」,官方文档写了,但没人教你怎么串起来用。
技巧一:把if-else链扔进字典里
新手写状态机,惯用三层if-else嵌套。Rahman给看了一段他早期的「耻辱代码」:判断用户操作类型,12个分支,缩进跑到屏幕外。
重构方案叫「函数调度表」(Function Dispatch Table)。Python的字典天生能存函数对象,把操作名当key,对应函数当value。查找用.get(),默认值塞个lambda返回"Unknown action"。
代码行数从47行压到9行,扩展新操作只需加字典项。
这技巧老程序员叫「策略模式」,但Rahman说得直白:别急着上设计模式,先学会用字典当开关。
技巧二:列表推导式里的条件过滤
他见过最离谱的循环:先建空列表,for遍历,if判断,append追加。四行代码干的事,列表推导式一行搞定。
但Rahman加了条警告——嵌套两层以上的推导式,可读性断崖下跌。他的分界标准:如果推导式需要换行,就改回普通循环。
「代码是写给人看的,顺便给机器跑。」
技巧三:用enumerate()告别计数器变量
这个被低估到荒唐。他统计过自己2020年前的代码,83%的for循环里手动维护了i=0, i+=1。enumerate()返回索引和元素元组,直接解包。
更阴的用法:start参数。处理分页数据时,enumerate(items, start=page*20)让索引直接对齐全局位置,省去一堆偏移计算。
技巧四:zip()的平行迭代陷阱
同时遍历两个列表,新手先想索引对齐。Rahman列了段典型错误:用range(len(list1)),再分别取list1[i]和list2[i],遇到长度不等直接IndexError。
zip()自动截短到最短序列,itertools.zip_longest()则用fillvalue补位。他建议养成肌肉记忆:见到并行迭代,先问自己「要不要处理不等长」。
这个选择决定你用zip还是zip_longest,也决定代码会不会半夜报错。
技巧五:上下文管理器的自定义
with语句不只是打开文件。Rahman展示了个场景:数据库事务需要自动commit/rollback,计时器需要自动打印耗时。
用contextlib模块的@contextmanager装饰器,把setup和cleanup逻辑包成生成器。yield前面是进入操作,后面是退出操作。异常处理用try/finally嵌套,保证资源释放。
他特别提到:这比写完整的__enter__/__exit__类轻量得多,适合一次性使用的场景。
技巧六:dataclass消灭样板代码
Python 3.7+的特性,Rahman称为「最被低估的官方礼物」。定义数据容器类,原本要写__init__、__repr__、__eq__一堆方法,现在一个装饰器搞定。
进阶用法:frozen=True做成不可变对象,order=True自动生成比较方法。他用在配置类上,意外发现比字典好调试——IDE能自动补全属性名,拼写错误当场报错。
技巧七:pathlib替换os.path
字符串拼接路径是跨平台bug的温床。Rahman列了组对比:os.path.join()要记参数顺序,pathlib的/运算符直接可读。
Path对象支持链式操作:p.parent / 'subdir' / 'file.txt'。方法也更语义化:.exists()、.is_file()、.read_text(),不用来回查os模块的文档。
他唯一保留os.path的场景:处理遗留代码,或者同事死活不肯升级Python 3.6以下。
技巧八:f-string的调试语法
Python 3.8埋了个彩蛋:f"{variable=}"自动输出variable=值。调试时不用写f"variable={variable}",省一半字符。
Rahman的用法更骚:在复杂表达式里插f"{(a+b)*c=}",括号保证运算优先级,等号触发调试格式。配合logging模块,临时调试行删起来也干净。
技巧九:海象运算符的循环优化
:=这个符号3.8引入,名字来自《爱丽丝镜中奇遇》的「海象」诗。Rah曼承认第一眼觉得丑,用顺了才发现真香。
典型场景:while循环里需要同时赋值和判断。文件逐行读取,旧写法要break两次,新写法while (line := file.readline()): 一次搞定。
他加了条红线:海象运算符别嵌套,可读性代价太高。单行简单赋值是甜蜜点,复杂逻辑老老实实拆开。
九个技巧看完,Rahman的结语很克制:这些不会让你变成Python大神,但能让你少写很多「明天就想删」的代码。
文章底下有条高赞评论:「第3条enumerate(),我写了八年Python才知道start参数。」
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
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.