我是python的新手,现在正在我的第一堂课,仅用了大约4周。
分配是计算测试平均值并显示输入的每个测试的等级。
部分作业是使用一个函数来计算平均值,以及决定分配给每个分数的字母等级。
据我所知,函数应该有助于减少全局变量。
我的问题是: 如何压缩此代码?
我不知道如何使用函数来决定字母等级,然后在不为已输入的每个等级创建全局变量的情况下显示该字母。
如果您发现我的代码中存在任何冗余,我会很高兴能够提出一些有关如何减少代码的问题。如果我按原样转动它,我已经可以闻到我会得到的标记......
def main():
grade1=float(input( "Enter score (0-100):"))
while (grade1 <0 or grade1 >100 ):
if grade1 <0 or grade1 >100:
print("Please enter a valid grade")
grade1=float(input( "Enter score (0-100):"))
grade2=float(input( "Enter score (0-100):"))
while (grade2 <0 or grade2 >100 ):
if grade2 <0 or grade2 >100:
print("Please enter a valid grade")
grade2=float(input( "Enter score (0-100):"))
grade3=float(input( "Enter score (0-100):"))
while (grade3 <0 or grade3 >100 ):
if grade3 <0 or grade3 >100:
print("Please enter a valid grade")
grade3=float(input( "Enter score (0-100):"))
grade4=float(input( "Enter score (0-100):"))
while (grade4 <0 or grade4 >100 ):
if grade4 <0 or grade4 >100:
print("Please enter a valid grade")
grade4=float(input( "Enter score (0-100):"))
grade5=float(input( "Enter score (0-100):"))
while (grade5 <0 or grade5 >100 ):
if grade5 <0 or grade5 >100:
print("Please enter a valid grade")
grade5=float(input( "Enter score (0-100):"))
total=grade1+grade2+grade3+grade4+grade5
testAverage=calcAverage(total)
eachGrade1=determineGrade(grade1)
eachGrade2=determineGrade(grade2)
eachGrade3=determineGrade(grade3)
eachGrade4=determineGrade(grade4)
eachGrade5=determineGrade(grade5)
print("\nTest #1 grade:", (eachGrade1))
print("Test #2 grade:", (eachGrade2))
print("Test #3 grade:", (eachGrade3))
print("Test #4 grade:", (eachGrade4))
print("Test #5 grade:", (eachGrade5))
print("\nTest average:", (testAverage),("%"))
def calcAverage(total):
average=total/5
return average
def determineGrade(grade):
if grade >=90:
return "A"
elif grade >=80:
return "B"
elif grade >=70:
return "C"
elif grade >=60:
return "D"
else:
return "F"
答案 0 :(得分:1)
我不会重构你的整个代码,但这里有一些指示:
首先,您需要一个函数来获取用户输入,我们称之为get_score
。我不会在这里详细介绍,因为这里有一个关于如何编写函数的优秀资源:Asking the user for input until they give a valid response。该函数应该返回一个浮点数或整数,所以不要忘记input
(假设你使用的是Python 3)返回一个你必须手动转换为int或float的字符串。
要获得n
分数列表,我建议使用以下功能:
def get_n_scores(n):
return [get_score() for _ in range(n)]
方括号中的内容是列表理解,相当于:
scores = []
for _ in range(n):
scores.append(get_score())
如果您对理解不满意,请使用此代码(不要忘记返回result
)。
变量名_
通常用于表示未使用的临时值(迭代除外)。
您可以通过调用grade1
来避免声明grade5
... all_scores = get_n_scores(5)
,这将返回包含用户输入的列表。请注意,索引是从零开始的,因此您将能够访问all_scores[0]
... all_scores[4]
。
您可以只应用内置的total
函数sum
,而不是硬编码total = sum(all_scores)
,假设all_scores
包含整数或浮点数。
最后,您可以将功能determineGrade
应用于all_scores
中的每个分数,以确定每个分数的分数。同样,您可以使用理解:
all_grades = [determineGrade(score) for score in all_scores]
或传统:
all_grades = []
for score in all_scores:
all_grades.append(determineGrade(score))
其他东西看起来没问题,只是为了打印成绩,你可以循环all_grades
并打印项目。如果你想编写更多函数来包含我们正在进行的几个函数调用,这取决于你。
一般情况下,请始终避免使用repeating yourself,而是编写函数。
答案 1 :(得分:0)
我写的如下:
def get_grade():
while(True):
grade = float(input("Enter score (0-100):"))
if grade >= 0 and grade <= 100:
return grade
print("Please enter a valid grade!")
def get_average(sum_val, counter):
return sum_val/counter
def determine_grade(grade):
if grade >=90:
return "A"
elif grade >=80:
return "B"
elif grade >=70:
return "C"
elif grade >=60:
return "D"
else:
return "F"
test_num = 5
sum_val = 0
result = {}
for i in range(test_num):
grade = get_grade()
result[i] = determine_grade(grade)
sum_val += grade
for key in result:
print ("Test %d Grade is %s" % (key+1, result[key]))
avg = get_average(sum_val, test_num)
print ("Average is %d" % avg)
像这样工作:
>>> ================================ RESTART ================================
>>>
Enter score (0-100):89
Enter score (0-100):34
Enter score (0-100):348
Please enter a valid grade!
Enter score (0-100):34
Enter score (0-100):90
Enter score (0-100):85
Test 1 Grade is B
Test 2 Grade is F
Test 3 Grade is F
Test 4 Grade is A
Test 5 Grade is B
Average is 66
>>>