Python第七课-自定义函数(方法)进行处理数据
原书这一章思路太狗屎了,堆叠各种语法和内置方法,思路混乱
所自己找点乐子,以介绍函数(方法)为中心,写一点字符串、列表处理的Demo:
目标:提取书中所提供的文本文件中的时间,并且把其中前三个最短时间输出出来。
思路:
一、写一个 get_times 函数(方法)用来提取文本文件中的时间,以列表形式返回数据
二、创建 get_top3 函数(方法)用来对获取的时间列表排序,并且截取前三个最少的时间值返回
三、打印 get_top3 函数返回的列表
一、创建get_times函数:
第一个版本get_times函数
def get_times(file_name): #创建一个名为get_times的函数,参数为file_name times = [] #定义一个空列表,用来存储从文件中取出的一个个代表时间的字符串 try: with open(file_name) as fdata: data = fdata.readline() #由于文件中只有一行数据,所以不需要for来迭代 data_list = data.strip().split(',') #方法串联,从左至右执行 for each_time in data_list: times.append(each_time) return(times) except IOError as ioerr: print('IO Error: ' + str(ioerr))
print(get_times('james.txt'))
['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22']
def sanitize(time): if ':' in time: splitter = ':' (mins, secs) = time.split(splitter) elif '-' in time: splitter = '-' (mins, secs) = time.split(splitter) else: return(time) #如果'.' in time,那么函数什么都不做直接返回time return(mins + '.' + secs) #函数返回经过处理后的数据(没处理的并没被忽略)上边那行已经返回了
def get_times(file_name): times = [] try: with open(file_name) as fdata: data = fdata.readline() data_list = data.strip().split(',') for each_time in data_list: clean_time = sanitize(each_time) #调用sanitize函数以格式化每个time值 times.append(clean_time) return(times) except IOError as ioerr: print('IO Error: ' + str(ioerr))
print(get_times('james.txt'))
['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22']
def get_times(file_name): #times = [] 因为times在下边定义,所以把这里注释掉 try: with open(file_name) as fdata: data = fdata.readline() data_list = data.strip().split(',') times = [sanitize(each_time) for each_time in data_list] #使用列表推导来取代for迭代中列表的append方法 return(times) except IOError as ioerr: print('IO Error: ' + str(ioerr))
def get_top3(times_list):sorted_times = sorted(times_list) #关于sort和sorted函数的介绍,见文章最下方“碎碎念”return(sorted_times[0:3])
times = get_times('james.txt')get_top3(times)
['2.01', '2.01', '2.22']
def get_top3(times_list): sorted_times = sorted(times_list) clean_stimes =[] for each_time in sorted_times: #迭代排序后的每一个列表值 if not each_time in clean_stimes: #判断此值是否已存在于clean_stimes列表中 clean_stimes.append(each_time) return(clean_stimes[0:3])
get_top3(times)
['2.01', '2.22', '2.34']
def get_top3(times_list): stimes = set(times_list) #将未排序的列表转换为集合,集合中的重复元素会自动忽略,注意要先转换为集合再排序!为什么?因为集合没有[0:3]这样的分片方法!因为sorted函数返回值为列表! sorted_times = sorted(stimes) return(sorted_times[0:3])