我需要创建一个计算成绩平均值的程序,并提供降低最低成绩的选项。该计划必须允许用户输入学生人数和每个学生的成绩数。我一直在"' int'对象不可迭代"关于"最低"零件。请帮忙。
def main():
num_students=eval(input("Please enter the number of students you will have grades for: "))
num_grades=eval(input("Please enter the number of grades per student: "))
gcounter=0
scounter=1
drop=input("Do you wish to drop the lowest grade? Type yes or no: ")
if drop=="no" or drop=="No" or drop=="n" or drop=="N":
while scounter<=num_students:
name=input("Please enter the student's name: ")
grades_total=0
while gcounter<num_grades:
getgrade=eval(input("Enter grade: "))
grades_total=grades_total+getgrade
gcounter=gcounter+1
print("The average grade for ", name, "is ", grades_total/gcounter)
num_students=num_students-1
scounter=scounter+1
gcounter=0
elif drop=="yes" or drop=="Yes" or drop=="y" or drop=="Y":
while scounter<=num_students:
name=input("Please enter the student's name: ")
grades_total=0
while gcounter<num_grades:
getgrade=eval(input("Enter grade, including the lowest: "))
lowest = min(getgrade)
grades_total=grades_total+(getgrade-lowest)
gcounter=gcounter+1
print("The average grade for ", name, "is ", grades_total/(gcounter-1))
num_students=num_students-1
scounter=scounter+1
gcounter=0
main()
答案 0 :(得分:0)
您的问题在于行lowest = min(getgrade)
。期望min
函数传递一个可迭代的参数,如列表或元组。你给它一个数字(假设你在提示符下输入的内容)。那不行。您需要先将所有成绩放入列表中,然后在其上调用min
,或者您需要对每个成绩进行不同的检查(例如,使用<
对每个成绩进行测试以前的最小值,您可能需要将其初始化为非常大的值,例如float('inf')
)。
您绝对不希望在每次迭代时减去最小值。最简单的方法是在最后添加所有值(包括最小值)后才这样做:
grades_total = 0
lowest_grade = float('inf') # initialize lowest_grade to infinity
while gcounter < num_grades: # this could be a `for` loop
getgrade = int(input("Enter grade, including the lowest: "))
grades_total += getgrade # don't subtract minimum any more here
gcounter += 1
if getgrade < lowest_grade: # check for minimum
lowest_grade = getgrade
grade_total -= lowest_grade # subtract mimimum outside the loop
我还强烈建议不要在用户输入上使用eval
,因为该函数允许用户输入然后运行代码的任何有效Python表达式。您可以使用int
将字符串转换为整数,通常,您只需要它就可以了。如果您确实需要一次解析更复杂的数据结构(如列表或元组),请使用标准库中的ast.literal_eval
。
答案 1 :(得分:0)
首先,使用ast.literal_eval
代替eval
,因为eval
会带来安全风险。
关于您的错误,您的错误来自以下几行:
getgrade = eval(input("Enter grade, including the lowest: "))
lowest = min(getgrade)
min
函数takes an iterable as input。如果getgrade
是整数或不是可迭代的,例如tuple
,list
,set
,每次到达此行时都会出现错误。
您可以通过逐个询问每个成绩并形成列表来纠正此问题,或者让用户输入一个列表,例如"[55, 65, 70, 82]"
。这将对整个脚本产生连锁效应,因此您应该从一开始就决定如何处理数据类型。