簡體   English   中英

我無法在Python中正確定義一個函數。 誰能告訴我我要去哪里錯了?

[英]I can't properly define a function in Python. Can anyone tell me where I am going wrong?

這些說明是:編寫一個名為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

我已經嘗試過了這一部分,但是我找不到正確的方法來進行平均。 有什么建議么? 我只需要功能,文件只是一個例子。

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

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) )。因此,這就像在函數本身中寫入number = 5一樣。

然后, return number將采用該數字(在這種情況下,該return number將添加為6, number = 6 )並將其返回給外部代碼。 因此,這就像說return 6

現在回到最下面的幾行。 x = test1(5)將使x = 6,因為該函數返回了6。

希望我能幫助您更多地了解功能。

該函數需要一個參數。 它還需要返回平均值,因此最后應該有一個return語句。

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

您沒有計算calc_average沒有從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

然后:

calc_average('grades.txt')

印刷品:

82.66666666666667
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

好吧,讓我們逐部分看一下:

編寫一個名為calc_average的函數

def calc_average():

需要一個代表文件名的字符串

讓我們將其命名為有意義的變量:

def calc_average(filename):

現在我們已經掌握了基礎知識,下面讓我們討論如何真正解決您的問題:

文件中的每一行都包含一個名稱和一個成績。 您想跟蹤成績,以便可以計算出平均成績。 因此,您需要能夠:

  1. 一次只讀取一行文件
  2. 分割一條線並采取相關的部分
  3. 計算相關部分的平均值

因此,將相關部分放在列表中似乎會有所幫助。 然后,我們將需要一個函數來計算數字列表的平均值。 所以讓我們寫

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

您應該對文件內容執行相同的操作:我假設您每行有一個名稱和一個數字。

如果要在文本中插入一小段代碼,例如“ foo()函數”,請在代碼的兩邊都加反引號。 反引號就像一個帶有重音符號的墳墓,有時在文本文件中被非常錯誤地用作開頭引號字符。

接下來,您將編寫一個函數,該函數采用包含文件名的字符串。 但是你有

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

那沒什么。 怎么樣

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

現在,您的函數正在執行的操作是,先讀取行,將其拆分為名稱和數字,但兩者仍然是字符串,並將包含數字的字符串放入變量clsavg ,然后只需設置變量average每次讀取一行時都設為0。

但是你想做什么? 我認為當您說“全班平均”時,這些人都是全班同學,數字是他們的分數,您想計算數字的平均值嗎? 因此,這意味着將所有數字相加,然后除以文件中的行數。

因此,您需要在循環開始之前將變量設置為0 ONCE,然后在每次讀取一行時,將其遞增數字值。 我可以想象使用clsavg變量。 因此,您需要將parts[1]轉換為整數。 您可以使用int() 然后您需要使用+=x = x + y類的語句來增加它。 向Google詢問是否需要更多詳細信息。 這樣,您就可以建立所有數字的總價值。 最后,循環完成后(意味着在僅縮進for ),您需要將總數除以行數。 那就是readlines中元素的數量。 您應該用google的len()函數。 除法使用/運算符。 您可以使用x /= y將x設置為x / y的值。

這有很多假設:您想要一個整數平均值,文件中的每一行都有名稱和數字(沒有空行或注釋等)。順便說一下,如果您要使用float()而不是int()想要更高的精度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM