[英]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):
現在我們已經掌握了基礎知識,下面讓我們討論如何真正解決您的問題:
文件中的每一行都包含一個名稱和一個成績。 您想跟蹤成績,以便可以計算出平均成績。 因此,您需要能夠:
因此,將相關部分放在列表中似乎會有所幫助。 然后,我們將需要一個函數來計算數字列表的平均值。 所以讓我們寫
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.