减少 return 语句的数量

Reducing the amount of return statements

以下代码 return 是一个人的 BMI 风险 - 。 它工作得很好。但是,我想知道是否有另一种方法可以在不使用太多 return 语句的情况下解决它。

是否有任何其他方法,无论是 Pythonic 的还是逻辑上的,都可以使其更短?

def bmi_risk(bmi, age):
    ''' function returning bmi's risk on human '''
    if bmi < 22 and age < 45:
        return "Low"
    if bmi < 22 and age >= 45:
        return "Medium"
    if bmi >= 22 and age < 45:
        return "Medium"
    if bmi >= 22 and age >= 45:
        return "High"

只有3个选项。如果它不是低或高,那么它必须是中等。所以在检查了低和高之后你可以 return medium:

def bmi_risk(bmi, age):
    ''' function returning bmi's risk on human '''
    if bmi < 22 and age < 45:
        return "Low"
    if bmi >= 22 and age >= 45:
        return "High"
    return "Medium"

一种可读性较差但更紧凑的形式是使用 table 并根据条件计算其中的索引,它表示风险因素的总和:

def bmi_risk(bmi, age, risktable=["Low", "Medium", "High"]):
    return risktable[(1 if (bmi >= 22) else 0) + (1 if (age >= 45) else 0)]

或者(感谢@ZeroPiraeus):

def bmi_risk(bmi, age, risktable=["Low", "Medium", "High"]):
    return risktable[(bmi >= 22) + (age >= 45)]

也许最好的,或者至少是最清楚的方法是使用 multiple if/elif/else blocks 和一个变量来保持风险:

def bmi_risk(bmi, age):
    ''' function returning bmi's risk on human '''
    if bmi < 22 and age < 45:
        risk = "Low"
    elif bmi < 22 and age >= 45:
        risk = "Medium"
    elif bmi >= 22 and age < 45:
        risk = "Medium"
    elif bmi >= 22 and age >= 45:
        risk = "High"
    else:
        risk = "Unknown"
    return risk

至少,这允许您在分配 risk 之后但在 returning 之前对 risk 进行额外检查。


关于编程语言中的单个或多个 return 存在非常主观的讨论 - 特别是像 Python 这样具有自动垃圾收集的语言。

您的代码没有什么可怕的错误,多个 return 允许在需要时提前 return。例如:

def my_function(argument1, argument2):
    if some_obvious_error_condition:
        return "ERR"

    # 100 lines of complex code

    return other_thing

另一种使用字典的方法,

age = 45
bmi = 22

age1 = int(input("Age:"))
bmi1 = int(input("BMI:"))

test1 =  {(age1 < age and bmi1 < bmi) : "Low",
(age1 >= age and bmi1 < bmi) : "Medium",
(age1 < age and bmi1 >= bmi) : "Medium1",
(age1 >= age and bmi1 >= bmi) : "High", }

if True in test1:
    print(test1[True])
    
else:
    print("Unknown")
    
Age:22
BMI:44
Medium1

[Program finished]