如何在Python中用好短路机制

目录
  • 1.X or Y
  • 2.X and Y
  • 3.any()
  • 4.all()
    • 4.1「比较运算符」
    • 4.2「实际使用示例」

不同于物理学中的「短路」(Short circuit)那般危险,Python中的短路机制非常有用,跟很多其他编程语言中的短路机制作用类似,一句话概括就是一段条件判断表达式在从左到右按顺序执行的过程中,提前确定了表达式的True/False结果,从而终止右边剩余的运算。

让我们通过几个简单的例子总结Python中可用的几种短路机制:

1.X or Y

X or Y是最常用的短路机制,我们都知道只要X或Y中至少有一个为True时,整段判断表达式就为True,譬如下面的例子中,本来1 / 0会触发ZeroDivisionError: division by zero错误,但因为or左边的部分已经逻辑判断为True,Python的短路机制就会停止后续的执行,直接返回or左边的结果:

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

2.X and Y

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

3.any()

Python中的any()函数用于接受序列形式的多个等待逻辑判断的部分,并在序列中至少有一个部分逻辑判断为True时返回True。

而只要any()按顺序遇到第一个逻辑判断为True的结果,也会触发短路,正如下面的例子中只花费3秒就完成了判断过程,因为循环到1时触发了短路:

4.all()

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

4.1「比较运算符」

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

4.2「实际使用示例」

当我们的代码中涉及到条件判断,且参与条件判断的值具有一定的「运算成本」时,就可以灵活运用短路机制来提升运行效率,譬如我们需要根据用户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中用好短路机制的文章就介绍到这了,更多相关Python中妙用短路机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现最短路径问题的方法

    目录 一.创建图 二.问题来源 三.Dijkstra算法 四.Floyd算法 五.代码测试 一.创建图 在开始之前,我们先创建一个图,使用邻接矩阵表示有向网: class Graph(object): """ 以邻接矩阵为存储结构创建有向网 """ def __init__(self, kind): # 图的类型: 无向图, 有向图, 无向网, 有向网 # kind: Undigraph, Digraph, Undinetwork, Dinetw

  • python3实现无权最短路径的方法

    问题描述 现有一个有向无权图.如下图所示: 问题:使用某个顶点s作为输入参数,找出从s到所有其他顶点的最短路径. 说明:因为是无权图,因此我们可以为每台边赋值为1.这里选择v3为s作为起点. 问题分析 此时立刻可以说,从s到v3的最短路径是长为0的路径,标记此信息,得到下图. 现在开始寻找从s出发距离为1的顶点.这些顶点肯定是与s邻接的顶点,很明显,v1,v6从s出发只需要一条边就到了.所以,从s出发距离为1的顶点,为v1,v6. 现在开始寻找从s出发距离为2的顶点.这些顶点肯定是与v1,v6(

  • python实现最短路径的实例方法

    最短路径问题(python实现) 解决最短路径问题:(如下三种算法) (1)迪杰斯特拉算法(Dijkstra算法) (2)弗洛伊德算法(Floyd算法) (3)SPFA算法 第一种算法: Dijkstra算法 广度优先搜索解决赋权有向图或者无向图的单源最短路径问题.是一种贪心的策略 算法的思路 声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点s的路径权重被赋为0(dis[s]=0).若对于顶点s存在能直接到达的边(s,m),则把dis[m

  • 如何在Python中用好短路机制

    目录 1.X or Y 2.X and Y 3.any() 4.all() 4.1「比较运算符」 4.2「实际使用示例」 不同于物理学中的「短路」(Short circuit)那般危险,Python中的短路机制非常有用,跟很多其他编程语言中的短路机制作用类似,一句话概括就是一段条件判断表达式在从左到右按顺序执行的过程中,提前确定了表达式的True/False结果,从而终止右边剩余的运算. 让我们通过几个简单的例子总结Python中可用的几种短路机制: 1.X or Y X or Y是最常用的短路

  • 如何在python中用os模块实现批量移动文件

    本文介绍一下利用python批量把一个文件夹(及其子文件夹)下面的特定类型的文件移动到另一个文件夹下 通过python操作系统目录及其文件,需要用到os包,本次具体用到如下方法 os.walk(), 这个方法可以遍历一个文件夹及其子文件(子子文件夹等) os.rename(),这个方法用于命名文件或目录(因为是操作一个文件的绝对路径,所以其实相当于对文件进行剪切操作) 另外也可以借助 shutil库对文件进行移动或复制操作 下面是示例代码 def run_main(source_dir, tar

  • 在Python中用GDAL实现矢量对栅格的切割实例

    概述: 本文讲述如何在Python中用GDAL实现根据输入矢量边界对栅格数据的裁剪. 效果: 裁剪前 矢量边界 裁剪后 实现代码: # -*- coding: utf-8 -*- """ @author lzugis @date 2017-06-02 @brief 利用shp裁剪影像 """ from osgeo import gdal, gdalnumeric, ogr from PIL import Image, ImageDraw impo

  • 浅谈Python中用datetime包进行对时间的一些操作

    1. 计算给出两个时间之间的时间差 import datetime as dt # current time cur_time = dt.datetime.today() # one day pre_time = dt.date(2016, 5, 20) # eg: 2016.5.20 delta = cur_time - pre_time # if you want to get discrepancy in days print delta.days # if you want to get

  • python模拟事件触发机制详解

    本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下 EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading import * class EventManager: def __init__(self): """初始化事件管理器""" # 事件对象列表 self.__eventQu

  • 解决python中用matplotlib画多幅图时出现图形部分重叠的问题

    1.解决方法:使用函数 tight_layout() 2.具体使用方法 import matplotlib.pyplot as plt fig = plt.figure() ''' 具体的画图程序 ''' fig.tight_layout() fig.tight_layout() 功能:使得子图横纵坐标更加紧凑,主要用于自动调整图区的大小以及间距,使所有的绘图及其标题.坐标轴标签等都可以不重叠的完整显示在画布上. 参数: Pad:用于设置绘图区边缘与画布边缘的距离大小 w_pad:用于设置绘图区

  • 简单了解python的内存管理机制

    Python引入了一个机制:引用计数. 引用计数 python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收. 总结一下对象会在一下情况下引用计数加1: 1.对象被创建:x=4 2.另外的别人被创建:y=x 3.被作为参数传递给函数:foo(x) 4.作为容器对象的一个元素:a=[1,x,'33'] 引用计数减少情况 1.一个本地引用离开了它的作用域.比如上

  • 在python中用print()输出多个格式化参数的方法

    不废话,直接贴代码: disroot = math.sqrt(deta) root1 = (-b + disroot)/(2*a) root2 = (-b - disroot)/(2*a) print("有两个不同的解: %.2f,%.2f"%root1,%root2) 这是最初写的print()代码,不过运行时总提示TypeError 后来上网查了好多资料,发现格式根本不是这样子的,是我想当然了 disroot = math.sqrt(deta) root1 = (-b + disr

  • 在python中用url_for构造URL的方法

    用url_for构造URL,他接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数,未知的变量部分会添加到URL末尾作为查询参数. 构建URL而不选择直接在代码中拼URL的原因有两点: 1)在未来有更改的时候只需要一次性修改URL,而不用到处替换: 2)URL构建会转义特殊字符和Unicode数据, 这些工作不需要我们自己处理. 下面是个例子: from flask import Flask,url_for app = Flask(__name__) @app.route('/ex

  • python中用logging实现日志滚动和过期日志删除功能

    logging库提供了两个可以用于日志滚动的class(可以参考https://docs.python.org/2/library/logging.handlers.html),一个是RotatingFileHandler,它主要是根据日志文件的大小进行滚动,另一个是TimeRotatingFileHandler,它主要是根据时间进行滚动.在实际应用中,我们通常根据时间进行滚动,因此,本文中主要介绍TimeRotaingFileHandler的使用方法(RotatingFileHandler一样

随机推荐