【问题标题】:Python Using a For loop inside a functionPython 在函数中使用 For 循环
【发布时间】:2014-06-19 19:09:30
【问题描述】:

我是一名 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])

【问题讨论】:

  • 您遇到了什么实际错误或问题?
  • 您可能对if 语句上的elif clause 感兴趣,您可以使用它来避免过度嵌套的if/elses。
  • 我还看到了一些可能的问题,这些问题可能只是 SO 上的错误缩进。确保您想要在循环内的所有内容实际上都在循环内。还要确保你的变量在你尝试使用它们之前已经初始化......
  • 我可以立即看到许多问题。对于初学者,当curraverage 尚未定义时,您正试图循环遍历range(curraverage)

标签: python for-loop range function


【解决方案1】:

来了一段艰难的爱情。

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

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

在下一行中,“test”是未定义的。你的意思是“test3”。如果你想学习编程,你就不能让自己犯这些错误。

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

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

线路等级[count] 没有任何作用。您需要调用grade.append 来构建成绩列表。但由于您尚未计算成绩,因此此处不属于此类行。

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

然后你从循环内部返回,导致函数在你计算一个以上的成绩之前退出。这些回报都不应该在那里。

我可以继续。你需要对你正在做的事情更加小心。请记住,计算机非常愚蠢——它们完全按照他们的指示去做,不管你是否希望它们这样做。

祝你好运。

【讨论】:

  • 感谢 Paul 的建议,直到我发布我的问题后,我才意识到我的程序写得多么糟糕。我修复了大部分问题,例如拼写错误和缩进,但是现在我阅读了您的评论,现在我可以更好地了解为什么我的程序仍然无法运行,感谢您的反馈,谢谢
【解决方案2】:

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

  • 我们将代码拆分为函数;每个函数都做一件特定的事情。这使得代码更容易思考、测试、调试和重用。

  • 每个函数都有一个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2020-06-03
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多