1

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 给出的是正常而不是肥胖等...)

4

4 回答 4

6

你不想and......or它需要满足这两个标准......你也可以用 Python 编写它if 18.5 <= bmi < 25以使其更清晰并避免这种情况......

还可以考虑查看http://docs.python.org/2/library/bisect.html,它可以为你做这种事情,如果你有更大的范围,它会更好地扩展。看看成绩的例子

于 2013-09-18T22:39:39.017 回答
4

这是因为你正在使用or. 如果bmi >= 18.5为真,则第一个条件的整个条件elif都为真。改为使用and

或者更好的是,不要将两个条件合二为一。当达到第一个 elif 时,您知道bmi >= 18.5如果不是,则将输入第一个 if 。因此,我们可以将其重写为

if bmi < 18.5:
    return "underweight"
if bmi < 25:
    return "normal"
if bmi < 30:
    return "overweight"
return "obese"

我们也不需要elif因为return结束函数。

于 2013-09-18T22:39:38.830 回答
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

于 2013-09-18T22:39:26.057 回答
1

>=意思是“大于或等于”。bmi >= 18.5对于等于 18.5 或以上的任何数字也是如此。

因为您使用了布尔运算符or,所以如果数字为 18.5 或更高,则整个语句将为真。因此为什么它适用于 3000。

您可能打算这样做bmi >= 18.5 and bmi <25,如果两个条件都为真,这将是真。

于 2013-09-18T22:39:35.103 回答