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

python-3.8.0 新特性之赋值表达式的更多相关文章

  1. C# 7.0 新特性2: 本地方法

    本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  2. C# 7.0 新特性4: 返回引用

    本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  3. C#发展历程以及C#6.0新特性

    一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...

  4. c# 6.0新特性(二)

    写在前面 上篇文章介绍了c#6.0的using static,Auto Property Initializers,Index Initializers新的特性,这篇文章将把剩下的几个学习一下. 原文 ...

  5. c# 6.0新特性(一)

    写在前面 接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性.在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习.废话不多说,直奔主题. 原文 ...

  6. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

  7. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

  8. C#6.0,C#7.0新特性

    C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto-Property Initia ...

  9. 【c#】6.0与7.0新特性介绍记录

    c#发展史 引用地址:https://www.cnblogs.com/ShaYeBlog/p/3661424.html 6.0新特性 1.字符串拼接优化 语法格式:$”string {参数}” 解释: ...

随机推荐

  1. 使用navicat连接只开放内网ip连接的数据库

    无法通过Navicat来连接MySQL,比较常见的两种问题? 服务器上自己安装的MySQL数据库,且未开通外网登录账号 直接购买服务商的MySQL数据库不创建公网访问,只有内网访问   背景: 公司数 ...

  2. nlp英文的数据清洗代码

    1.常用的清洗方式 #coding=utf-8 import jieba import unicodedata import sys,re,collections,nltk from nltk.ste ...

  3. python-paramiko对远程服务器终端的操作

    1.with open写文件到本地 2.paramiko SFTPClient将文件推到salt服务端 3.paramiko SSHClient通过salt-cp将文件分发给目标服务器 1. with ...

  4. IT兄弟连 HTML5教程 HTML5表单 新增的表单属性1

    HTML5 Input表单为<form>和<input>标签添加了几个新属性,属性如表1. 1  autocomplete属性 autocomplete属性规定form或inp ...

  5. php中对于file的相关语句

    // 打开文件 fopen(); // 打开文件的方式 r 只读,r+ 读写方式打开 w 以写入的方式打开 w+ 以读写方式打开(以覆盖的形式写入) // a以写入的方式打开,文件不存在则创建 x创建 ...

  6. Tomcat9+JDK 13报错Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program

    Tomcat使用的是https://tomcat.apache.org/download-90.cgi Tomcat9 之前安装的JDK 13,有JAVA_HOME环境变量地址(C:\Program ...

  7. 使用PrintWriter完成写操作 ,实现简易记事本工具

    package seday07; import java.io.BufferedWriter;import java.io.FileOutputStream;import java.io.IOExce ...

  8. Add an Item to the Navigation Control 将项目添加到导航控件

    In this lesson, you will learn how to add an item to the navigation control. For this purpose, the N ...

  9. SpringCloud(五):断路器(Hystrix)和hystrixdashboard图实现链路追踪

    第一:关于服务调用和熔断安全: ribbon和Feign: 1. 相当于nigx+doubbe,微服务间的服务调用,API网关的请求转发等内容2. Feign整合了Ribbon和Hystrix  Hy ...

  10. CSS学习笔记-边框图片等属性

      1.边框图片:        1.1含义:            告诉浏览器指定一张图片作为边框        1.2格式:             border-image-source:url ...