
我刚学 Python 的时候,写循环写得特别顺手。遇到一个列表要处理,第一反应就是 for i in range(len(list))。后来看别人的代码,发现有人写 map 和 filter,代码短得惊人。我还觉得人家在炫技,心里想:循环明明也能解决问题,干嘛要学新东西。
直到有一天,我接手一个项目,里面有几千行代码。满眼都是嵌套的 for 循环,变量名满天飞。我改一个功能,要顺着循环一层一层往下找,脑子都快炸了。那天我才意识到,循环写起来爽,读起来是真遭罪。
你想想看,循环到底在做什么?它在告诉计算机“你先这样做,然后那样做,做完再回来”。每一次循环你都要操心索引对不对,边界有没有越界。大脑就像同时在处理两件事:业务逻辑是什么,控制流程怎么走。map 和 filter 把这些脏活包了,你只需要关心数据怎么变。
举个最简单的例子。你有一组数字,想把每个数字翻倍。循环写法是这样的:
numbers = [1, 2, 3, 4, 5]
doubled = []
for n in numbers:
doubled.append(n 2)
用 map 怎么写呢?
doubled = list(map(lambda x: x 2, numbers))
一行搞定。你一眼就能看出来,这行代码在做一个映射:把 numbers 里的每个数乘以 2。map 的核心价值不是省行数,是让你从“怎么遍历”里解脱出来。
filter 也一样。你想从一个列表里挑出偶数。循环要写三四行,filter 一行:
evens = list(filter(lambda x: x % 2 == 0, numbers))
这行代码读起来就是“过滤出 numbers 里能被 2 整除的数”。不必关心怎么判断、怎么收集结果。逻辑从上往下读,数据顺着管道走,大脑负担轻了一大半。
有人担心性能问题。其实 Python 的 map 和 filter 跟循环速度差不多,某些情况下还更快。它们内部有优化,不是用 Python 的 for 循环跑出来的。你写循环的时候,每次 append 都会触发一次列表扩容,map 和 filter 直接预分配好了空间。想跑得快,用 map 和 filter 反而更稳。
还有人说 lambda 不好读。那你自己定义个函数传进去行不行?完全可以。比如你有个复杂的转换逻辑,定义一个函数 clean_data,然后 list(map(clean_data, raw_list))。比你写一大坨 for 循环好看十倍。函数名就是文档,读代码的人一看就知道你要干嘛。
我现在的习惯是,数据处理写 map 和 filter,只有那种顺序执行、依赖前后状态的操作才用循环。比如发邮件要记录发送失败的,或者需要跳出多层的,这些用循环没问题。但如果你只是在遍历列表做变换或者过滤,别用循环,直接用 map 和 filter。
你试试看把旧代码里的循环改一改。改完你会发现,代码短了,逻辑清楚了,别人接手你的代码也能少骂两句。这就是 map 和 filter 给你的礼物。
以上就是“别再用循环了,用 Python 的 map 和 filter,代码又简洁又高效。”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14380/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料