`
yuanta11
  • 浏览: 60786 次
  • 性别: Icon_minigender_1
  • 来自: 淄博
社区版块
存档分类
最新评论

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 = [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
分享到:
评论

相关推荐

    Python学习笔记之变量、自定义函数用法示例

    本文实例讲述了Python变量、自定义函数用法。分享给大家供大家参考,具体如下: 不管你学什么编程语言 都逃不出如下套路: 1、怎么定义变量?是否有数据类型,怎么在控制台输出? 2、怎么定义函数?定义类?面向...

    老男孩第三期Python全栈开发视频教程 零基础系统学习Python开发视频+资料

    (5)\\python全栈day41-50\\python全栈s3 day41;目录中文件数:10个 ├─(1) 01 python s3 day41 JS的历史以及引入方式.avi ├─(2) 02 python s3 day41 JS的基础规范.avi ├─(3) 03 python s3 day41 JS的基本数据...

    python函数考试题库.docx

    《自定义数字》 python函数考试题库全文共3页,当前为第1页。 python函数考试题库全文共3页,当前为第1页。 简答题 1. 函数定义包含哪几个部分? 2. 函数定义使用什么关键字? 3. 函数返回数据使用哪个关键字? 4. ...

    python教程学习路线学习教程

    PYTHON学习教程 第1章初识Python 1.1Python 介绍 1.2Python IDE 开发工具 1.3Python 变量及基本类型 ...第7章Python Web 7.1Python Web 介绍 7.2使用Flask 框架搭建Web 项目 7.3Flask 框架路由 7.4Flask 框架模板

    Python第一阶段笔记汇总.docx

    第一章Python基本 6 一Python 简介 6 (一) Python 定义 6 (二) Python程序的执行方式 7 (三)Linux常用命令 7 (四)执行过程 8 (五)解释器类型 8 (六)调试 9 二 数据基本运算 9 (一)pycharm常用快捷键(编译器...

    python入门到高级全栈工程师培训 第3期 附课件代码

    第7章 01 ip地址与子网划分 02 ip地址配置 03 虚拟机网络模式 04 三层隔离验证试验 第8章 01 上节课复习 02 软件包介绍 03 rpm软件包管理 04 yum软件包管理 05 源码安装python3.5 06 ssh服务 07 apache服务 08 ...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    ├─千锋Python教程:第06章 函数与高阶函数(7集)) │ │ .DS_Store │ │ │ ├─code │ │ 10、函数也是一种数据.py │ │ 11、匿名函数.py │ │ 12、map&reduce;.py │ │ 13、filter.py │ │ 14、sorted....

    Python3入门指南_v2.4.pdf

    8.6 Python第三方库(模块)下载 128 九、文件IO编程 130 9.1 Python文件操作函数介绍 130 9.2 操作文件的一般顺序 130 9.3 Python内置的open函数 131 9.4 操作文件常用的方法 133 9.5 调用操作系统提供的接口函数操作...

    基于机器学习贝叶斯算法实现垃圾邮件分类python源码+项目说明+数据集.zip

    如果你使用第一条命令来进行训练和测试,那么你将会得到三个模型测试后的正确率、错误邮件个数,以及三个模型对应的识别错误的邮件分布情况,如下所示: ![正确率](README.assets/正确率.png) ![错误邮件个数]...

    《Python入门经典以解决计算问题为导向的Python编程实践》.((美)William F).[PDF]@ckook.pdf

    第7章深入了解函数 第8章字典和集合 第9章文件 第10章程序开发进阶 第四部分类:自定义数据结构和算法 第11章类 第12章类进阶 第13章使用类开发程序 第五部分成为更好的程序员 第14章异常和异常处理 第15...

    《python编程金典》高清扫描版PDF

    第7章 基于对象的编程 第8章 自定义类 第9章 面向对象编程:继承 第10章 图形用户界面组件(一) 第11章 图形用户界面组件(二) 第12章 异常处理 …… 附录A Python开发环境 附录B Python 2.2的...

    电子学会2021年3月Python1234级真题(4套试卷)

    五、 掌握自定义函数及调用,实现基本算法中的递归方法。 六、 掌握基本算法中由递归变递推的方法。 七、 理解基本算法中的分治算法,能够用分治算法实现简单的 Python程序。 八、 掌握第三方库(模块)的功能、获取...

    python cookbook(第3版)

    第七章:函数 7.1 可接受任意数量参数的函数 7.2 只接受关键字参数的函数 7.3 给函数参数增加元信息 7.4 返回多个值的函数 7.5 定义有默认参数的函数 7.6 定义匿名或内联函数 7.7 匿名函数捕获变量值 7.8 ...

    老男孩python 四期

    第七天 1、项目实战六、编写类Nagios监控软件框架 2、编写监控服务器server 端 3、实现自动监控、自动报警 4、编写监控客户端 5、可监控自定义进程 6、使用Python SNMP模块获取并处理服务器信息 7、使用Paramiko模块...

    2021年12月青少年软件编程Python真题(5套) 1级;2级;3级;4级;5级

    五、 掌握自定义函数及调用,实现基本算法中的递归方法。 六、 掌握基本算法中由递归变递推的方法。 七、 理解基本算法中的分治算法,能够用分治算法实现简单的 Python程序。 八、 掌握第三方库(模块)的功能、获取...

    Python Cookbook

    第7章 持久化和数据库 273 引言 273 7.1 使用marshal模块序列化数据 275 7.2 使用pickle和cPickle模块序列化数据 277 7.3 在Pickling的时候压缩 280 7.4 对类和实例使用cPickle模块 281 7.5 Pickling被绑定...

    python文档字符串(函数使用说明)使用详解

    1.效果图: 2.代码: # 文档字符串( doc str) 是 函数使用说明 # 用法: 在函数第一行写一个字符串 def fn(*nums): ''' 函数的作用: 计算任意数值的总和 函数的参数: *nums 会接受...查询自定义函数用法 查询

    Python3程序开发指南(第二版).pdf

    第2章~第5章介绍了Python的过程型程序设计功能,包括基本数据类型与集合数据类型、很多有用的内置函数与控制结构,以及比较简单的文本文件处理功能。第5章展示了如何创建自定义模块与包,并提供了Python标准库概览...

    Python 中文手册

    4.7. 深入 Python 函数定义 4.7.1. 默认参数值 4.7.2. 关键字参数 4.7.3. 可变参数列表 4.7.4. 参数列表的分拆 4.7.5. Lambda 形式 4.7.6. 文档字符串 4.8. 插曲:编码风格 5. 数据结构 5.1. 关于列表更多的内容 ...

    PYTHON小白求助,关于使用函数归递法进行列表的二分法

    我的想法是函数中有两个变量,第一个是需要查找的数字,第二个是列表。 当用户输入数字时,函数执行结果是这个数字在列表中的索引。 a = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69, 107] ...

Global site tag (gtag.js) - Google Analytics