2013-05-10 78 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