我能';在Python中不能正确定义函数。谁能告诉我哪里出了问题?

我能';在Python中不能正确定义函数。谁能告诉我哪里出了问题?,python,function,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: part

有关指示如下: 编写一个名为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

我已经尝试过这一部分,但我找不到正确的方法来计算平均值。有什么建议吗?我只需要函数,文件只是一个示例。

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

def calc_average(file_name):
    ...
    return <something>
def钙平均值(文件名):
...
返回

您没有计算平均值。也没有从函数
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

要继续使用您自己的代码和示例,您可以执行以下操作:

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
然后:

印刷品:

82.66666666666667
在所有这些之后,您只是在向函数中发送一些内容,而不是要求输出任何内容

使用
return
将有助于从函数中获得一些东西

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

在这里:

添加这一行
将[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
要调用这个函数(或者我应该说“run”它),只需写下它的名称,但要使用dedented

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
首先,我用
number
参数定义函数。这意味着将在此函数中使用
number
。注意
deftest1(number)
下面的行如何使用变量
number
。作为
number
传递到函数中的任何内容都将被视为函数中的
number

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

调用时,函数接受
5
(因为这是输入参数)并将变量
number
存储为5。(来自
deftest1(number)
),因此,这就像在函数本身中写入
number=5

之后,
返回编号
将获取该编号(在本例中,该编号被添加为6,
编号=6
),并将其返回给外部代码。因此,这就像说
返回6

现在回到最后几行
x=test1(5)
将使x=6,因为函数返回6


希望我能帮助您更好地理解函数。

好的,让我们一部分一部分地看一下:

编写一个名为calc_average的函数

它接受表示文件名的字符串

让我们将其设为一个有意义的变量名:

def calc_average(filename):
现在我们已经掌握了基本知识,让我们来谈谈如何实际解决您的问题:

文件中的每一行都包含一个名称和一个等级。你想记录成绩,这样你就可以计算出他们的平均成绩。因此,您需要能够:

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

    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
    

    你做错的第一件事是没有在你的帖子中将源代码标记为源代码。将它放在文章其余部分的单独行中,并使用编辑器顶部的
    {}
    链接将其标记为源代码。然后应该是这样的:

    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
    
    您应该对文件内容执行相同的操作:我假设每行有一个名称和一个数字

    如果要将一段代码与文本内联,例如“the
    foo()
    函数”,请在代码的每一侧打勾。backtick就像一个重音坟墓,有时被错误地用作文本文件中的开头引号字符

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

    def calc_average(): 
      infile = open("filename.txt", "r") 
    
    那不需要任何东西。怎么样

    def calc_average(filename): 
      infile = open(filename, "r") 
    
    现在,您的函数所做的是,读取行ok,将它们拆分为一个名称和一个数字——但这两个仍然是字符串,包含数字的字符串放入变量
    clsavg
    ,然后每次读取一行时将变量
    average
    设置为0

    但是你想做什么呢?我想当你说“班级平均数”时,这些都是一个班级里的人,数字就是他们的分数,你想计算这些数字的平均值吗?这意味着将所有数字相加,然后除以文件中的行数

    因此,在循环开始之前,您需要将一个变量设置为0一次,然后每次读取一行时,将其递增一个数值。我想clsavg变量就是要使用的变量。因此,您需要将
    部分[1]
    转换为整数。您可以使用
    int()
    进行此操作。然后您需要使用
    +=
    或类似
    x=x+y
    的语句将其递增。如果你想了解更多细节,请咨询谷歌。这样,您就可以建立所有数字的总值。最后,循环完成后(意味着在只缩进到的
    的行上),需要将总数除以行数。这将是
    读取行中的元素数。你应该用谷歌搜索
    len()
    函数。分区使用
    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
    
    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
    
    def calc_average(): 
      infile = open("filename.txt", "r") 
    
    def calc_average(filename): 
      infile = open(filename, "r")