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))
好了,让我们打印一下get_times函数返回的结果:
print(get_times('james.txt'))
返回的结果是
['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22']
这时间格式太乱了!我们需要统一格式,以便排序使用。
第二个版本的get_times函数
改造get_times函数:
1、首先需要一个sanitize函数来对每个time字符串格式化成统一格式:
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) #函数返回经过处理后的数据(没处理的并没被忽略)上边那行已经返回了
2、改进get_times函数:
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))
3、打印get_times的返回值看看:
print(get_times('james.txt'))
结果是:
['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22']
最终版本的get_times函数
虽然上边的代码已经可以正常执行了,但是“列表推导”这个语法糖能给get_times函数的代码带来更多便捷。
见识一下:
def get_times(file_name):
#times = []因为times在下边定义,所以把这里注释掉
try:
with open(file_name) as fdata:
data = fdata.readline()
data_list = data.strip().split(',')
times = #使用列表推导来取代for迭代中列表的append方法
return(times)
except IOError as ioerr:
print('IO Error: ' + str(ioerr))
OK!第一步完成
二、创建 get_top3 函数
第一个版本get_top3函数
def get_top3(times_list):
sorted_times = sorted(times_list) #关于sort和sorted函数的介绍,见文章最下方“碎碎念”
return(sorted_times)
调用get_top3看看:
times = get_times('james.txt')
get_top3(times)
结果:
['2.01', '2.01', '2.22']
times中有重复的记录,需要在get_top3中把重复的值处理掉
第二个版本get_top3函数
改进get_top3函数:
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)
再打印来看看:
get_top3(times)
结果:
['2.01', '2.22', '2.34']
最终版本get_top3函数
python中还有一个数据类型——集合。集合跟列表不同点在于集合是无需的,集合内的元素是不能重复的,如果重复,将自动忽略。
所以利用集合的“元素不可重复”的特性来改进一下上边的代码:
def get_top3(times_list):
stimes = set(times_list)#将未排序的列表转换为集合,集合中的重复元素会自动忽略,注意要先转换为集合再排序!为什么?因为集合没有这样的分片方法!因为sorted函数返回值为列表!
sorted_times = sorted(stimes)
return(sorted_times)
完成任务!
碎碎念:
1、函数是咋个回事儿?
就是处理问题的方法,如本科中用来从文件中取出列表的get_times函数,和个格式化用来表示时间的字符串的sanitize函数。
是代码重用的典范。
2、sort和sorted函数:
其实一句话就能说明白:sort方法用来在原列表中排序,sorted把原列表的元素排序后生成一个新列表用来存储排序后的元素。
sort和sorted函数默认按升序排序,如果要按降序排序的话需要reverse这个参数为True
页:
[1]