2

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

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

如果个人只是按 Enter,则代码会计算最大心率。

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

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

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

任何其他关于清理代码的一般性评论和更好的(也许是更多的 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")
4

1 回答 1

1

这是我的建议。

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

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

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

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

  • 我没有调用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")
于 2012-08-03T07:07:44.770 回答