2013-05-09 80 views
0

我想将它分成几个较小的函数,以使它看起来更整洁,更易于阅读,但是每当我尝试这个时,我似乎都无法使它工作。任何帮助,将不胜感激。Python更多功能

目前我的代码看起来像这样

def print_monthly_totals (input_csv_filename): 
    data = open(input_csv_filename).readlines() 
    print('Rainfall totals for each month') 
    for line in data: 
     columns = line.split(',') 
     month = int(columns[0]) 
     num_days = int(columns[1]) 
     total_rainfall = 0 
     for col in columns[2 : 2 + num_days]: 
      total_rainfall += float(col) 

     print('Month {:2}: {:.1f}'.format(month, total_rainfall)) 

我想它看起来更像下面

def print_monthly_totals (input_csv_filename): 
    data = open(input_csv_filename).readlines() 
    print('Rainfall totals for each month') 
def SOMETHING(SOMETHING): #The SOMETHING is just a filler 
    for line in data: 
     columns = line.split(',') 
     month = int(columns[0]) 
     num_days = int(columns[1]) 
     total_rainfall = 0 
def SOMETHING(SOMETHING): #The SOMETHING is just a filler 
     for col in columns[2 : 2 + num_days]: 
      total_rainfall += float(col) 

     print('Month {:2}: {:.1f}'.format(month, total_rainfall)) 
+1

个人而言,我不认为你目前的功能实在是太漫长,但是当你分手了一个功能,它往往是最好的把它分解成单独的任务。你目前的功能达到什么样的任务? – Marius 2013-05-09 02:04:16

+0

使用这个简短的函数可能会更好,在每个部分的开始处添加注释行,以解释这些函数的功能。 – Marius 2013-05-09 02:06:41

+1

这似乎是一个更适合[codereview.se]的问题。 – nneonneo 2013-05-09 02:16:05

回答

1

你可以缩短你的功能这样的:

def print_monthly_totals (input_csv_filename): 
    data = open(input_csv_filename).readlines() 
    print('Rainfall totals for each month') 
    for line in data: 
     columns = line.split(',') 
     month, num_days = int(columns[0]), int(columns[1]) 
     daily_rainfalls = [float(x) for x in columns[2:2+num_days]] 
     total_rainfall = sum(daily_rainfalls) 

     print('Month {:2}: {:.1f}'.format(month, total_rainfall)) 

或最多把它分成两个功能是这样的:

def line_to_rainfall(line): 
    cols = line.split(",") 
    month, num_days = int(cols[0]), int(cols[1]) 
    daily_rainfalls = [float(x) for x in cols[2:2+num_days]] 
    return month, daily_rainfalls 


def print_monthly_totals (input_csv_filename): 
    data = open(input_csv_filename).readlines() 
    print('Rainfall totals for each month') 
    for line in data: 
     month, daily_rainfalls = line_to_rainfall(line) 
     total_rainfall = sum(daily_rainfalls) 
     print('Month {:2}: {:.1f}'.format(month, total_rainfall)) 
0

最明智的分裂,我能想到的这个功能分离的例子来自打印逻辑的数据读取逻辑:

def print_monthly_totals (input_csv_filename): 
    months, rainfall_totals = get_rainfall_data(input_csv_filename) 

    print('Rainfall totals for each month') 
    for month, total_rainfall in zip(months, rainfall_totals): 
     print('Month {:2}: {:.1f}'.format(month, total_rainfall)) 

def get_rainfall_data(input_csv_filename): 
    data = open(input_csv_filename) # .readlines() isn't necessary 
    months = [] 
    rainfall_totals = [] 
    for line in data: 
     columns = line.split(',') 
     month = int(columns[0]) 
     months.append(month) 
     num_days = int(columns[1]) 
     total_rainfall = 0 
     for col in columns[2 : 2 + num_days]: 
      total_rainfall += float(col) 
     rainfall_totals.append(total_rainfall) 
    return months, rainfall_totals