Python技术迷

替代for循环,让Python代码更pythonic !

哎我刚才在公司楼下那个椅子上坐着喝口水…你别说这天气有点闷,我脑子一下子就想起昨天晚上一点多还在改那个 Python 脚本…就是…嗯…跟你说那个 for 循环的事儿,对吧?我当时整得头有点大,你们是不是也经常写着写着就一堆 for 在那儿乱飞?

我跟你讲,我那会儿代码调着调着,小李还在旁边问我:“东哥你那个数组过滤咋写的?你咋不 for 一把就完了?”我说你等会儿我先把烟灭了…然后就跟他念叨,Python 这玩意儿其实不用啥循环…呃不是不用,是少用,写得像流里流气那种更舒服一点,就是那种…pythonic,你懂的…但是我一说这个他又问我啥叫 pythonic,我一下又卡壳…算了继续说代码。

反正昨晚那个场景嘛,我在调一个 log 解析的逻辑,本来写了个 for…类似这样:

result = []
for item in data:
if item.get("status") == "ok":
        result.append(item["value"])

我一边写还一边咕哝“这代码咋这么啰嗦”…然后就突然想起之前在地铁上刷视频…有人说可以用列表推导式啥的,我就随手改了一下——你看啊…那个…

result = [item["value"] for item in data if item.get("status") == "ok"]

当时看到那行我人都精神了,你懂吧,就是突然从一坨…呃…比较臃肿的结构一下变成“哎挺顺眼”的那种感觉。小李还凑过来说:“哇东哥你这精简得不错啊。”我说“滚滚滚,别夸我我容易骄傲。”

后来我代码跑起来一看,卧槽比原来快一点点,虽然不是啥质变,但心情就不一样了。你们是不是也这样?看着整洁就开心。

然后我刚准备泡面…小锅都开火了,手机 ding 一下,领导喊我帮他过一段字典过滤的代码。我那泡面泡着泡着,我就在那跟他说:“你别再用 for 拼字典了辣,你都 2025 年了还这样写…”

我给他举个例子嘛:

他原来写的:

filtered = {}
for k, v in config.items():
if v isnotNone:
        filtered[k] = v

我就边撕泡面调料包边说:

filtered = {k: v for k, v in config.items() if v isnotNone}

他还愣了两秒,说:“这不是一样的吗?” 我说:“一样,但你看哪段写起来更像睡饱觉之后写出来的代码。”

这不是我吹牛,有时候你这样改完,你整个项目看起来就顺眼多了,你心情也好,你队友也爱你…呃也不至于爱吧,至少不会骂你。

然后我刚说到哪儿了?哦对…还有 map / filter 那两个东西。昨天下午三点多我在茶水间装水,一个同事问我:“东哥我听说 map 很快是不是?”我一口气直接喷出来…我说你别迷信性能,主要是看可读性呀。有些场景 map 就挺顺溜的,比如:

nums = [1, 2, 3, 4]
squares = list(map(lambda x: x * x, nums))

不过我自己一般还是 prefer 列表推导式,看起来顺:

squares = [x * x for x in nums]

我当时还跟他说:“你看我这样写,是不是像在说话一样?你 map 那种就像在教室里听老师念课文。”

不过 filter 有时候感觉…怎么说…就是用一下也挺清爽,比如:

valid = list(filter(lambda x: x > 0, nums))

但是我还是改成:

valid = [x for x in nums if x > 0]

看起来舒服。

哎对了我昨天还踩个坑,就是生成器那块儿。晚上十一点多,我那猫在我键盘上踩来踩去,我写 generator expression 手都打抖:

g = (x * x for x in nums)

结果我还以为它跟 list comprehension 一样能复用,结果读一次就没了,我整个人都“啊???”了一下。然后我又回去翻文档,看了下,哦对生成器读一次就空了…我那猫还用尾巴扫我脸,烦死了。

总之吧…就是…你看我说得乱七八糟的,但想表达一个意思:多用推导式、生成器、内置函数这种东西,写起来像是…嗯…像是你随手写,但又很优雅那种,也不费劲,别人看你的代码也不会骂你脑子进水。

我本来还想继续说那个 reduce 的事儿,但是我肚子有点饿,我先去翻个面包…待会儿再想起来啥再跟你说吧…

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB。