Python版本:2.7
只是想知道以下代码有什么问题:
def bmi_cat(bmi):
if bmi < 18.5:
return "underweight"
elif (bmi >=18.5 or bmi < 25):
return "normal"
elif (bmi >=25 or bmi < 30):
return "overweight"
else:
return "obese"
基本上如果我输入17它会给我正确的答案,但它给我正常的18.5以上的任何东西(3000给予正常而不是肥胖等...)
答案 0 :(得分:6)
您希望and
不是or
...它需要满足两个条件......您也可以将其作为if 18.5 <= bmi < 25
以Python编写它更清楚,避免这种情况......
另外,请考虑查看http://docs.python.org/2/library/bisect.html哪些可以为您做这类事情,并且如果您的范围更大,则会更好地扩展。看看grade example。
答案 1 :(得分:4)
这是因为您正在使用or
。如果bmi >= 18.5
为真,则第一个elif
的整个条件将为真。请改用and
。
或者更好的是,不在一个中包含两个条件。当第一个elif到达时,你知道 bmi >= 18.5
,如果它不是,那么第一个如果已输入。因此,我们可以将其重写为
if bmi < 18.5:
return "underweight"
if bmi < 25:
return "normal"
if bmi < 30:
return "overweight"
return "obese"
我们也不需要elif
,因为return
结束了此功能。
答案 2 :(得分:2)
应该是:
def bmi_cat(bmi):
if bmi < 18.5:
return "underweight"
elif (bmi >=18.5 and bmi < 25):
return "normal"
elif (bmi >=25 and bmi < 30):
return "overweight"
else:
return "obese"
如果你检查:
elif (bmi >=18.5 or bmi < 25):
对于大于或等于18.5
的每个值,它都给出True答案 3 :(得分:1)
>=
表示“大于或等于”。因此bmi >= 18.5
对于任何等于18.5或更高的数字都是正确的。
因为您使用了布尔运算符or
,所以如果数字是18.5或更高,则整个语句将为true。因此为什么它适用于3000.
您可能打算bmi >= 18.5 and bmi <25
,如果两个条件都为True,则为True。