2015-04-23 126 views
3

下面的代码返回一个人的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" 

回答

4

也许最好,或至少最清楚,方法是通过使用与multiple if/elif/else blocks AV良莠不齐持有风险:

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 
4

只有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)] 
+0

你的第二个函数更紧凑(并且可以说是更具可读性)的版本可能是'return risktable [(bmi> = 22)+(age> = 45)]'...... –