2013-05-10 77 views
2

我目前正在通過一個包含定義函數的練習來工作,並且我已經遇到了將所有支持函數放到主函數中的障礙。將支持函數放入主函數

下面是代碼最初是什麼樣子..

fn = input('Enter filename: ') 
f = open(fn) 
f.readline() # Skip the first two lines 
f.readline() 
line = f.readline() # Line containing site info 
stuff = line.split(',') 
print('\nSite: {}.\n(lat, long) = ({}, {})'.format(stuff[0], stuff[3], stuff[4])) 

# Now process body of file, accumulating monthly rainfalls. 

f.readline() 
f.readline() 
f.readline() 
f.readline() 
f.readline() 
f.readline() 

line = f.readline() 
stuff = line.split(',') 
rfs = 12 * [0] # Rainfall totals for months 
while len(stuff) > 1: 
    date = stuff[1] 
    m = int(date[4:6]) # Month 
    rainfall = float(stuff[2]) 
    rfs[m - 1] += rainfall 
    line = f.readline() 
    stuff = line.split(',') 

# Print results 

months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] 
print('\nMonth Rainfall') 
for i in range(12): 
    print(' {} {:6.1f}'.format(months[i], rfs[i])) 

print('\nTotal rainfall = {:.1f}'.format(sum(rfs))) 
f.close() 

此打印出..

Enter filename: 
Site: Christchurch Aero. 
(lat, long) = (-43.493, 172.537) 

Month Rainfall 
Jan 58.0 
Feb 35.4 
Mar 54.2 
Apr 50.8 
May 52.6 
Jun 41.0 
Jul 29.4 
Aug 62.6 
Sep 21.4 
Oct 90.8 
Nov 63.6 
Dec 60.8 

Total rainfall = 620.6 

我試過現在拆分此代碼放到單獨的功能,但每當我去跑它只是凍結的代碼,我不確定潛在的問題是什麼。這裏是我有..

def main(): 
    '''Main function, opens the text file, reads and then prints the 
    relevant info''' 
    file_input = input('Enter filename: ') 
    file = open(file_input) 

    file.readline() 
    file.readline() 

    site_line = file.readline() # Line containing site info 
    site_info = site_line.split(',') 
    print('\nSite: {}.\n(lat, long) = ({}, {})'. 
      format(site_info[0], site_info[3], site_info[4])) 

    rfs = rainfall_function(file) 

    print_rainfall(rfs) 

def rainfall_function(file): 
    '''Read text file for the required data and process the information''' 
    file.readline() 
    file.readline() 
    file.readline() 
    file.readline() 
    file.readline() 
    file.readline() 

    rain_line = file.readline() 
    rain_info = rain_line.split(',') 
    rfs = 12 * [0] # Rainfall totals for months 
    while len(rain_info) > 1: 
     date = rain_info[1] 
     month = int(date[4:6]) # Month 
     rainfall = float(rain_info[2]) 
     rfs[month - 1] += rainfall 
    return rfs 


def print_rainfall(rfs): 
    '''Months to print rainfall statistics for''' 
    months = ['Jan', 'Feb', 'Mar', 'Apr', ' May', 'Jun', 
       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
    print('\nMonth Rainfall') 

    for i in range(12): 
     print(' {} {:6.1f}'.format(months[i], rfs[i])) 

    print('\nTotal rainfall = {:.1f}'.format(sum(rfs)))  

main() 

我欣賞的幫助!

回答

5

我還沒有試過運行你的代碼,但是有一個明顯的無限循環:

while len(rain_info) > 1: 
     date = rain_info[1] 
     month = int(date[4:6]) # Month 
     rainfall = float(rain_info[2]) 
     rfs[month - 1] += rainfall 

只要len(rain_info) > 1但沒有內循環改變的rain_info長度。這將循環。所以,如果這個循環已經進入,它將永遠不會再離開。

通常插入print()語句來查看您的代碼正在做什麼。如果您在此循環之前和之後進行了打印,您會看到打印前的內容,而看不到後面的內容。如果你在循環中有一個打印,你會看到它重複。

單步執行代碼也很有用。有幾種可用於Python的調試器;我用過的那個是Wingware IDE中的一個。有一個爲學生免費版本。

編輯:看看你的原始代碼,我明白了爲什麼它沒有無限循環。它包括這些行:

while len(stuff) > 1: 
    # ...lines omitted... 
    line = f.readline() 
    stuff = line.split(',') 

所以每個迴路運行時,它試圖讀取另一個輸入線,然後將其分解得到的線。由於原始while循環取決於len(stuff),因此循環內的代碼可能會終止循環。

+0

是的,事實證明,我只是斬斷了部分代碼。非常基本的錯誤,歡呼指出>< – Ergo 2013-05-10 02:48:48