「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期 ...
随机推荐
- [ vue ] 自定义组件的 v-model 理解
需求场景描述: 1. 在父组件 myself.vue 里面定义数据 button_val 2. 在父组件 myself.vue.里面定义按钮,它的功能是吧 button_val 的值 -1 ---- ...
- CentOS7 安装mysql并解决安装慢的问题
0.centOS7 mini版安装及网络配置 //可从我的网盘保存下载,可用虚拟机安装 链接:https://pan.baidu.com/s/10_AHxN0DtJ75s1oFOaaZ3A 密码:ud ...
- LINUX学习-PHP安装
一.安装环境 操作系统CentOS6.8 关闭SeLinux和iptables防火墙 二.网络yum源 将下面的软件下载到 /etc/yum.repos.d/ 的目录下 官方基础:http:// ...
- Git创建分支进行开发
一.业务场景 自己当前开发的项目算是一个中型项目,整个项目都是由自己一个人开发完成,主要有两个子项目,一个是小程序的后台,一个是小程序的后台管理系统. 因为从一开始就只有我一个人在进行开发,所以自己平 ...
- python+selenium 元素定位--iframe
1. 一般webdriver要操作页面元素需要在Top Window的状态下,如下: 2.当浏览器显示iframe时,用正常的元素定位是没有效果的,需要将页面装换到iframe下再对页面元素进行操作 ...
- windows server 服务器安装jenkins 并通过git拉取代码实现自动发布到IIS
Jenkins是一个开源软件,可以通过一定的配置进行自动构建,测试,部署等功能. 首先,服务器应安装好 .NET Core环境和JDK, 下载Jenkins安装包 https://www.jenkin ...
- 匿名函数托管 func-spring-boot-starter
匿名函数托管 func-spring-boot-starter 项目地址 func-spring-boot-starter开源项目地址: https://gitee.com/yiur/func-spr ...
- 【Android】安卓四大组件之Activity(二)
[Android]安卓四大组件之Activity(二) 前言 在这篇文章之前,我已经写过了一篇有关Activity的内容,是关于activity之间的页面跳转和数据传递,而这篇文章着重强调的是Acti ...
- 【C++】指针和函数
指针和函数 标签:c++ 目录 指针和函数 一.基本概念 定义: 指针的定义及使用: 二.指针的相互赋值 三.指针的运算 比较大小: 相减: 加减整数类型变量或者常量: 自增自减: 下标运算符[ ]: ...
- 1.IO流
1.组成部分 File.FileInputStream.FileOutStream.FileWriter.FileReader 2.File pathSeparatorChar ; separator ...