网易首页 > 网易号 > 正文 申请入驻

Python 3.8 新运算符 := 让我们懒出新高度

0
分享至

  背景

  Python 的语法风格确实是懒人福音,真是做到了多写一行都是罪。就拿 Python-3.8 版本来说吧,为了少写一行代码,直接搞出了一个新的运算符 `:=`。

  先给结论!这个运算符不是必要的。也就是说没有它我们也能写程序,只是有了它之后我们的代码可以更加简洁。

  下面我就来说一下这个运算符的故事!

  阶段 一

  这个阶段大家做事都中规中矩,代码上直抒胸臆。给个例子吧。假设我们有一个函数,它是用来处理列表的,它会在处理之前检查一下列表的长度,当长度大于 7 时直接退出。阶段一这个时候的代码看起来如下。

  def fun(lst=None): """ Parameters: lst: 列表 Return: None """ # if len(lst) > 7: print(f"len(lst) = {len(lst)} gt 7 , not supported .") return # 其它逻辑

  这里有一个小小的问题,就是 `len(lst)`在命中 if 的语句时候它还会在 print 语句里面再被计算一次。如果计算本身的开销就比较高,少计算一次就非常有吸引力了,阶段二就是向这个方向进化的。

  阶段二

  阶段二的写法也是非常直接,只要保存一下第一次计算的结果,第二次的时候直接取结果,这样就不用再计算一次了。上代码

  def fun(lst=None): """ Parameters: lst: 列表 Return: None """ # n = len(lst) if n > 7: print(f"len(lst) = {n} gt 7 , not supported .") return # 其它逻辑

  阶段二的写法也不是完全没有可以改进的地方,我们看 n 其实只在 if 块里面有用到,但是它的声明位置是在 if 之外的。这个就给人一种,这个 n 非常重要后面的代码还会用到它的感觉。也就是说这种写法没有办法表现出 n 就是一个临时变量。

  好在这种语义已经可以在 Python-3.8 这个版本中表达了,不过我们要借助全新的运算符 `:=`来实现。详细的请看阶段三。

  阶段三

  阶段三是真正的做到了形与意合,并且没有什么学习成本,语法上可以说是一看就懂,我直接上代码。

  def fun(lst=None): """ Parameters: lst: 列表 Return: None """ # if (n:= len(lst)) > 7: print(f"len(lst) = {n} gt 7 , not supported .") return # 其它逻辑

  现在从词法上看,就能非常明确地知道 n 只在 if 语句内起作用。由于阶段三只是阶段二的语法糖,也就是说从作用域上来讲 n 在 if 语句之后还是可以正常访问,这个应该就是唯一美中不足的地方了吧。

  为什么说 := 是语法糖

  这一点是从官方文档上不能直接看出来的,需要我们去看 fun 函数两种不同写法,编译出来的字节码。

  In [1]: import dis In [2]: def fun(lst=None): ...: """ ...: Parameters: ...: lst: 列表 ...: ...: Return: ...: None ...: """ ...: # ...: ...: if (n:= len(lst)) > 7: ...: print(f"len(lst) = {n} gt 7 , not supported .") ...: return ...: In [3]: dis.dis(fun) 1 0 RESUME 0 11 2 LOAD_GLOBAL 1 (NULL + len) 14 LOAD_FAST 0 (lst) 16 PRECALL 1 20 CALL 1 30 COPY 1 32 STORE_FAST 1 (n) 34 LOAD_CONST 1 (7) 36 COMPARE_OP 4 (>) 42 POP_JUMP_FORWARD_IF_FALSE 21 (to 86) 12 44 LOAD_GLOBAL 3 (NULL + print) 56 LOAD_CONST 2 ('len(lst) = ') 58 LOAD_FAST 1 (n) 60 FORMAT_VALUE 0 62 LOAD_CONST 3 (' gt 7 , not supported .') 64 BUILD_STRING 3 66 PRECALL 1 70 CALL 1 80 POP_TOP 13 82 LOAD_CONST 4 (None) 84 RETURN_VALUE 11 >> 86 LOAD_CONST 4 (None) 88 RETURN_VALUE In [4]: def fun(lst=None): ...: """ ...: Parameters: ...: lst: 列表 ...: ...: Return: ...: None ...: """ ...: # ...: n = len(lst) ...: if n > 7: ...: print(f"len(lst) = {n} gt 7 , not supported .") ...: return ...: In [5]: dis.dis(fun) 1 0 RESUME 0 10 2 LOAD_GLOBAL 1 (NULL + len) 14 LOAD_FAST 0 (lst) 16 PRECALL 1 20 CALL 1 30 STORE_FAST 1 (n) 11 32 LOAD_FAST 1 (n) 34 LOAD_CONST 1 (7) 36 COMPARE_OP 4 (>) 42 POP_JUMP_FORWARD_IF_FALSE 21 (to 86) 12 44 LOAD_GLOBAL 3 (NULL + print) 56 LOAD_CONST 2 ('len(lst) = ') 58 LOAD_FAST 1 (n) 60 FORMAT_VALUE 0 62 LOAD_CONST 3 (' gt 7 , not supported .') 64 BUILD_STRING 3 66 PRECALL 1 70 CALL 1 80 POP_TOP 13 82 LOAD_CONST 4 (None) 84 RETURN_VALUE 11 >> 86 LOAD_CONST 4 (None) 88 RETURN_VALUE

  可以看到阶段三和阶段二的字节码是一模一样的。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

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.

相关推荐
热点推荐
永暑岛长大了,1年建造280万平方米,南沙中心地位不可撼动

永暑岛长大了,1年建造280万平方米,南沙中心地位不可撼动

抽象派大师
2026-06-30 02:25:27
曼城官宣46岁新帅上任 签约3年 支付1700万赔偿金 仍遭切尔西炮轰

曼城官宣46岁新帅上任 签约3年 支付1700万赔偿金 仍遭切尔西炮轰

我爱英超
2026-06-29 21:21:17
历史上最巧合的十件事

历史上最巧合的十件事

落梨伴读
2026-06-29 20:00:23
WTT大满贯:冷门成灾!四位冠军出局,17岁黑马出世,曼昱处境不妙

WTT大满贯:冷门成灾!四位冠军出局,17岁黑马出世,曼昱处境不妙

童叔不飙车
2026-06-30 01:30:02
许晋亨与何超琼刚成婚不久,结伴逛夜市的珍贵老照片

许晋亨与何超琼刚成婚不久,结伴逛夜市的珍贵老照片

娱你同欢
2026-06-29 20:16:09
女老师穿“日系连衣裙”,家长们坐不住了:天气再热也不能这么穿

女老师穿“日系连衣裙”,家长们坐不住了:天气再热也不能这么穿

蝴蝶花雨话教育
2026-06-06 00:05:36
GPT-5.6发布,一大批AI公司要倒闭了

GPT-5.6发布,一大批AI公司要倒闭了

互联网早读课
2026-06-29 08:10:49
“网红”鞋子竟导致脚臭、真菌感染!已有多人中招!专家提醒——

“网红”鞋子竟导致脚臭、真菌感染!已有多人中招!专家提醒——

BRTV新闻
2026-06-29 23:36:33
三圣母被大佬当玩物,孕期注射药物仅冰山一角

三圣母被大佬当玩物,孕期注射药物仅冰山一角

丁羂解说
2026-06-27 21:41:15
出事了,白宫发表“灭国”言论后,以军开启斩首行动,另一国入局

出事了,白宫发表“灭国”言论后,以军开启斩首行动,另一国入局

涵豆说娱
2026-06-30 03:05:20
走个面、假慈善?被官方“点名”的韩红,如今用4000万让黑粉打脸

走个面、假慈善?被官方“点名”的韩红,如今用4000万让黑粉打脸

小椰的奶奶
2026-06-29 19:11:37
连续10场丢球,诺伊尔追平世界杯历史门将最长连续丢球纪录

连续10场丢球,诺伊尔追平世界杯历史门将最长连续丢球纪录

懂球帝
2026-06-30 05:29:06
美媒:美伊同意停止互袭 30日在多哈继续谈判

美媒:美伊同意停止互袭 30日在多哈继续谈判

新华社
2026-06-29 07:11:07
久保建英:我一直相信日本能扳平比分,但一切真的都结束了

久保建英:我一直相信日本能扳平比分,但一切真的都结束了

懂球帝
2026-06-30 05:18:27
涉刑资产,广州一辆宝马5系轿跑车拍卖,才2.7836万就成交

涉刑资产,广州一辆宝马5系轿跑车拍卖,才2.7836万就成交

苗苗情感说
2026-06-30 01:20:52
1天4个瓜!当街亲密、全网封禁,自曝怀双胎,赵丽颖最让人意外

1天4个瓜!当街亲密、全网封禁,自曝怀双胎,赵丽颖最让人意外

丁丁鲤史纪
2026-06-28 15:35:14
这几家A股公司,中报业绩超预期!

这几家A股公司,中报业绩超预期!

新浪财经
2026-06-29 21:32:29
警钟:月嫂、月子中心托管,正在悄悄毁掉孩子,让安全感缺失!

警钟:月嫂、月子中心托管,正在悄悄毁掉孩子,让安全感缺失!

小武侃风云
2026-06-28 07:47:51
央视曝光媒体特调机画面惊现“miui”代码,网友调侃改HyperOS多年了!

央视曝光媒体特调机画面惊现“miui”代码,网友调侃改HyperOS多年了!

大白聊IT
2026-06-29 17:53:07
世界杯验货!切尔西锁定 8600 万全能王牌!数据完爆阿根廷核心!

世界杯验货!切尔西锁定 8600 万全能王牌!数据完爆阿根廷核心!

澜归序
2026-06-29 07:40:20
2026-06-30 06:27:00
Python猫 incentive-icons
Python猫
人生苦短,我用Python。博客:https://pythoncat.top
732文章数 8120关注度
往期回顾 全部

科技要闻

杀疯了!深圳一天出两家200亿具身智能公司

头条要闻

巴西2-1逆转日本 卡塞米罗头槌马丁内利96分钟绝杀

头条要闻

巴西2-1逆转日本 卡塞米罗头槌马丁内利96分钟绝杀

体育要闻

他和伊朗队,再次赢得全世界的尊重

娱乐要闻

跟风电影《给阿公的牛肉丸》开机

财经要闻

万达广场批量易主 多位投资人正式入局

汽车要闻

全新宝马iX3长轴版将于成都车展预售 四季度交付

态度原创

房产
旅游
本地
数码
公开课

房产要闻

你敢想?海口房地产投资,暴跌5成!

旅游要闻

厌倦城市高楼就来凤龙湾,小火车搭配木屋村落,短途散心太治愈!

本地新闻

贵州小城的新目标:举办“村超”世界杯!

数码要闻

小米澎湃OS六月迎来功能更新 超级小爱新增赛事服务

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版