减少 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]
以下代码 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]