<p>你真的应该清理你的代码,所有这些额外的空间伤害可读性。我建议使用PyLint(<code>pip install pylint</code>,<code>pylint file.py</code>)</p>
<p>我不会太重构你的代码,但是你需要在转换成一个float之前检查“done”。如果有人输入了无效的答案,您需要捕捉ValueErrors并优雅地处理它</p>
<pre><code>print("Enter the homework scores one at a time. Type \"done\" when finished. Ctrl+c to quit at any time.")
hwCount = 1
totalScore = 0
try:
while True:
strScore = input("Enter HW#" + str(hwCount) + " score: ")
if strScore == 'done':
break #done
else:
try:
strScore = float(strScore)
except ValueError:
print('Invalid input: must be a numerical score or "done"')
continue
if (strScore == int (strScore) and strScore >=0 and strScore <=10):
totalScore = totalScore + (strScore)
hwCount = hwCount + 1
elif ( strScore == int (strScore) and( strScore < 0 or strScore > 10)):
print ("Please enter a number between 0 and 10.")
elif strScore != "done":
print ("Please enter only whole numbers.")
except KeyboardInterrupt:
pass #done
</code></pre>
<p>这是你的程序的一个更完整的版本,供参考。这就是我重构它的方式</p>
<pre><code>#!/usr/bin/env python3
def findmode(lst):
bucket = dict.fromkeys(lst, 0)
for item in lst:
bucket[item] += 1
return max((k for k in bucket), key=lambda x: bucket[x])
print("Enter the homework scores one at a time.")
print("Type 'done' when finished or ctrl+c to quit.")
scores = []
try:
while True:
strScore = input("Enter score: ")
if strScore == 'done':
break #done
else:
try:
strScore = int(strScore)
except ValueError:
print('Invalid input: must be a score or "done"')
continue
if (0 <= strScore <= 10):
scores.append(strScore)
else:
print("Please enter a valid score between 0 and 10.")
except KeyboardInterrupt:
pass # user wants to quit, ctrl+c
finally:
print("Total scores graded: {}".format(len(scores)))
print("Highest score: {}".format(max(scores)))
print("Lowest score: {}".format(min(scores)))
print("Mean score: {}".format(sum(scores)/len(scores)))
print("Mode score: {}".format(findmode(scores)))
</code></pre>