python-3.8.0 新特性之赋值表达式
【python-3.8.0 新特性之赋值表达式】
赋值表达式的语法是这样的“ name := expression ”,形式上看和赋值语句 “ = ” 差不多,就作用上来看也雷同。也就是说 “:=” 不是必不可少的,它只是一个锦上添花的新语法。
【1、例子】
假设我们要对列表中的元素个数进行判断,当其大于 3 个的时候打印出提示信息,用老的语法我们可以这样写。
#!/usr/bin/env python3 if __name__ == "__main__": ls = [1,2,3,4,5] if len(ls) > 3: # 第一次计算 len(ls) print(f"ls is too long ({len(ls)} elements,expected < 3)") # 第二次计算 len(ls)
可以看到在上面的代码中我们重复的计算了 len(ls) ,虽然 python 内部对于 len(ls) 会有一些优化操作,但是我们并不想重复自己,要优化办法也是有的把 len(ls) 前置一下就行。
#!/usr/bin/env python3 if __name__ == "__main__": ls = [1,2,3,4,5] n = len(ls) # 第一次计算 len(ls) if n > 3: print(f"ls is too long ({n} elements,expected < 3)") # 直接使用变量 n ,省去了一次计算过程
【2、用新特性重写】
感觉说什么都是在注水,直接上代码
#!/usr/bin/env python3 if __name__ == "__main__": ls = [1,2,3,4,5] if (n:=len(ls)) > 3: # 只要计算一次 print(f"ls is too long ({n} elements,expected < 3)") # 直接使用赋值表达式中的 n 同样也省去了一次计算
【3、两种写法的比较】
优劣分析
# 写法 一 #!/usr/bin/env python3 if __name__ == "__main__": ls = [1,2,3,4,5] n = len(ls) if n > 3: print(f"ls is too long ({n} elements,expected < 3)") # 写法 二 #!/usr/bin/env python3 if __name__ == "__main__": ls = [1,2,3,4,5] if (n:=len(ls)) > 3: print(f"ls is too long ({n} elements,expected < 3)")
python 这门语言最好的一个地方就在于它的一致性,不管是专家还是初生牛犊,只要一看到他人的代码大致就可以猜到他接下来想做什么,久而久之同一类型的问题就有了最 pythonic 的写法了。
第一种写法当我们看到 “n = len(ls)” 时即不能回答作者想要用 n 来做什么?也不能回答“后面的代码一定会用到 n 吗?”这样的问题,要解答这些问题都要要求我们往下看代码。
第二种写法当我们看到 “if (n:=len(ls)) > 3:” 一来我们直接可以看出这个 if 依赖于 n 的值,二来后面的代码也非常有可能会用到 n ,如果不用的话直接写成 “if len(ls) > 3:” 不就行了吗?
总结:把正确的属性用在正确的地方是可以提高代码可读性的。
【4、:= 与 = 的关系】
看官方的意思 “:=” 是作为 “=” 的一个补充而存在的,并不是想用 “:=” 替换掉 “=”,下面看一下它两是互补的一个例子
#!/usr/bin/env python3 if __name__ == "__main__": x = 5 print(f"x = {x}") y := 5 # SyntaxError: invalid syntax print(f"y = {y}") #这样的写法是会报语法错误的,我觉得这里体现了官方的两个重要的思想 # 1、可以用 "=" 解决的事就不要用 ":=" 防止引起混乱 # 2、对于一个给定的问题最 pythonic 的写法通常只有一种 (z := 5) print(f"z = {z}")
【5、新写法带来的最佳实践】
# 一 简化 os.fork if pid := os.fork(): # Parent code else: # Child code # 二 直接到把 socket 对象的 read buffer 读完为止 while data := sock.recv(8192): print("Received data:", data)
【转自】
https://www.sqlpy.com/blogs/books/2/chapters/10/articles/51
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2018-07-13 python3 元类编程的一个例子