2015-04-23 182 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)]'...... –