Python3关于循环迭代多变量简单算法

时间:2012-10-09 01:08:45

标签: python loops iteration

我要做的是拥有T个测试用例,这是我需要的时间 获得每个测试用例中“n”个学生的平均数,我需要显示每个测试用例的平均得分以及该测试用例中的最高分和学生名称

如果你能告诉我正确的编码方式,并解释为什么必须这样,我会非常感激!我迷路了

我的代码:

t = int(input("enter number of cases: "))
def casing(t):
    for case in range (1, t+1):
        n = int(input("enter number of students: "))
        def studentmarks(n):
            total = 0
            student = "none"
            for computetotal in range(1,n+1):
                student = input("please enter student name: ")
                mark = int(input("please enter mark: ")) 
                total = total+ mark
                highestmark = mark
                if studentmark(n) > mark:
                    highestmark = mark
                    achieve = student
                    return highestmark, acheive
            return total, studentmark()[0], studentmark()[1]
        average = float((studentmarks(n)[0])/ n)
        print("average: ", average, "highest: ",studentmark(n)[1], "student: ", studentmark(n)[2])

2 个答案:

答案 0 :(得分:1)

我认为,如果没有函数声明,理解和调试代码会更简单。除非你正在进行函数式编程(例如,传递函数对象),否则很少有充分的理由使用嵌套函数。在这里你定义了函数,然后立即调用它们,这是毫无意义的。所以这是代码的简化版本:

t = int(input("enter number of cases: "))
for _ in range (t):
    total = 0
    highest_mark = 0
    best_student = "none"

    n = int(input("enter number of students: "))

    for _ in range(n):
        student = input("please enter student name: ")
        mark = int(input("please enter mark: ")) 
        total = total+ mark
        if mark > highestmark:
            highestmark = mark
            beststudent = student

    average = total / n
    print("average: {}, highest: {}, student: {}"
          .format(average, highestmark beststudent))

我还删除了代码正在调用但从未定义的名为studentmark(没有“s”)的函数。我不确定我是否正确地解释了应该做的事情,但我想是的。它当然不会有效。

答案 1 :(得分:1)

这有几个原因不起作用 - 但根本原因似乎是因为你的最高标记是在错误的地方开始的。看起来你以后期望学生的名字和标记是一个元组,这是一个好主意 - 但你实际上从来没有在任何地方制作这个元组。所以,制作一个,并将其称为highest - 它会替换studenthighestmark变量。以None开头,而不是"none"(实际上可能是有效的学生姓名!),所以你已经超越了循环:

total = 0
highest = None

并改变你的“这是高于最高”的逻辑:

if highest is None or mark > highest[1]:
    highest = (name, mark)

读作“如果还没有最高学生,或者这个学生的分数高于当前最高分,那么这个分数最高”。然后你会希望返回:

return total, highest[0], highest[1]

但是,由于您只有少量数据(足以让用户在控制台中输入它是可行的),因此您可以相当简化此逻辑。将特定测试用例的所有数据读入(student, mark)元组列表,然后使用Python的内置函数进行计算:

def studentmarks(n):
    marks = []
    for _ in range(n):
       student = input("please enter student name: ")
       mark = int(input("please enter mark: ")) 
       marks.append(student, mark)
    return marks

# Calculations
marks = studentmarks(5)
print('Average: ', sum(result[1] for result in marks)/len(marks))
print('Highest: ', max(marks, key=lambda s: s[1])

播种:

>>> marks
[('Fred', 4), ('Wilma', 10), ('Barney', 8), ('Wilma', 7), ('Pebbles', 6)]

平均值为7.0,最大值为('Wilma', 10)