Skip to main content
 首页 » 编程设计

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

2025年05月04日8cyq1162

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

男性和女性的公式不同,但都需要年龄 (alder)、静息心率 (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") 

请您参考如下方法:

这是我的建议。

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

  • 当您想根据多个可能的合法值检查一个值时,一个好的 Python 习惯用法是使用 in (value0, value1, value2, ..., valueN)。在这种情况下,您可以检查 in ('m', 'd'),但因为我们正在检查单个字符,所以我们实际上可以检查 in "md"这也行得通。

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

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

  • 我没有对 float 调用 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")