专栏名称: Python编程
人生苦短,我用 Python !关注 Python 编程技术和运用。分享 Python 相关技术文章、开发工具资源、热门信息等。
51好读  ›  专栏  ›  Python编程

记录一次 if-else 代码优化的完整过程

Python编程  · 公众号  ·  · 2024-10-16 09:36

正文

来自公众号: 菜鸟教程
让我们来探讨一下如何将出租车叫车应用中的司机分配逻辑,从复杂的嵌套 if 语句中简化,使之更加清晰和易于维护。
在之前的项目中,我参与了一款至今仍被广泛使用的出租车叫车应用的开发,虽然我不清楚他们现在使用的代码细节,但当时我们处理司机分配的代码大致是这样的:

异步函数 assignDriver 用来为乘客分配司机,它接收乘客信息和可用司机列表作为参数。

函数先计算每个司机到乘客的距离,然后遍历所有可用司机,检查以下条件:

  • 司机是否在 5 公里以内。

  • 如果乘客有偏好的车型,那么司机的车型必须符合偏好。

  • 司机的评分至少要 4.5 分,如果有高级司机偏好,还要确保司机是高级司机。

  • 如果没有找到满足 4.5 分要求的司机,则接受评分为 4.0 分及以上的司机。

这个过程用了五层嵌套的 if 语句,虽然看起来不糟糕,但可以想象,如果再增加一些其他条件(比如高峰期加价、忠诚度计划等),代码会变得多么复杂。


解决问题

幸运的是,有一些方法可以把这些嵌套的逻辑"拍平",甚至最终可以做到不需要任何 if 语句,我们来看看如何重构这段代码。

1、卫语句(Guard Clauses)

卫子句(Guard Clauses)是一种编程技巧,用于在函数或方法的执行过程中尽早地检查错误条件或异常情况,并在满足这些条件时立即退出函数。

卫子句是一种有效的代码设计模式,有助于编写更加健壮和易于理解的代码。

def divide(a, b):    if b == 0:        raise ValueError("Cannot divide by zero")    return a / b

这个例子中,如果除数 b 为 0,函数会立即抛出一个 ValueError 异常。

我们可以利用 卫子句 ,把最外层的 if 条件拿出来,直接跳过不符合条件的司机,减少嵌套。

下面是修改后的代码:

通过使用卫语句,我们减少了两层嵌套,让代码变得稍微清晰一点。

2、决策表(Decision Tables)

决策表是一种数据结构,用于以表格的形式表示复杂的逻辑决策,使得逻辑决策更加清晰和易于理解。

决策表 通常用于替代复杂的条件语句(如if-else嵌套),特别是在逻辑判断较多且条件复杂的情况下。

在编程中,决策表可以通过多种方式实现,例如使用查找表、状态机或专门的决策表库。

以下是使用 Python 实现的一个简单示例:

def evaluate_decision_table(table, context):    for rule in table:        if all(context.get(k) == v for k, v in rule['conditions'].items()):            return rule['action']    return None# 定义决策表decision_table = [    {        'conditions': {'age': 18






请到「今天看啥」查看全文