循环if else块的替代方案

时间:2017-12-14 00:19:10

标签: python

我试图制作一些我急忙写的代码,其中有很多复制/粘贴更清洁。我注意到我有两个功能,它们在做同样的事情时非常接近。以下是他们的要点:

def determine_risk(difference):
    if difference > ON_TRACK:
        return 'On Track'
    elif difference < HIGH_RISK:
        return 'High Risk'
    else:
        return 'Low Risk'

def determine_completeness(pct_complete):
    if pct_complete == UNSTARTED:
        return 'Unstarted'
    elif pct_complete > READY:
        return 'Ready'
    else:
        return 'In Process'

我喜欢把它变成一个功能。像

这样的东西
def determine_condition(metric, [list_of_conditions], [list_of_outcomes], fallback)
    for condition, outcome in zip(list_of_conditions, list_of_outomes):
         if metric satisfies condition:
              return outcome
    return fallback

问题是我不认为将条件检查存储在这样的列表中是可能的!如果有人可以向我展示一种方式,或者看到将这些相似类型的功能合并为一种方法的替代方法,请在此处发布

1 个答案:

答案 0 :(得分:2)

您可以将条件存储为lambda表达式数组,例如:

a = lambda x: x > 1
b = lambda x: x < 5
conditions = [a, b]

但说实话,我不会。在你的第一个例子中,这两个函数绝对没有错 - 它们有合理的名称,我可以清楚地告诉他们什么时候阅读它们。

如果您重构代码以使用第二个示例,则会丢失此代码。每当我看到对determine_condition的调用时,我都必须去阅读该函数的功能,并确定它只是检查一系列条件的通用方法。

有时候在可读性的祭坛上牺牲简洁会更好,而对我而言,这是其中一次。

修改

我给出的lambda示例并没有返回布尔值,这是你需要的 - 修改后他们做了