如何检查输入不是空白,并且是python中大于零的数字

时间:2012-08-03 06:35:08

标签: python python-3.x

我正在尝试用python编写一个程序来计算心率训练区(对于任何感兴趣的人使用Karvonen的公式:-))。

男性和女性的配方不同,但都需要年龄(桤木),静息心率(hvilepuls)和最大心率(makspuls)。

如果个人按下回车,代码会计算最大心率。

我想抓住年龄和静息心脏的空白输入,以及为零或更少的所有三个变量输入的值。

我已经能够捕获空白输入,但我似乎无法将其与零或更少的组合。

我写的代码在下面并且有效,但不会阻止人们输入等于或小于零的数字。

关于清理代码的任何其他一般性评论以及更好的(更多pythonic或许?)写作方式都非常感谢。

# Karvonens formel
#
print(
"""
Kalkulere dine treningssoner for lett løping, anaerob terskel (AT) og VO2 Max treningsøkter.

Instruksjoner

1. Fyll inn din alder, hvilepuls og kjønn.
2. Skriv inn din maksimale hjertefrekvens, hvis du vet det, ellers trykk enter - deretter beregnet programmet det selv som følger:
(Menn 214 - (0,8 * alder) Kvinner:. 209 - (0,7 * alder).

3. Treningssonenes verdier beregnes ved hjelp av Karvonen formelen:
X% = (Maksimal hjertefrekvens hvilepuls) * x/100) + hvilepuls
"""
)

kjonn=""
alder=""
hvilepuls=""
makpuls=""


while kjonn.lower() != "m" and kjonn.lower() != "d":
    kjonn = input("Hvilken kjønn er du? (M)ann/(D)ame\t")

while alder=="":
    alder = int(input("Hvor mange år er du?\t"))

while hvilepuls=="":
    hvilepuls = int(input("Hva er din hvilepuls?\t"))

makspuls = input("Hva er din makspuls?\t")


if makspuls=="":
    if kjonn.lower()=="m":
        makspuls = int(214 - 0.8*int(alder))
    elif kjonn.lower() =="d":
        makspuls = int(209 - 0.7*int(alder))
    else:
        print("\n\nEnter M or D")
else:
    makspuls=int(makspuls)

prosent60 = (makspuls-hvilepuls)*0.6 + hvilepuls
prosent75 = (makspuls-hvilepuls)*0.75 + hvilepuls
prosent85 = (makspuls-hvilepuls)*0.85 + hvilepuls
prosent90 = (makspuls-hvilepuls)*0.9 + hvilepuls

# Remove decimals
prosent60 = int(prosent60)
prosent75 = int(prosent75)
prosent85 = int(prosent85)
prosent90 = int(prosent90)


print("\n\n")
if kjonn.lower()=="m":
    print("Din kjønn  er:\t\tMann")
else:
    print("Din kjønn  er:\t\tDame")
print("Din alder er:\t\t", alder)
print("Din hvilepuls er:\t", hvilepuls," slag/min")
print("Din makspuls er:\t", makspuls," slag/min")

print("\n\n")
print("Din lavsone er:\t",prosent60,"-",prosent75," slag/min")
print("Din ATsone er:\t",prosent85,"-",prosent90," slag/min")
print("Din VO2max er:\t",prosent90,"-",makspuls," slag/min")


input("\n\nTrykk enter for å avslutte")

1 个答案:

答案 0 :(得分:1)

这是我的建议。

  • 应立即验证并清理输入。通常当您接受输入时,最好调用.strip()方法,以防用户错误地输入额外的空格或制表符。在您阅读'm''d'值后,将其强制为小写;然后其余的代码可以假设它是小写的。

  • 如果要针对多个可能的合法值检查一个值,那么使用in (value0, value1, value2, ..., valueN)就是一个好的Python习惯用法。在这种情况下,您可以检查in ('m', 'd'),但由于我们正在检查单个字符,因此我们实际上只需检查in "md"即可。

  • 如果要允许空字符串或整数,只需将响应读入临时变量(我使用名称s作为“字符串临时变量”)然后您可以检查零长度字符串;如果它不是零长度,则转换为整数。您可以将整数变量初始化为负值,然后循环直到它不是负数;但我更喜欢使用while True:循环并添加一个明确的break来显示突破的成功条件。 (注意:如果这是作业,你的老师可能不同意我;有些老师不喜欢在循环中看break,而是更喜欢只在顶部测试循环。)

    < / LI>
  • 我添加了一些错误消息。我在文本周围添加了“@@@@@”,以确保您找到所有内容并将其本地化为您的语言。 (这是一个简短的程序,所以你可能无论如何都可以找到它们,但我想让你尽可能简单。)

  • 我没有在浮点数上调用int()来将它们转换为整数,而是使用round(),因此77.9将变为78而不是77。

编辑:我刚编辑了代码。我将输入验证分解为一个函数,并传入了一个“验证器”函数。我认为这样更清晰。

代码:

# Karvonens formel
#
print(
"""
Kalkulere dine treningssoner for lett lping, anaerob terskel (AT) og VO2 Max treningskter.

Instruksjoner

1. Fyll inn din alder, hvilepuls og kjnn.
2. Skriv inn din maksimale hjertefrekvens, hvis du vet det, ellers trykk enter - deretter beregnet programmet det selv som flger:
(Menn 214 - (0,8 * alder) Kvinner:. 209 - (0,7 * alder).

3. Treningssonenes verdier beregnes ved hjelp av Karvonen formelen:
X% = (Maksimal hjertefrekvens hvilepuls) * x/100) + hvilepuls
"""
)

kjonn=' '
alder=0
hvilepuls=0
makpuls=' '

def check_positive(n):
    if n > 0:
        return True
    else:
        print("@@@@@ Cannot enter a negative or 0 value! @@@@@")
        return False
def check_positive_or_zero(n):
    if n >= 0:
        return True
    else:
        print("@@@@@ Cannot enter a negative value! @@@@@")
        return False

def get_input_int(s_mesg, fn_validate, default=None):
    while True:
        s = input(s_mesg).strip()
        if not s and default is not None:
            return default
        # not a default value; try it as an int
        try:
            n = int(s)
        except ValueError:
            print("@@@@@ Not even an integer! @@@@@")
            continue
        # works as an int; is it valid?
        if fn_validate(n):
            return n


while kjonn not in ('m', 'd'):
    kjonn = input("Hvilken kjnn er du? (M)ann/(D)ame\t").strip().lower()

alder = get_input_int("Hvor mange r er du?\t", check_positive)
hvilepuls = get_input_int("Hva er din hvilepuls?\t", check_positive)
makspuls = get_input_int("Hva er din makspuls?\t", check_positive_or_zero, default=0)


if not makspuls:
    if kjonn == 'm':
        makspuls = int(214 - 0.8*int(alder))
    else:
        makspuls = int(209 - 0.7*int(alder))

prosent60 = (makspuls-hvilepuls)*0.6 + hvilepuls
prosent75 = (makspuls-hvilepuls)*0.75 + hvilepuls
prosent85 = (makspuls-hvilepuls)*0.85 + hvilepuls
prosent90 = (makspuls-hvilepuls)*0.9 + hvilepuls

# Remove decimals
prosent60 = round(prosent60)
prosent75 = round(prosent75)
prosent85 = round(prosent85)
prosent90 = round(prosent90)


print("\n\n")
if kjonn == 'm':
    print("Din kjnn  er:\t\tMann")
else:
    print("Din kjnn  er:\t\tDame")

print("Din alder er:\t\t", alder)
print("Din hvilepuls er:\t", hvilepuls," slag/min")
print("Din makspuls er:\t", makspuls," slag/min")

print("\n\n")
print("Din lavsone er:\t",prosent60,"-",prosent75," slag/min")
print("Din ATsone er:\t",prosent85,"-",prosent90," slag/min")
print("Din VO2max er:\t",prosent90,"-",makspuls," slag/min")


input("\n\nTrykk enter for avslutte")