Python在函数内部使用For循环

时间:2014-05-03 01:42:39

标签: python for-loop range function

我是一个Python初学者尝试编写一个程序,允许用户输入个人姓名和测试分数,我应该在找到平均值后给回一个分数到目前为止我已经能够编写程序但是我在尝试调试时遇到了困难。 我的程序工作正常,直到它开始计算平均值,它通常显示一条错误消息说

"TypeError: 'float' object is not subscriptable" 

有人可以帮我解释为什么我的代码无效吗?感谢您的帮助!

def calcaverage(test1,test2,test3):
    for count in range(numofstudent):
        curraverage=((test1[count]+ test2[count]+ test3[count])/3)
        if curraverage>= 90:
            grade= "A"
            return grade 
        else:
            if curraverage >= 80 and curraverage < 90:
                grade= "B"
                return grade
            else:
                if curraverage >= 70 and curraverage < 80:
                    grade= "C"
                    return grade
                else:
                    if curraverage < 70:
                        grade= "F"
                        return grade

numofstudent=int(input("How Many Students?: "))
students=[]
test1=[]
test2=[]
test3=[]
averagescore=[]
grade=[]
for count in range(numofstudent):
    currstudent=input("Please enter name of student: ")
    students.append(currstudent)
    currstudenttest1= float(input("First test score?: "))
    currstudenttest2= float(input("Second test score?: "))
    currstudenttest3= float(input("Third test score?: "))
    test1.append(currstudenttest1)
    test2.append(currstudenttest2)
    test3.append(currstudenttest3)

grade=calcaverage(test1,test2,test3)
averagescore.append(grade)
print([students], "your grade is " ,[grade])

2 个答案:

答案 0 :(得分:2)

这里有一些强烈的爱。

这里有很多问题。一般来说,你需要学会逐行思考你的程序,就像你是CPU一样,并弄清楚你想要在每一步发生什么。然后你需要清除错误,直到实际CPU的功能等于你想要的。

在第二行(for循环)中,变量&#34; curraverage&#34;是未定义的,因为直到几行之后它才被定义。无论如何,这是一个错误的变量;你想要遍历所有学生,所以你需要范围(numofstudent)。

在下一行中,&#34;测试&#34;未定义。你的意思是&#34; test3。&#34;如果你想学习编程,就不能让自己犯这些错误。

变量curraverge看起来像一个错字,但它实际上不是。想想一个更好的名字,这并不难。

在第5行中,averagescore(被声明为全局向下,并且是列表)现在被重新声明为本地并绑定到浮点数。因此,你不能在第6行附加它。第5行应该被丢弃,它除了创建一个bug之外什么都不做。

线路等级[count]没有做任何事情。您需要调用grade.append来构建成绩列表。但是由于你还没有计算出成绩,所以这里没有这样的专栏。

接下来,你将averagescore与90和80等进行比较,但这又是错误的变量。这是您在下面声明的列表。在这里,您需要一名学生的分数(即curraverage)。

然后从循环内部返回,导致函数在计算多个等级之前退出。这些回报都不应该在那里。

我可以继续。你需要对你正在做的事情更加谨慎。请记住,计算机是非常愚蠢的 - 他们完全按照他们所说的去做,不管你是否希望他们做什么。

祝你好运。

答案 1 :(得分:1)

这是一个使用一些更高级的想法的工作示例:

  • 我们将代码拆分为函数;每个函数都一个特定的东西。这使代码更容易思考,测试,调试和重用。

  • 每个函数都有一个 docstring - 内置文档,说明它的作用以及如何使用它,可以使用Python的help()函数进行查看,即help(average)

  • 我们定义了一个Student类,用于存储单个学生的姓名和标记。它知道如何通过提示输入来创建学生,以及如何根据标记计算总体成绩。

  • 使用列表理解输入标记;

    之类的东西
    result = [func(x) for x in lst]
    

    这是一个比较容易理解的

    result = []
    for x in lst:
        result.append(func(x))
    

这是代码;如果你追踪它并理解它,它应该有所帮助:

# assumes Python 3
def get_int(prompt):
    """
    Prompt the user to enter a number;
    return the number as an int
    """
    while True:
        try:
            return int(input(prompt))
        except ValueError:  # couldn't parse as int
            pass   # skip the error message

def average(lst):
    """
    Return the average of a list of numbers
    """
    return sum(lst) / len(lst)

def grade(mark):
    """
    Given a mark as a percentage,
    return a grade letter
    """
    if mark >= 90.:
        return "A"
    elif mark >= 80.:
        return "B"
    elif mark >= 70.:
        return "C"
    else:
        return "F"

class Student:
    @classmethod
    def from_prompt(cls):
        """
        Prompt for a student's information,
        return it as a Student object
        """
        name = input("Please enter student name: ")
        marks = [float(f) for f in input("Please enter {}'s marks: ".format(name)).split()]
        return cls(name, marks)    # implicitly calls __init__

    def __init__(self, name, marks):
        self.name = name
        self.marks = marks

    def grade(self):
        """
        Return the student's overall grade
        """
        return grade(average(self.marks))

def main():
    # get student data
    num_students = get_int("How many students do you want to enter? ")
    print("")
    students = [Student.from_prompt() for _ in range(num_students)]

    # print student grades
    print("")
    for student in students:
        print("{}'s grade is {}".format(student.name, student.grade()))

if __name__=="__main__":
    # if loaded as a program, call the main function
    main()

并像

一样运行
How many students do you want to enter? 4

Please enter student name: Anna
Please enter Anna's marks: 91.0 94.5 96.1
Please enter student name: Ben
Please enter Ben's marks: 82 86 90
Please enter student name: Charlie
Please enter Charlie's marks: 65 75 85
Please enter student name: Farquad
Please enter Farquad's marks: 10 40 55 36 51 16

Anna's grade is A
Ben's grade is B
Charlie's grade is C
Farquad's grade is F