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

2024-04-26 21:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

男性和女性的公式不同,但都需要年龄(alder)、静息心率(hvilepuls)和最大心率(makspuls)。在

如果用户只需按enter键,代码将计算最大心率。在

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

我已经能够捕捉到空白输入,但我似乎无法将其与零或更少的输入相结合。在

我写的代码在下面,可以工作,但不能阻止人们输入等于或小于零的数字。在

还有其他关于清理代码和更好的建议吗(也许更像python?)写这篇文章的方式值得赞赏。在

# 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")

Tags: inputmin心率lowerintprinterdin
1条回答
网友
1楼 · 发布于 2024-04-26 21:20:36

这是我的建议。在

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

  • 当您想对照多个可能的合法值检查一个值时,一个好的Python习惯用法是使用in (value0, value1, value2, ..., valueN)。在本例中,您可以检查in ('m', 'd'),但因为我们检查的是单个字符,所以实际上我们可以只检查in "md",这也可以。

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

  • 我添加了一些错误消息。我在我的文本周围加上“@@@@@”,以确保你能找到所有的文本并将其本地化为您的语言。(这是一个很短的程序,你很可能已经找到了所有的东西,但我想让你尽可能简单。)

  • 我没有对浮点数调用int()将它们转换为整数,而是使用了round(),这样77.9将变成78而不是77。

编辑:我刚刚编辑了代码。我将输入验证分解为一个函数,并传入一个“validator”函数。我觉得这样比较干净。在

代码:

# 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")

相关问题 更多 >