设为首页 收藏本站
查看: 1273|回复: 0

[经验分享] Python第七课-自定义函数(方法)进行处理数据

[复制链接]

尚未签到

发表于 2017-5-3 12:30:21 | 显示全部楼层 |阅读模式
原书这一章思路太狗屎了,堆叠各种语法和内置方法,思路混乱
所自己找点乐子,以介绍函数(方法)为中心,写一点字符串、列表处理的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 = [sanitize(each_time) for each_time in data_list] #使用列表推导来取代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[0:3])

调用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[0:3])

再打印来看看:
get_top3(times)
结果:
['2.01', '2.22', '2.34']

最终版本get_top3函数
python中还有一个数据类型——集合。集合跟列表不同点在于集合是无需的,集合内的元素是不能重复的,如果重复,将自动忽略。
所以利用集合的“元素不可重复”的特性来改进一下上边的代码:

def get_top3(times_list):
stimes = set(times_list)  #将未排序的列表转换为集合,集合中的重复元素会自动忽略,注意要先转换为集合再排序!为什么?因为集合没有[0:3]这样的分片方法!因为sorted函数返回值为列表!
sorted_times = sorted(stimes)
return(sorted_times[0:3])

完成任务!
碎碎念:
1、函数是咋个回事儿?
    就是处理问题的方法,如本科中用来从文件中取出列表的get_times函数,和个格式化用来表示时间的字符串的sanitize函数。
    是代码重用的典范。
2、sort和sorted函数:
    其实一句话就能说明白:sort方法用来在原列表中排序,sorted把原列表的元素排序后生成一个新列表用来存储排序后的元素。
    sort和sorted函数默认按升序排序,如果要按降序排序的话需要reverse这个参数为True

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372592-1-1.html 上篇帖子: Python复制文件的实际操作方案与代码详解 下篇帖子: python学习笔记二-----手机环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表