我正在尝试用 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")
