通过降低最低等级的选项计算等级平均的程序修复问题

时间:2018-02-18 22:06:40

标签: python

我需要创建一个计算成绩平均值的程序,并提供降低最低成绩的选项。该计划必须允许用户输入学生人数和每个学生的成绩数。我一直在"' 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()

2 个答案:

答案 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是整数或不是可迭代的,例如tuplelistset,每次到达此行时都会出现错误。

您可以通过逐个询问每个成绩并形成列表来纠正此问题,或者让用户输入一个列表,例如"[55, 65, 70, 82]"。这将对整个脚本产生连锁效应,因此您应该从一开始就决定如何处理数据类型。