「Python实用秘技05」在Python中妙用短路机制
本文完整示例代码及文件已上传至我的
Github仓库https://github.com/CNFeffery/PythonPracticalSkills
这是我的系列文章「Python实用秘技」的第5期,本系列立足于笔者日常工作中使用Python积累的心得体会,每一期为大家带来一个几分钟内就可学会的简单小技巧。
作为系列第5期,我们即将学习的是:Python中短路机制的妙用。

不同于物理学中的短路(Short circuit)那般危险,Python中的短路机制非常有用,跟很多其他编程语言中的短路机制作用类似,一句话概括就是一段条件判断表达式在从左到右按顺序执行的过程中,提前确定了表达式的True/False结果,从而终止右边剩余的运算。
让我们通过几个简单的例子总结Python中可用的几种短路机制:
- X or Y
X or Y是最常用的短路机制,我们都知道只要X或Y中至少有一个为True时,整段判断表达式就为True,譬如下面的例子中,本来1 / 0会触发ZeroDivisionError: division by zero错误,但因为or左边的部分已经逻辑判断为True,Python的短路机制就会停止后续的执行,直接返回or左边的结果:

而当or左边部分逻辑判断为False时,则会返回右边部分的结果:

- X and Y
类似X or Y的机制,X and Y会在X逻辑判断为False时提前终止后续的运算,只返回X部分的结果:

- **any()**
Python中的any()函数用于接受序列形式的多个等待逻辑判断的部分,并在序列中至少有一个部分逻辑判断为True时返回True。
而只要any()按顺序遇到第一个逻辑判断为True的结果,也会触发短路,正如下面的例子中只花费3秒就完成了判断过程,因为循环到1时触发了短路:

- all()
Python中的all()函数类似any(),会在传入序列中每个部分逻辑判断均为True时返回True,其也会在按顺序遇到第一个False时终止后续运算:

- 比较运算符
Python中用于数值大小比较的各个运算符也具有短路机制,从左到右,一旦执行到判断结果为False的部分都会终止运算:

- 实际使用示例
当我们的代码中涉及到条件判断,且参与条件判断的值具有一定的运算成本时,就可以灵活运用短路机制来提升运行效率,譬如我们需要根据用户id信息向多个接口查询其权限,全部满足时将其标记为“超级权限”,就可以利用到短路机制。
这里我们随意写几个具有时间成本的函数作为接口示意:
def api1(id_):
time.sleep(1)
return id_ in ['admin1', 'admin2']
def api2(id_):
time.sleep(1)
return id_ in ['admin1', 'admin2', 'su1', 'su2']
def api3(id_):
time.sleep(1)
return id_ not in ['ban1', 'ban2', 'ban3']
利用短路机制在用户第一次没有满足条件时就终止后续判断,写法简洁:

本期分享结束,咱们下回见~
「Python实用秘技05」在Python中妙用短路机制的更多相关文章
- 「Python实用秘技02」给Python函数定“闹钟”
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第2期 ...
- 「Python实用秘技11」在Python中利用ItsDangerous快捷实现数据加密
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第11 ...
- 「Python实用秘技01」复杂zip文件的解压
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...
- 「Python实用秘技03」导出项目的极简环境依赖
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第3期 ...
- 「Python实用秘技04」为pdf文件批量添加文字水印
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...
- 「Python实用秘技06」逐行监听Python程序的内存消耗
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第6期 ...
- 「Python实用秘技07」pandas中鲜为人知的隐藏排序技巧
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第7期 ...
- 「Python实用秘技08」一行代码解析地址信息
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第8期 ...
- 「Python实用秘技09」更好用的函数运算缓存
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第9期 ...
随机推荐
- yum方式安装nginx
1.添加CentOS 7 Nginx yum资源库 [root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPM ...
- 细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
1.前言 匿名内部类是什么东西? 没有名字的内部类就是匿名内部类. 什么场景使用? 匿名内部类适合创建那种只需要一次使用的类. 这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的 ...
- Centos安装DenyHosts
一.背景 个人申请的腾讯云主机被扫描端口,数百次登录失败的尝试 解决方法:安装工具,记录并屏蔽恶意访问. 二.检查环境 系统安装的sshd是否支持tcp_wrappers(默认都支持) ldd /us ...
- doT.js模板用法
前提:引入doT.min.js: <script type="text/javascript" src="js/jquery.js"></sc ...
- 帮你克服web字体选择焦虑症
1.背景 前端时间产品经理问我,移动端web默认字体有哪些,哪些字体不侵权?我当时感觉这方面的知识很匮乏,只能回答出微软雅黑和苹方简体,平常写代码时,没怎么留意过font-family设置的字体属性, ...
- 记一次简单的Oracle离线数据迁移至TiDB过程
背景 最近在支持一个从Oracle转TiDB的项目,为方便应用端兼容性测试需要把Oracle测试环境的库表结构和数据同步到TiDB中,由于数据量并不大,所以怎么方便怎么来,这里使用CSV导出导入的方式 ...
- 安卓无法访问Azure服务器和微软API
Azure服务器保护机制限制移动端访问 必须使用移动app服务来转接api,才可以访问.
- golang中为何在同一个goroutine中使用无缓冲通道会导致死锁
package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := ...
- gin中在中间件或handler中使用goroutine
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "tim ...
- Ansible + shell 实现部署fastdfs+nginx 实现图片服务器并提供动态缩放功能;
因为公司阿里服务器变动几次,手动部署了好几次fastdfs+nginx,于是就想到了自动化部署,以下为脚本内容,由于只是想把着功能实现,并未有完完整的判断逻辑: 以下为ansible-playbook ...