Python小技巧!如何简化大量的 if…elif…else 代码?

Python小技巧。如何简化大量的 if…elif…else 代码? 今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if...elif...else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。 正好今天是双十一,假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if ... elif...写法是这样的: defget_discount(level): iflevel==1: "大量计算代码" discount=0.1 elif... 阅读详情
AI摘要

本文介绍了一种在EdgeDB项目中使用的value_dispatch装饰器,用于简化大量if-elif判断,提供了一种更直观和简洁的代码风格,通过实例展示了其功能和如何实现复杂逻辑判断的潜力。

5b0d1b9923c58353a1f66607087c5b62.png

花下猫语:在日常代码中,我们总是会面对大量 if...elif...else 条件分支选择的问题。说实话,我在多数情况下首推就是老老实实地写 if...elif,并且设法把每个分支下的内容抽取成独立的函数。结构清晰,意图明白,对于编写和阅读都是极大的便利。不过,在某些特殊的情况下,还可以使用其它更为优雅的写法,比如我们之前分享过的《不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?》,以及今天要分享的这篇文章,可以开阔一下代码编写思路。

今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if...elif...else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。

正好今天是双十一,假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if ... elif...写法是这样的:

def get_discount(level):
    if level == 1:
        "大量计算代码"
        discount = 0.1
    elif level == 2:
        "大量计算代码"
        discount = 0.2
    elif level == 3:
        discount = 0.3
    elif level == 4:
        discount = 0.4
    elif level == 5:
        discount = 0.5
    elif level == 6:
        discount = 3 + 2 - 5 * 0.1
    else:
         return '等级错误'
    return discount

大家都知道,这样大量的if ... elif...代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。

有一些同学知道,可以使用字典来改写这个太长的 if 判断:

def parse_level_1():
    "大量计算代码"
    discount = 0.1
    return discount

def parse_level_2():
    "大量计算代码"
    discount = 0.2
    return discount

def parse_level_3():
    "大量计算代码"
    discount = 0.3
    return discount

def parse_level_4():
    "大量计算代码"
    discount = 0.4
    return discount

def parse_level_5():
    "大量计算代码"
    discount = 0.5
    return discount

def parse_level_6():
    "大量计算代码"
    discount = 3 + 2 - 5 * 0.1
    return discount

discount_map = {
 1: parse_level_1,
  2: parse_level_2,
  3: parse_level_3,
  4: parse_level_4,
  5: parse_level_5,
  6: parse_level_6,
}

discount = discount_map.get(level, '等级错误')

但今天我学到的这个方法,比用字典更简单。我们先来看它的效果:

@value_dispatch
def get_discount(level):
    return '等级错误'

@get_discount.register(1)
def parse_level_1(level):
    "大量计算代码"
    discount = 0.1
    return discount

@get_discount.register(2)
def parse_level_2(level):
    "大量计算代码"
    discount = 0.2
    return discount

@get_discount.register(3)
def parse_level_3(level):
    "大量计算代码"
    discount = 0.3
    return discount

@get_discount.register(4)
def parse_level_4(level):
    "大量计算代码"
    discount = 0.4
    return discount

@get_discount.register(5)
def parse_level_5(level):
    "大量计算代码"
    discount = 0.5
    return discount

@get_discount.register(6)
def parse_level_1(level):
    "大量计算代码"
    discount = 3 + 2 - 5 * 0.1
    return discount


discount = get_discount(3)
print(f'等级3的用户,获得的折扣是:{discount}')

运行效果如下图所示:

f67b435276e480942e374d336d6b21f5.png

这样写,比用字典的方式更直观,比直接用if ... elif...更简洁。

那么,这个装饰器value_dispatch是怎么实现的呢?密码就藏在这个开源项目EdgeDB的源代码[2]中,核心代码只有20多行:

7904261c2c59a1aa04171bc972c43f6c.png

并且,还能够实现或查询。例如用户等级为2或者3的时候,折扣都是0.2,那么代码可以写成:

@get_discount.register(2)
@get_discount.register(3)
def parse_level_2(level):
    "大量计算代码"
    discount = 0.2
    return discount

运行效果如下图所示:

de4446f561684b2497e36ae930f76182.png

它这个代码目前只能实现相等的查询。但其实只要对这个代码稍作修改,我们就能实现大于、小于、大于等于、小于等于、不等于、in等等判断。如果大家有兴趣的话,请在文章下面留言,我们明天就来说说怎么对这个代码进行改造,实现更多的逻辑判断。

参考文献

[1] EdgeDB: https://github.com/edgedb/edgedb

[2] 源代码: https://github.com/edgedb/edgedb/blob/master/edb/common/value_dispatch.py

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看200个Python案例!

Python小技巧,如何简化大量的 if…elif…else 代码? 在日常代码中,我们总是会面对大量 if...elif...else 条件分支选择的问题。说实话,我在多数情况下首推就是老老实实地写 if...elif,并且设法把每个分支下的内容抽取成独立的函数。结构清晰,意图明白,对于编写和阅读都是极大的便利。不过,在某些特殊的情况下,还可以使用其它更为优雅的写法,可以开阔一下代码编写思路。 今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if...elif...else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。 正 阅读详情

相关推荐

python如果减少if else的使用会怎么样?

在Python编程中,if语句作为流程控制的核心成员,常被用于逻辑判断。然而,过度依赖if可能导致代码结构冗长、难以维护,特别是在面对复杂逻辑时。让我们深入探讨这一问题,并探索如何使代码更加清爽高效。

xyh2004的博客 1479

Python代码逻辑分离,从减少if...else开始

实现Python代码逻辑分离,从减少if...else开始

大模型研究中心 441

Python条件语句(if-elif-else)的完整用法与嵌套技巧

Python中的条件语句是编程中的核心控制结构,通过if、elif和else关键字实现。本文详细介绍了条件语句的基础语法、常见条件表达式类型(如比较运算、成员测试、布尔运算等)以及真值测试规则。文章还探讨了条件语句的多种用法,包括单一if语句、if-else结构、if-elif-else链以及三元运算符的简化形式。此外,嵌套条件语句的使用及其扁平化优化也被深入讨论,展示了如何通过提前返回来提高代码可读性。高级技巧部分介绍了使用字典映射替代复杂条件链、any()和all()函数的应用,以及短路求值特性的实际应

记录学习的过程 1518

python if elif else 的简化写法(用在列表、字典推导式以及lambda函数中)

最近写程序经常需要在列表推导式中添加判断条件,有时候在lambda匿名函数中添加判断条件,或者有时候写程序写的太长了,需要判断语句的时候不想在写成多行了(显得很啰嗦),这些时候用了一下if elif else的简化用法(这个时候可读性就差),现在我总结一下这个用法: 1、if elif else的一行写法 一般写法: a = 5 if a <10: print('小于...

HUIxihuanni的博客 1万+

【爬虫】Python实现爬取淘宝商品信息(超详细)

项目基于Python的第三方库Selenium模拟浏览器运行、PyQuery解析和操作HTML文档,获取淘宝平台中某类商品的详细信息(商品标题、价格、销量、商铺名称、地区、商品详情页链接、商铺链接等),并基于第三方库openpyxl建立、存储于Excel表格中。# 全局变量count = 1 # 写入Excel商品计数# 启动ChromeDriver服务# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式# 把chrome设为selenium驱动的浏览器代理;# 窗口最大化。

qq_46315152的博客 4万+

LCD驱动芯片——BL55072A驱动程序

初始化子程序: START 0x7C; I2C子地址 0xEA;ICSET,软件复位芯片 0xC0;MODSET,关显示 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8;ICSET,清复位bit1 STOP 显示刷新子程序: START 0x7C;I2C子地址 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8或0xEC;ICSE

love421的博客 3175

如何在Python中简化if语句多个条件

在python中一个if语句中,如果有很多个or或者and的判断,会导致语句很长,不利于阅读。 举例如下: data = ["a","b","c","d"] if "a" in data or "b" in data or "c" in data or "d" in data: print("成功进入if语句中") 那有没有什么方法可以让if语句简单呢? 方法1.单独使用any()或all(): data = ["a","b","c","d"] #任意一个条件符合,就会进入if语句

u011564779的博客 3685

StarRocks FE启动异常

服务器断电,StarRocks FE 启动失败。

qq_15138049的博客 1113

Python语句简写

前言 一些不复杂的条件语句、循环语句可以使用简短的语句完成。 条件语句if…else… 正常python的if else语句是这样的: if condition_1:      语句块 elif condition_2:      语句块 else:       语句块 最少需要四行来完成这个语句 但是一些简单的语句不需要这么复杂 简写语句: true

Crayonxin2000的博客 986

mot_challenge官方评估代码

mot_challenge官方代码使用介绍 评估mot17验证集:每个视频序列的后一半帧作为验证集 下载源码:git clone https://hub.fastgit.org/JonathonLuiten/TrackEval.git 官网上下载data样例,放在TrackEval/下,结构如下: data |-- gt | |-- bdd100k | |-- davis | |-- kitti | |-- mot_challenge | | |-- MOT15-train |

qq_37866436的博客 4894

GPIB通讯的代码怎么写

GPIB(General Purpose Interface Bus)是一种用于连接计算机和测试设备的接口标准。 在写 GPIB 通讯的代码时,首先需要在计算机上安装 GPIB 驱动程序。然后,使用相应的编程语言和 GPIB 库函数来操作 GPIB 设备。 下面是一个使用 Python 语言和 pyvisa 库来实现 GPIB 通讯的示例代码: import visa# 创建 Visa 资源管理器...

weixin_35752645的博客 1546

【经验】代码中大量的if/else,如何优化?

关注、星标公众号,直达精彩内容原文链接地址:https://www.zhihu.com/question/344856665/answer/816270460观点一(灵剑):前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅的优化掉这些多余的if/else?1. 提前return这是判断条件...

李肖遥的专栏 1929

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 391

【 python 中 if 的用法(if else, if not, elif)】

本文介绍了常见的if语句的各种用法

F_Y202172的博客 5万+

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

如何简化大量的 if…elif…else 代码?

在日常代码中,我们总是会面对大量 if…elif…else 条件分支选择的问题。说实话,我在多数情况下首推就是老老实实地写 if…elif,并且设法把每个分支下的内容抽取成独立的函数。结构清晰,意图明白,对于编写和阅读都是极大的便利。不过,在某些特殊的情况下,还可以使用其它更为优雅的写法,比如我们之前分享过的《不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?》,以及今天要分享的这篇文章,可以开阔一下代码编写思路。 今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if….

xx_nm98的博客 470

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python流程控制:if-else与if-elif-else嵌套使用

本文深入讲解Python流程控制中的if-else与if-elif-else嵌套使用,是Python编程的核心知识点。文章从基本概念、技术原理到实践应用全面展开,重点包括:1)if-else嵌套的基本语法与重要性;2)详细技术原理与实现方法;3)环境配置与基础/进阶示例代码;4)常见问题解决方案。通过实际代码演示和场景分析,帮助读者掌握这一关键编程技能,提升代码质量和开发效率。适合Python初学者系统学习流程控制语句的使用方法。

未来 95% 的 AI 应用将变得隐形,广泛融入日常生活。 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

使用装饰器简化大量 if…elif…代码

来源:未闻Code今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if...elif...else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样...

Python数据之道 335

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Python 关于避免大量的if elif重复

### 场景 在处理多种判断的时候我们通常写法是 if x == '黑暗': y = 1 elif x == '偏暗': y = 2 elif x == '正常': y = 3 elif x == '明亮':   y = 4 elif x == '强光': y = 5 这种写法遇到大量的判断的时候会显得十分臃肿,这里提供一种比较优雅的写法来简化这种判断过程 ###...

三番鱼 2612

一文搞懂 Python 条件语句(if-elif-else)与循环(for/while)

条件语句:if 用于判断条件,elif 处理多条件,else 处理剩余情况,逻辑运算符可以组合多个条件循环语句:for 适合遍历序列,while 适合根据条件循环,break 和 continue 可以控制循环流程实战技巧:通过综合案例练习将条件语句和循环结合使用,解决实际问题多编写代码练习是掌握这些概念的关键,尝试修改本文中的示例,或者用它们解决你自己的问题,你会逐渐熟练运用这些基础但强大的工具。

weixin_70847910的博客 1676

python中if elif语句优化_关于python:当else被做得最多时,最有效的if-elif-elif-else语句的方法是什么?...

我有一个in-if-elif-elif-else语句,其中99%的时间执行else语句:if something == 'this':doThis()elif something == 'that':doThat()elif something == 'there':doThere()else:doThisMostOfTheTime()这个构造做了很多,但是因为它在碰到其他东西之前就已经克服了所有...

weixin_42308943的博客 711

Python 小技巧,如何避免写一堆 if…elif…?

今天在 Github 阅读EdgeDB的代码,发现它在处理大量判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的写法是这样的: 大家都知道,这样大量的代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。有一些同学知道,可以使用字典来改写这个太长的 if 判断: 但今天我学到的这个方法,比用字典更简单。我们先来看它的效果: 运行效果如下图所示:这样写,比用字典的方式更直观,比直

sixqingfeng的博客 1200

再见 if…elif… ,使用 Python 装饰器轻松拿下

大家好,今天在 Github 阅读 EdgeDB[1] 的代码,发现它在处理大量if...elif...else的时候,巧妙地使用了装饰器,方法设计精巧,分享给大家一下。 我们来看看这个方法具体是什么样的。假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if ... elif...写法是这样的: def get_discount(level): if level == 1: "大量计算代码" discount = 0.1 elif lev

m0_64355682的博客 1693

再见 if…elif…!使用 Python 装饰器轻松搞定!

大家好,今天在 Github 阅读 EdgeDB[1] 的代码,发现它在处理大量if…elif…else的时候,巧妙地使用了装饰器,方法设计精巧,分享给大家一下,欢迎收藏学习,喜欢点赞支持,技术交流见文末。我们来看看这个方法具体是什么样的。假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if … elif…写法是这样的: 大家都知道,这样大量的if … elif…代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。更多原创文章、资料,可以微信扫描下面二维码—

weixin_55154866的博客 1327

Python编程进阶:深入探索if-elif-else的高级技巧!

从基础的条件判断到使用条件表达式、逻辑运算符、多条件判断、嵌套条件、以及利用字典和lambda表达式优化代码,覆盖了各种常见和高效的使用方法。本文将详细介绍Python中if-elif-else语句的高级用法,包含示例代码,帮助在编写Python程序时更好地控制程序逻辑。在这个示例中,使用字典将操作字符串映射到相应的函数,从而避免了大量的if-elif-else语句。在条件判断中,可以结合lambda表达式简化代码,特别是用于简单的条件和操作。条件表达式,也称为三元运算符,是一种简洁的条件判断方法。

很酷的站长的博客 918
上一篇: 一个面基大佬的机会!2021 七牛云战略发布会启幕,邀您赴约!
下一篇: 腾讯三面:40亿个QQ号码如何去重?
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值