Python 为什么我的if语句得不到正确的答案?还有,如何找到所有输入的平均值?
由于某些原因,我在运行此程序时,没有得到正确数量的快速女性和快速男性。快的雌性是小于-19的数字,快的雄性是小于15的数字。另外,如果有人能建议如何找到所有输入组合的平均值Python 为什么我的if语句得不到正确的答案?还有,如何找到所有输入的平均值?,python,printing,average,Python,Printing,Average,由于某些原因,我在运行此程序时,没有得到正确数量的快速女性和快速男性。快的雌性是小于-19的数字,快的雄性是小于15的数字。另外,如果有人能建议如何找到所有输入组合的平均值 #Write a program that categorizes user input #Ask for user input userInput=input("Enter a time (negative for F, "" to quit): ") #Initialize variables female=0 ma
#Write a program that categorizes user input
#Ask for user input
userInput=input("Enter a time (negative for F, "" to quit): ")
#Initialize variables
female=0
male=0
noRunner=0
fastFemale=0
fastMale=0
count=0
#Categorize input into male, female, fast female, and fast male
while userInput!="":
count=count+1
if userInput=="0":
userInput=noRunner
noRunner=noRunner+1
if str(userInput).startswith("-"):
userInput=female
female=female+1
if float(userInput) >= 19.0 and float(userInput) < 0.0:
userInput=fastFemale
fastFemale=fastFemale+1
elif float(userInput) > 0.0:
male=count-female-noRunner
if float(userInput) <= 15.0 and float(userInput) > 0.0:
userInput=fastMale
fastMale=fastMale+1
userInput=input("Enter a time (negative for F, "" to quit): ")
#Computations
total=male+female
noShow=noRunner
#Print statements
print()
print("Try-Out Report")
print("-"*40)
print("Total number of runners:", count-noShow)
print("Number of runners who didn't show:", noShow)
print("female", female)
print("male", male)
print("Average time for male runners:")
print("Average time for female runners:")
print("Average time for all runners:")
print("Fast female runners:", fastFemale)
print("Fast male runners:", fastMale)
#编写一个程序,对用户输入进行分类
#请求用户输入
userInput=input(“输入时间(F为负数),“退出):”)
#初始化变量
女性=0
男性=0
noRunner=0
fastFemale=0
fastMale=0
计数=0
#将输入分为男性、女性、快速女性和快速男性
而用户输入="":
计数=计数+1
如果userInput==“0”:
userInput=noRunner
noRunner=noRunner+1
如果str(userInput).startswith(“-”):
用户输入=女性
女=女+1
如果浮点(用户输入)>=19.0且浮点(用户输入)<0.0:
userInput=fastFemale
fastFemale=fastFemale+1
elif浮点(用户输入)>0.0:
男=女诺伦纳计数
如果浮动(用户输入)为0.0:
userInput=fastMale
fastMale=fastMale+1
userInput=input(“输入时间(F为负数),“退出):”)
#计算
总数=男性+女性
noShow=noRunner
#打印报表
打印()
打印(“试用报告”)
打印(“-”*40)
打印(“跑步者总数:”,无显示计数)
打印(“未显示的跑步者人数:”,无显示)
印刷品(“女性”,女性)
印刷品(“男性”,男性)
打印(“男性跑步者的平均时间:”)
打印(“女性跑步者的平均时间:”)
打印(“所有跑步者的平均时间:”)
打印(“快速女性跑步者:”,快速女性)
打印(“快速男跑步者:”,快速男)
当您获得输入时,构建一个总和,然后除以计数
当然,在初始化计数时初始化sum=0
由于您已经删除了“-”符号,因此不需要使用abs
sum += float(userval)
avg = sum/total
请注意,您应该使用如下代码
female += 1
而不是
female = female + 1
请注意,这里的问题是,在使用输入变量之前更改了它
这使得以后的所有检查都无效。在检查值之前,也不要使输入为正,这样它将始终为负,因此永远不会>19将其更改为字符串以查找“-”是错误的,只需检查<0即可
从已经是浮点或整数的userInput开始
检查负值,然后更改为abs(userval),以获取女性类别中的实际算术值
if str(userInput).startswith("-"):
userInput=female # This messes up the next if
female=female+1
if float(userInput) >= 19.0 and float(userInput) < 0.0:
userInput=fastFemale
fastFemale=fastFemale+1
如果str(userInput).startswith(“-”):
userInput=female#这会把下一个
女=女+1
如果浮点(用户输入)>=19.0且浮点(用户输入)<0.0:
userInput=fastFemale
fastFemale=fastFemale+1
这让我大吃一惊。使用userInput<0
,就像您在下面的elif
上所做的那样
...
userInput=female
...
当您这样做时,您只是丢失了userInput值
在交互式会话中玩输入
,看看它是如何工作的。不需要浮动(用户输入)
代码真的很糟糕。试着从问题的一个子集开始,例如只从女性开始,试着了解发生了什么,不要只是尝试随机地调整事情来获得结果。你可以很好地利用pythons迭代器和列表函数(
sum
,len
)和-comprehensions
大概是这样的:
def prompt():
return input('Enter a time (negative for F, "" to quit): ')
data = [float(datum) for datum in iter(prompt, '')]
females = [-datum for datum in data if datum < 0.]
males = [datum for datum in data if datum > 0.]
print ('Males average: {}'.format(sum(males) / len(males)))
print ('Females average: {}'.format(sum(females) / len(females)))
print ('Fast males: {}'.format(sum(1 for male in males if male < 15.)))
要进一步分类,您可以执行以下操作:
fastMales = [male for male in males if male < 15.]
fastFemales = [female for female in females if female < 19.]
fastMales=[如果男性<15,则男性代表男性。]
fastFemales=[如果女性<19,则女性代表女性。]
我提取了一个Stats类,它只自动跟踪适用的值。它使您的代码稍微长一点,但更易于遵循:
import sys
if sys.hexversion < 0x3000000:
inp = raw_input # Python 2.x
else:
inp = input # Python 3.x
def average(sum, num):
return sum / (num or 1.) # prevent div-by-0
class Stats:
def __init__(self, title, filter_fn, neg=False):
self.filter_fn = filter_fn
self.neg = neg
self.num = 0
self.sum = 0.
def add(self, item):
if self.filter_fn(item):
self.num += 1
self.sum += -item if self.neg else item
@property
def avg(self):
return average(self.sum, self.num)
female = Stats("Female runners", lambda x: x < 0. , True)
fast_female = Stats("Fast female runners", lambda x: -19. < x < 0., True)
no_show = Stats("No shows", lambda x: x == 0. )
fast_male = Stats("Fast male runners", lambda x: 0. < x < 15. )
male = Stats("Male runners", lambda x: 0. < x )
def main():
while True:
s = inp("Enter run time (negative for female, blank to quit): ")
try:
time = float(s)
for stat in [female, fast_female, no_show, fast_male, male]:
stat.add(time)
except ValueError:
break
print("\nTryout Report\n----------------------------------------")
print(
"All runners: {:d} male + {:d} female = {:d} ({:d} no-shows)"
.format(male.num, female.num, male.num + female.num, no_show.num)
)
print(
"Average times: {:0.3f} male, {:0.3f} female, {:0.3f} overall"
.format(male.avg, female.avg, average(male.sum + female.sum, male.num + female.num))
)
print(
"Fast runners: {:d} male + {:d} female = {:d}"
.format(fast_male.num, fast_female.num, fast_male.num + fast_female.num)
)
if __name__=="__main__":
main()
列出既大于19又小于0的数字。然后看看你的输入。还要注意python变量是区分大小写的。
fastMales = [male for male in males if male < 15.]
fastFemales = [female for female in females if female < 19.]
import sys
if sys.hexversion < 0x3000000:
inp = raw_input # Python 2.x
else:
inp = input # Python 3.x
def average(sum, num):
return sum / (num or 1.) # prevent div-by-0
class Stats:
def __init__(self, title, filter_fn, neg=False):
self.filter_fn = filter_fn
self.neg = neg
self.num = 0
self.sum = 0.
def add(self, item):
if self.filter_fn(item):
self.num += 1
self.sum += -item if self.neg else item
@property
def avg(self):
return average(self.sum, self.num)
female = Stats("Female runners", lambda x: x < 0. , True)
fast_female = Stats("Fast female runners", lambda x: -19. < x < 0., True)
no_show = Stats("No shows", lambda x: x == 0. )
fast_male = Stats("Fast male runners", lambda x: 0. < x < 15. )
male = Stats("Male runners", lambda x: 0. < x )
def main():
while True:
s = inp("Enter run time (negative for female, blank to quit): ")
try:
time = float(s)
for stat in [female, fast_female, no_show, fast_male, male]:
stat.add(time)
except ValueError:
break
print("\nTryout Report\n----------------------------------------")
print(
"All runners: {:d} male + {:d} female = {:d} ({:d} no-shows)"
.format(male.num, female.num, male.num + female.num, no_show.num)
)
print(
"Average times: {:0.3f} male, {:0.3f} female, {:0.3f} overall"
.format(male.avg, female.avg, average(male.sum + female.sum, male.num + female.num))
)
print(
"Fast runners: {:d} male + {:d} female = {:d}"
.format(fast_male.num, fast_female.num, fast_male.num + fast_female.num)
)
if __name__=="__main__":
main()
Enter run time (negative for female, blank to quit): -20
Enter run time (negative for female, blank to quit): -16
Enter run time (negative for female, blank to quit): -12
Enter run time (negative for female, blank to quit): 0
Enter run time (negative for female, blank to quit): 0
Enter run time (negative for female, blank to quit): 12
Enter run time (negative for female, blank to quit): 14
Enter run time (negative for female, blank to quit): 16
Enter run time (negative for female, blank to quit):
Tryout Report
----------------------------------------
All runners: 3 male + 3 female = 6 (2 no-shows)
Average times: 14.000 male, 16.000 female, 15.000 overall
Fast runners: 2 male + 2 female = 4