【问题标题】:Reducing the amount of return statements减少return语句的数量
【发布时间】:2015-07-01 01:38:52
【问题描述】:

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

有没有其他方法,无论是 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"

【问题讨论】:

    标签: python-3.x boolean boolean-logic


    【解决方案1】:

    只有 3 个选项。如果它不低或不高,那么它必须是中等的。因此,在检查了低位和高位之后,您可以返回中等:

    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"
    

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

    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)]
    

    【讨论】:

    • 第二个函数的更紧凑(可以说更易读)版本可能是return risktable[(bmi &gt;= 22) + (age &gt;= 45)] ...
    【解决方案2】:

    也许最好的,或者至少是最清楚的方法是通过使用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 之后但在返回之前对其进行额外检查。


    对于编程语言中的单个或多个返回有一个非常主观的讨论 - 尤其是像 Python 这样具有自动垃圾收集的语言。

    您的代码没有任何可怕的错误,并且多次返回允许在需要时提前返回。例如:

    def my_function(argument1, argument2):
        if some_obvious_error_condition:
            return "ERR"
    
        # 100 lines of complex code
    
        return other_thing
    

    【讨论】:

      【解决方案3】:

      另一种使用字典的方法,

      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]
      

      【讨论】:

        猜你喜欢
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多