2017-03-28 37 views
0

我試圖寫兩個功能的信息。一個生成1到100之間的隨機數,參數是將信息保存到文件的數字的頻率,另一個讀取此文件並顯示:總和,平均值,最高值和最低值。我設法得到第一個功能,但secound功能沒有。運行程序時,我得到了類型錯誤:「詮釋」對象不是可迭代由於「數= INT(數字)」行中readNumbers()函數,這一點我不明白,因爲我認爲數量已經改變從一個字符串到一個整數,以便方程運行。任何幫助,將不勝感激。還有一種找到最大值和最小值而不使用max()和min()的方法,我個人想知道。Python函數來顯示數據

def generateNumbers(i): 
    myFile=open("numbers.txt","w") 

    for n in range(i): 
     import random 
     numbers=random.randint(1,100) 
     numbers=str(numbers) 
     myFile.write(numbers)  
    myFile.close() 

generateNumbers(400) 

def readNumbers(): 
    myFile=open("numbers.txt","r") 

    for number in myFile: 
     number=int(number) 
     total=(sum(number)) 
     average=sum/float(len(number))  

    while number!=-1: 
     num_list.append(number) 
     high= max(num_list) 
     low= min(num_list) 

    print(total,average,high,low) 

    myFile.close() 

readNumbers() 
+1

的錯誤不是在該行。它在下一個。您正在嘗試*一個*號碼的總和。這是沒有意義的。 – kindall

+0

另外'LEN()'不能在''在下一線施加。 –

回答

0

你的程序有幾個問題。

寫的數字:

你不分離,無論如何號碼,這樣你的文件將包含一個數字很長的字符串(和雞蛋裏挑骨頭,你numbers實際上是random_number

,如果你f.ex myFile.write("\n")myFile.write(random_number)後每個數字 將由換行分離。

現在,因爲新行分隔數字,你的閱讀將工作,除了你應該閱讀到一個數組,然後做總平均。

即:

num_list = [] 
for number in myFile: 
    if number != "\n": # there is an empty line at the end 
     num_list.append(int(number)) 

total = sum(num_list) 
average = total/len(num_list) 
high = max(num_list) 
low = min(num_list) 

請注意,您不需要while循環

你也可以做Python的列表理解閱讀,並與上下文管理器會自動關閉該文件

with open("numbers.txt", "r") as f: 
    num_list = [int(number) for number in f if number != "\n"] 

(爲避免空行在結束時出錯)

0

Kindal是對的。

你應該這樣做:

sum = 0; 
count = 0; 
for number in myFile: 
    sum += number 
    count += 1 
average = sum /count 

此外,我認爲你可以優化一點你的代碼。閱讀文件並創建一個列表,然後您可以輕鬆計算總和,平均值,最小值,最大值。

with open("my filename.txt", 'r') as myFile: 
    number_list = list() 
    for number in myFile: 
     number = int(number) 
     if number != -1: #Is it necessary for you? 
      number_list.append(number) 
sum = sum(number_list) 
average = sum/len(number_list) 
min_val = min(number_list) 
max_val = max(number_list)