当前位置: 首页 > 编程日记 > 正文

Python 炫技操作:海象运算符的三种用法

作者 | 明哥

来源 |  Python编程时光(ID:Cool-Python)

Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上。

很多 Python 3.8 的特性还没来得及了解,就已经成为旧知识了,比如今天要说的海象运算符。

海象运算符是在 PEP 572 被提出的,直到 3.8 版本合入发布。

它的英文原名叫 Assignment Expressions,翻译过来也就是 赋值表达式,不过现在大家更普遍地称之为海象运算符,就是因为它长得真的太像海象了。

1. 第一个用法:if/else

可能有朋友是第一次接触这个新特性,所以还是简单的介绍一下这个海象运算符有什么用?

在 Golang 中的条件语句可以直接在 if 中运算变量的获取后直接对这个变量进行判断,可以让你少写一行代码

import "fmt"func main() {if age := 20;age > 18 {fmt.Println("已经成年了")}
}

若在 Python 3.8 之前,Python 必须得这样子写

age = 20
if age > 18:print("已经成年了")

但有了海象运算符之后,你可以和 Golang 一样(如果你没学过 Golang,那这里要注意,Golang 中的 := 叫短变量声明,意思是声明并初始化,它和 Python 中的 := 不是一个概念)

if (age:= 20) > 18:print("已经成年了")

2. 第二个用法:while

在不使用 海象运算符之前,使用 while 循环来读取文件的时候,你也许会这么写

file = open("demo.txt", "r")
while True:line = file.readline()if not line:breakprint(line.strip())

但有了海象运算符之后,你可以这样

file = open("demo.txt", "r")
while (line := file.readline()):print(line.strip())

使用它替换以往的无限 while 循环写法更为惊艳

比如,实现一个需要命令行交互输入密码并检验的代码,你也许会这样子写

while True:p = input("Enter the password: ")if p == "youpassword":break

有了海象运算符之后,这样子写更为舒服

while (p := input("Enter the password: ")) != "youpassword":continue

3. 第三个用法:推导式

这个系列的文章,几乎每篇都能看到推导式的身影,这一篇依旧如此。

在编码过程中,我很喜欢使用推导式,在简单的应用场景下,它简洁且不失高效。

如下这段代码中,我会使用列表推导式得出所有会员中过于肥胖的人的 bmi 指数

members = [{"name": "小五", "age": 23, "height": 1.75, "weight": 72},{"name": "小李", "age": 17, "height": 1.72, "weight": 63},{"name": "小陈", "age": 20, "height": 1.78, "weight": 82},
]count = 0def get_bmi(info):global countcount += 1print(f"执行了 {count} 次")height = info["height"]weight = info["weight"]return weight / (height**2)# 查出所有会员中过于肥胖的人的 bmi 指数
fat_bmis = [get_bmi(m) for m in members if get_bmi(m) > 24]print(fat_bmis)

输出如下

执行了 1 次
执行了 2 次
执行了 3 次
执行了 4 次
[25.88057063502083]

可以看到,会员数只有 3 个,但是 get_bmi 函数却执行了 4 次,原因是在判断时执行了 3 次,而在构造新的列表时又重复执行了一遍。

如果所有会员都是过于肥胖的,那最终将执行 6 次,这种在大量的数据下是比较浪费性能的,因此对于这种结构,我通常会使用传统的for 循环 + if 判断。

fat_bmis = []# 查出所有会员中过于肥胖的人的 bmi 指数
for m in members:bmi = get_bmi(m)if bmi > 24:fat_bmis.append(bmi)

在有了海象运算符之后,你就可以不用在这种场景下做出妥协。

# 查出所有会员中过于肥胖的人的 bmi 指数
fat_bmis = [bmi for m in members if (bmi := get_bmi(m)) > 24]

最终从输出结果可以看出,只执行了 3 次

执行了 1 次
执行了 2 次
执行了 3 次
[25.88057063502083]

这里仅介绍了列表推导式,但在字典推导式和集合推导式中同样适用。不再演示。

海象运算符,是一个新奇的特性,有不少人觉得这样这种特性会破坏代码的可读性。确实在一个新鲜事物刚出来时是会这样,但我相信经过时间的沉淀后,越来越多的人使用它并享受它带来的便利时,这种争议也会慢慢消失在历史的长河中。

Github:

https://github.com/iswbm/PythonCodingTime


推荐阅读

  • 大促下的智能运维挑战:阿里如何抗住“双11猫晚”?

  • 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!

  • 当莎士比亚遇见Google Flax:教你用字符级语言模型和归递神经网络写“莎士比亚”式句子

  • Hyperledger Fabric 和企业级以太坊,谁才是企业首选?

  • 面试时遇到「看门狗」脖子上挂着「时间轮」,我就问你怕不怕?

  • 同期两篇 Nature:运行温度高于 1K 的量子计算平台问世!

  • GitHub 标星 10,000+,Apache 顶级项目 ShardingSphere 的开源之路

  • 你点的每个“在看”,我都认真当成了AI

相关文章:

2010.10.30 OA 项目组一周工作报告

本周基本上实现了上周的目标,但和计划相比有落后。 进度:55 本周提交了3.0任务评估的第一个版本,一共为1003小时,客户收到该评估后,对3.0任务进行了调整,将部分任务移到2011.2版本中,同时添加了…

继承log4.net的类

using System; using System.Diagnostics;[assembly: log4net.Config.XmlConfigurator(Watch true)] namespace Hbl.Core {public static class Log{/// <summary>/// 一般错误/// </summary>/// <param name"message">消息</param>public …

调试JDK源码-Hashtable实现原理以及线程安全的原因

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 Hashtable是线程安全的&#xff0c;我们从源码来分析 代码很简单 Hashtable<String, …

源代码查看工具 Source Navigator 使用心得

在ubuntu 10.04下试用了Source Navigator&#xff0c;有条件还是装Source insight吧&#xff0c;不是一个级别的&#xff0c;非常不方便。 Source Navigator 是Red Hat出品的一款查看源代码的工具&#xff0c;非常好用&#xff0c;与Windows下的Source Insight有一敌。但是它的…

那个分分钟处理10亿节点图计算的Plato,现在怎么样了?

受访者 | 于东海记者 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;「AI 技术生态论」 人物访谈栏目是 CSDN 发起的百万人学 AI 倡议下的重要组成部分。通过对 AI 生态顶级大咖、创业者、行业 KOL 的访谈&#xff0c;反映其对于行业的思考、未来趋势的判断、技术的实践…

android TextView里边实现图文混配效果

做的游戏攻略中的图文载入已经用TextView实现。但看到网易新闻里的内容。点击图片能够调到一个新的Activity &#xff0c;感觉也像Textview 实现的&#xff0c;但不知道怎么弄&#xff0c;想想能够通过动态载入Textview和ImageView 布局实现&#xff0c;但当量大的时候回事很复…

《异步处理在分布式系统中的优化作用》学习笔记

原文地址&#xff1a;http://www.infoq.com/cn/presentations/optimization-of-asynchronous-processing-in-distributed-systems 视频地址&#xff1a;http://v.qq.com/boke/page/l/0/6/l0196plsvp6.html 主讲人&#xff1a;赵海平 Facebook hiphop HHVM 阿里巴巴技术保障部…

CISCO设备上DHCP实例

Cisco设备上设置DHCP实例 -------------------------------------------------------------------------------- 一位客户想把DHCP SERVER迁移到6509交换机的MSFC上,要求还挺复杂: 1.同时为多个VLAN的客户机分配地址 2.VLAN内有部分地址采用手工分配的…

360金融翟政:科技成就金融场景零容错

翟政&#xff0c;拥有超过20年的互联网经验&#xff0c;我国第三方支付第一批从业者&#xff0c;是多个知名第三方支付公司产品研发团队的组建者&#xff0c;核心系统的主设计师&#xff0c;管理层核心成员。设计搭建的支付系统过去这十年来一直在服务着各行各业的在线支付需求…

OSSIM平台安全事件关联分析实践

OSSIM平台安全事件关联分析实践在《开源安全运维平台OSSIM最佳实践》一书中叙述到&#xff0c;事件关联是整个OSSIM关联分析的核心&#xff0c;对于OSSIM的事件关联需要海量处理能力&#xff0c;主要便于现在需要及时存储从设备采集到的日志&#xff0c;并能关联匹配和输出&…

《Apache Kafka》学习笔记

1.什么是Kafka Kafka是一个高通过率的分布式消息系统 2.消息队列&#xff08;Message Queue)MQ的模型 消息队列的简单架构图 3个核心概念&#xff1a; Sender Application&#xff1a;消息队列的发送者&#xff0c;也叫生产者producer Message Queue Receiver Application…

4 月 24 日开播!基于神经网络建模的信息传播预测

信息传播在我们的日常生活中无处不在&#xff0c;例如谣言的扩散、产品的推广以及新思想和新技术的普及等等&#xff0c;其建模和预测已经在多个重要领域内得到了广泛的研究。近年来&#xff0c;很多研究者利用以循环神经网络为主的深度学习模型对信息传播过程进行建模&#xf…

并行计算圆周率

看到这个题目&#xff0c;俗了&#xff0c;大家都在计算圆周率。不过咱们的目的是看一下并行计算的基本流程。 书上计算PI用的是精确的数值计算方法&#xff0c;我这里再给出一种概率计算方法。 OpenMP和MPI将同时亮相。 计算PI的方法 1.tan(PI/4)1 > PI4arctan1。知…

kafka-manager 的编译和使用(附安装包)

2019独角兽企业重金招聘Python工程师标准>>> kafka-manager是一个非常好用的kafka web管理工具&#xff0c;yahoo开源。 地址&#xff1a;github.com/yahoo/kafka-manager 1、编译过程比较简单&#xff0c;重点是能翻墙&#xff0c;如果网络环境不允许&#xff0c;可…

匿名函数应用-多线程测试代码

多线程测试代码&#xff0c;不用单独再写一个类&#xff0c;比较方面而已。 public class MainThread { static int a0; for (int x 0;x<100;x){ Thread t new Thread(new Runnable() { Override public void run() { while(true){ try { a;System.out.println(a);…

YOLOv4来了,大型调优现场,速度和准确率俱佳

作者 | VincentLee来源 | 晓飞的算法工程笔记简介论文提出YOLOv4&#xff0c;从图1的结果来看&#xff0c;相对于YOLOv3在准确率上提升了近10个点&#xff0c;然而速度并几乎没有下降&#xff0c;论文主要贡献如下&#xff1a;提出速度更快、精度更好的检测模型&#xff0c;仅需…

关于对J2EE几点误解和错误认识的澄清

转自&#xff1a;http://www.jdon.com .Net和J2EE的争论一直没有停止&#xff0c;我也参加过“程序员”杂志主持的“.Net和Java之争”之类的讨论&#xff0c;本来这两种技术都是为用户提供了竞争性的选择&#xff0c;对于用户来说是一件好事&#xff0c;多种选择远胜于单一选择…

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r...

2019独角兽企业重金招聘Python工程师标准>>> Struts Problem Report Struts has detected an unhandled exception: Messages: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or re…

Java的Redis连接池代码性能不错

其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183&#xff0c;有2个版本&#xff0c;差别就是ReentrantLock和synchronized。另外原作者使用了断言&#xff0c;我觉得这个还是不用为好。 ReentrantLock版 import java.util.concurrent.locks.Reent…

降低预测过程计算成本,这些NLP模型压缩方法要知道

编译 | 凯隐出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近年来&#xff0c;基于谷歌Transformer的语言模型在神经机器翻译&#xff0c;自然语言推理和其他自然语言理解任务上取得了长足进展。通过多种语言模型的平均损失进行自我监督预训练&#xff0c;使得在大范…

政府要尽快对应用商店出台管理办法

前两天联想的开发者大会&#xff0c;我和联想的CTO贺志强先生联合接受了一个视频访谈&#xff0c;贺先生谈到联想的乐园软件商店&#xff0c;组织大量的人力对于软件进行检测&#xff0c;以保证软件是合格产品&#xff0c;不会给用户一路带来侵害&#xff0c;对于联想这种负责态…

antlr-2.7.6.jar的作用

项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误

junit集成Hamcrest测试集合中某个属性是否包含特定值

junit已经集成Hamcrest但是还是需要引用hamcrest-library&#xff0c;不然只有基本方法&#xff0c;高级的没有 <dependency> <groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

腾讯第100个开源项目:微信开源推理加速工具TurboTransformers

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;4月24日&#xff0c;腾讯正式宣布开源Transformer推理加速工具TurboTransformers。该工具面向自然语言处理领域中Transformers相关模型丰富的线上预测场景&#xff0c;在微信、腾讯云、QQ看点等产品的线上服务中已经广…

程序员:提高编程效率的技巧

本文写给那些认为在项目上所花时间和效率成正比的程序员。我要说的是&#xff0c;事实并非如此。虽然你需要在电脑前敲键盘输入东西&#xff0c;但这只和编程沾上一点边。那么&#xff0c;程序员该如何利用时间呢&#xff1f; 俗话说&#xff0c;磨刀不误砍柴工&#xff0c;拿出…

Qunee for HTML5 V2.5新版本发布

为什么80%的码农都做不了架构师&#xff1f;>>> Qunee for HTMl5 V2.5 beta2版本正式发布,此次版本内核改动较大,采用了新的2D渲染引擎,增加了延迟绘制功能,大幅改善画布的浏览体验,此外重构了鼠标键盘以及触控交互监听处理,增加右键框选功能,改善了多点触控交互,增…

泛型推断类型不符合上限

程序报错推断类型不符合上限 springsecurity需要自定义用户服务 代码 Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(new CustomUserDetailsService());}public class CustomUserDetailsService implemen…

如何通过深度学习,完成计算机视觉中的所有工作?

Mask-RCNN做对象检测和实例分割作者 | George Seif译者 | 天道酬勤&#xff0c;责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;Mask-RCNN做对象检测和实例分割&#xff1a;https://miro.medium.com/max/1200/1*s9raSe9mLeSSuxE3API-ZA.gif你想做计算机视…

Windows PowerShell 2.0语言之字面类型系统

PowerShell语言允许通过一个字面类型&#xff08;type Literals&#xff09;来访问类型&#xff0c;它是用括号抬起的类型名&#xff0c;返回.NET底层的System.Type对象实例&#xff0c;如&#xff1a; PS C:\> [System.Int32]IsPublic IsSerial Name …

建立名称server

一、实验的目的&#xff1a;实现DNSserver功能&#xff0c;提供正向、反向解析二、实验环境装有Linux的Windows系统IP为192.168.6.3的虚拟机三、实验目的建立gr.org域的主名称server。解析&#xff1a;名称 IP 用途ns.gr.org 192.168.…