我无法在Python中正确定义函数。谁能告诉我哪里出错了?

时间:2015-04-15 21:35:34

标签: python function

指示是: 编写一个名为calc_average的函数,它接受一个表示以下格式的文件名的字符串,例如:

Smith 82
Jones 75
Washington 91

该函数应计算并返回文件中数据的类平均值。

到目前为止,我有:

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0

我试图通过这部分,但我找不到正确的方法来做平均值。有什么建议?我只需要这个功能,文件只是一个例子。

7 个答案:

答案 0 :(得分:2)

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0

毕竟,你只是在函数中输入一些东西,但不要求任何东西出来。

使用return将有助于从功能中获取一些东西。

return [variable]是一种使用它的方式。

下面:

添加此行 return [variable]到代码的末尾,如下所示:

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0
    return variable #where you replace variable with 
                    #the thing you want to get out of your function

要调用此函数(或者我应该说“运行”它)只需写出它的名称,但是缩进。

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0
    return variable
calc_average() #<- this calls the function

您可能还想阅读参数

parametere是传递给函数并被使用的值。

示例:

def test1(number):
    number = number + 1 #this can be written as number += 1 as well
    return number
x = test1(5)

首先,我使用number参数定义函数。这意味着number将用于此功能。请注意def test1(number)下方的行也如何使用变量number。传递给函数的任何内容number都将被视为函数中的number

然后,我调用该函数并使用5作为参数。

当它被调用时,该函数接受5(因为那是输入参数)并将变量number存储为5.(来自def test1(number))因此,它就像写{{ 1}}在函数本身。

然后,number = 5将获取该数字(在这种情况下被添加为6,return number)并将其返回到外部代码。因此,就像说number = 6

现在回到最底层的几行。 return 6将使x = 6,因为函数返回6。

希望我能帮助你更多地理解功能。

答案 1 :(得分:0)

该函数需要一个参数。它还需要返回平均值,因此最后应该有一个return语句。

def calc_average(file_name):
    ...
    return <something>

答案 2 :(得分:0)

你没有计算平均值。也没有从函数calc_average返回任何内容。所以试试这个

def calc_average():
    with open('filename.txt') as text:
        nums = [int(i.split()[1]) for i in text]
        avg = float(sum(nums)) / float(len(nums))
        return avg
>>>print(calc_average())
82.6666666667

答案 3 :(得分:0)

要继续使用您自己的代码和示例,您可以这样做:

def calc_average(filename):
    infile = open(filename, "r")
    readlines = infile.readlines()
    average = 0 # use this to sum all grades
    index = 0 # keep track of how many records or lines in our txt
    for line in readlines:
        parts = line.split()
        name = parts[0] # basically useless
        # for each line in txt we sum all grades
        average = average + float(parts[1]) # need to convert this string to a float
        index = index + 1
    # divide by the number of entries in your txt file to get the class average
    return average / index

然后:

calc_average('grades.txt')

打印:

82.66666666666667

答案 4 :(得分:0)

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    clsavg = 0
    counter = 0
    for line in readlines:
        parts = line.split()
        clsavg =  clsavg+ float(parts[1])
        counter = counter + 1
    print clsavg/counter

答案 5 :(得分:0)

好的,让我们来看看这部分:

  

编写一个名为calc_average的函数

def calc_average():
  

采用表示文件名的字符串

让它成为一个有意义的变量名称:

def calc_average(filename):

现在我们已经掌握了基础知识,让我们谈谈如何真正解决问题:

文件中的每一行都包含名称和成绩。您希望跟踪成绩,以便计算平均成绩。所以,你需要能够:

  1. 一次读取一行文件
  2. 分割一条线并采取相关部分
  3. 计算相关部分的平均值
  4. 因此,似乎将相关部分保存在列表中会有所帮助。然后我们需要一个计算数字列表平均值的函数。所以让我们写下

    def average(L):
        sum = 0
        for num in L:
            sum += num
        return sum/len(L)
    

    当然,有一种更简单的方式来写这个:

    def average(L):
        return sum(L)/len(L)  # python has a built-in sum function to compute the sum of a list
    

    现在我们有了计算平均值的函数,让我们读取文件并创建一个我们想要计算其平均值的数字列表:

    def read_from_file(filename):
        answer = []  # a list of all the numbers in the file
        with open(filename) as infile:  # open the file to read
            for line in infile:
                parts = line.split()
                grade = int(parts[-1])  # the integer value of the last entity in that line
                answer.append(grade)
        return answer
    

    既然我们有一个从文件中返回相关信息的函数,以及一个计算平均值的函数,我们只需要将两者结合使用:

    def calc_average(filename):
        numbers = read_from_file(filename)
        answer = average(numbers)
        return answer
    

    现在,您可能会注意到您不需要跟踪每个数字,因为您只是将它们相加并除以数字的数量。因此,这可以更简洁地完成如下:

    def calc_average(filename):
        nums = 0
        total = 0
        with open(filename) as infile:
            for line in infile:
                total += int(line.split()[-1])
                nums += 1
        return total/nums
    

答案 6 :(得分:0)

你做错的第一件事就是不在你的帖子中标记源代码,作为源代码。将它放在与帖子其余部分分开的行中,并使用编辑器顶部的{}链接将其标记为源代码。那应该是这样的:

def calc_average(): 
  infile = open("filename.txt", "r") 
  readlines = infile.readlines() 
  for line in readlines: 
    parts = line.split() 
    name = parts[0] 
    clsavg = parts[1] 
    average = 0

你应该对文件内容做同样的事情:我假设你每行有一个名字和一个数字。

如果您想将一小段代码与文字内联,例如&#34; foo()函数&#34;,在代码的每一侧都添加一个反引号。反引号就像一个重音坟墓,有时被错误地用作文本文件中的开头引号。

接下来,您要编写一个包含文件名的字符串的函数。但你有

def calc_average(): 
  infile = open("filename.txt", "r") 

这不会带走任何东西。 <怎么样

def calc_average(filename): 
  infile = open(filename, "r") 

现在,你的函数正在做的是,读取行确定,将它们分成名称和数字 - 但两者仍然是字符串,包含数字的字符串放在变量clsavg中,然后在每次读取一行时将变量average设置为0。

但是你想做什么?我想当你说&#34;班级平均&#34;,这些都是班上的人,数字是他们的分数,你想计算数字的平均值?这意味着将所有数字相加,然后除以文件中的行数。

因此,您需要在循环开始之前将变量设置为0 ONCE,然后在每次读取一行时,将其增加数字值。我想可以使用clsavg变量。所以你需要将parts[1]转换为整数。您可以使用int()。然后,您需要使用+=x = x + y之类的语句来增加它。如果您想了解更多详情,请询问谷歌。这样你就可以建立所有数字的总价值。最后,在循环结束后(意味着只在缩进到for的行上),您需要将总数除以行数。那将是readlines中元素的数量。你应该谷歌len()功能。 Division使用/运算符。您可以使用x /= y将x设置为x / y的值。

这做了很多假设:你想要一个整数平均值,文件中的每一行都有名字和数字(没有空白行或注释等)顺便说一句,你可以使用{{1如果你想要更高的精度,而不是float()