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

liftword2周前 (12-13)技术文章18

今天在 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}') 

运行效果如下图所示:

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

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

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

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

运行效果如下图所示:

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

相关文章

Python- 第 15 天 - IF 语句 - 核心 P原理

Python 中的条件语句概述:编程通常涉及检查条件并根据这些条件决定采取什么行动。Python if 语句:允许检查程序的当前状态并适当地响应该状态。目标: 学习编写允许检查相关条件的条件测试。将编...

python每天学习一点点(if语句条件表达式)

在python中如果条件语句只有两个选择,要么是a,要么是b,可以使用条件表达式来编写语句。一、不使用条件表达式,代码如下:例1a = 6 b = 9 if a > b: print(a...

Python 中 if __name__ == '__main__' 的解释

1. 基本概念在Python中,`if __name__ == "__main__"`是一种常见的代码结构。`__name__`是一个内置变量,它的值取决于模块是如何被使用的。当一个P...

Python中的流程控制之条件控制:if,else,elif

前言在编程时,我们写的代码要遵循语言结构和流程控制,流程控制包括:顺序控制、条件控制、以及循环控制。顺序控制就是按照正常的代码执行顺序,从上到下,从代码开头执行到代码结尾,依次执行每条语句。本次内容,...

Python之if语句使用

在Python编程语言中,for语句是一个非常常用的控制流语句。它用于遍历一个序列(如列表、元组、字典等),并对每个元素执行一段代码。下面我们将详细介绍Python中for语句的使用方法。1、用if语...

Python中if __name__ == "__main__"的解释

对于很多编程语言来说,程序都必须要有一个入口,比如 C 语言需要有一个 main 函数作为程序的入口,即程序的运行会从 main 函数开始。而 Python 是脚本语言,不像编译型语言那样,先将程序编...