零壹教育:列表推导式到底好在哪?从新手循环到Pythonic的必经之路
零壹教育:这行代码[x*2 for x in range(10) if x%2==0],看着简单,背后做了三件事:过滤、映射、收集。新手觉得在炫技,老手知道这是 Python 的日常写法,也是区分“会写”和“写得像 Python”的一道坎。
新手习惯写循环:先建空列表,再for遍历,加个if判断,最后append往里填。四五行代码只干一件小事,还得留意索引和状态,一不小心就出界了。列表推导式一行解决,而且跑得更快——解释器对它做了专门优化,比手写循环快一倍左右,省掉了反复调用append的开销。
但这东西也不能乱用。三层嵌套的推导式,看着像天书,那不叫 Pythonic,那是为难别人。可读性永远比写得短更重要。Python 之父说过:代码被读的次数比写的多得多。你写一行别人看三遍才懂的代码,那就输了。逻辑复杂的,该拆开写就拆开写,推导式不是万能药。
推导式还有几个兄弟:字典推导式{k: v for k, v in items},集合推导式{x for x in data},结构差不多,上手很快。还有生成器表达式(x*2 for x in range(10)),它更省内存,不一次性生成所有结果,而是一个一个往外吐,处理几十万条数据也不慌,像水龙头,打开才有水,不像水桶一次性全装好。
所谓 Pythonic,不是把代码压缩到最短,而是写得自然、好读。列表推导式就是一道门槛,跨过去之后,你看代码的方式会变。少写那些啰嗦的循环,多写点声明式的表达,写起来顺手,别人看着也舒服。代码不仅是给机器跑的,更是给人看的。