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
python-3.8.0 新特性之赋值表达式的更多相关文章
- C# 7.0 新特性2: 本地方法
本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- C#发展历程以及C#6.0新特性
一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...
- c# 6.0新特性(二)
写在前面 上篇文章介绍了c#6.0的using static,Auto Property Initializers,Index Initializers新的特性,这篇文章将把剩下的几个学习一下. 原文 ...
- c# 6.0新特性(一)
写在前面 接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性.在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习.废话不多说,直奔主题. 原文 ...
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
- Django 2.0 新特性 抢先看!
一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...
- C#6.0,C#7.0新特性
C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto-Property Initia ...
- 【c#】6.0与7.0新特性介绍记录
c#发展史 引用地址:https://www.cnblogs.com/ShaYeBlog/p/3661424.html 6.0新特性 1.字符串拼接优化 语法格式:$”string {参数}” 解释: ...
随机推荐
- avd manger创建的虚拟机启动不起来,或者启动起来后黑屏
最近鼓捣安卓虚拟机,整的都差点重装系统,刚开始下载了genymotion_vbox,装完以后要在vbox中导入一个虚拟机,结果我导入完,虚拟机怎么也启动不了,然后各种找办法无果,最后重启电脑发现电脑也 ...
- nmcli详解
1. nmcli 安装 [root@liujunjun ~]# yum install -y NetworkManager CentOS7默认已安装了 2. nmcli 基本选项 选项 作用 -t 简 ...
- Spring Cloud Alibaba 实战(十二) - Nacos配置管理
本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理 ...
- IDEA 护眼色设置
首先做一些简单的记录,护眼色 等等的设置很久以前机器上已经设置过了,今天偶尔要在其他机器上重新做一些设置反而忘记了很多步骤, 设置后的HTML页面如下图所示: 默认情况下,当只是设置General通用 ...
- [CrackMe]160个CrackMe之015
吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.破解 该破解比较简单,其是一个静态密码 2G83G35Hs2 ,输入进去即可破解. 1)栈定位法找到用户代码 ...
- Response to 16岁的篮球投手
关于篮球,我想写的很多,被偏爱的运动,被赞美的运动,带着青春的万丈光泽. 我们对易建联的苛刻是因为想当然,对大侄子的溺爱是因为急功近利.过于娱乐化和商业化,让一项竞技体育变得像是豆瓣八组的吃瓜盛宴. ...
- Linux iotop工具简介
iotop的简介: iotop是一款开源.免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息.它是Python语言编写的,与iostat工具比较,iostat是 ...
- WePy框架的使用
基本示例 import wepy from 'wepy';//引入wepy框架说明 // 通过继承自wepy.page的类创建页面逻辑 export default class Index exten ...
- HTML Rendering Error
刚下载的markdown弹窗提示html渲染错误 去官网 http://markdownpad.com/faq.html#livepreview-directx 页面搜索 This view h ...
- SSH的本地、远程、动态端口转发实验笔记
SSH端口转发 SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务.这一 ...