`
yuanta11
  • 浏览: 61455 次
  • 性别: 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学习笔记--皮大庆.pdf.zip

    2. **函数**:Python中的函数是代码组织的基本单元,可以自定义函数来实现特定功能,了解参数传递、函数返回值以及内置函数(如len()、print())的使用。 3. **列表、元组、字典与集合**:这些是Python的主要数据...

    python-3.7.3-docs-pdf-a4.zip

    - 语法结构:深入解析Python的基本语法,包括变量、数据类型(如整型、浮点型、字符串、列表、元组、字典等)、控制流(如if-else、for、while)、函数定义与调用、模块导入等。 - 类与对象:讲解面向对象编程的...

    python实验报告-函数定义和调用.doc

    首先,实验的目的是让学生熟悉Python中的函数定义语法、调用方法以及函数编程方法。在Python中,我们使用`def`关键字来定义一个函数,后跟函数名和圆括号,圆括号内可以包含函数参数。例如,`drawDigit(d)`函数接受...

    Python库 | python-amazon-sp-api-0.7.2.tar.gz

    Python是当今世界上最受欢迎的编程语言之一,特别是在数据分析、机器学习和Web开发领域。在这个场景中,我们关注的是一个名为"python-amazon-sp-api"的Python库,版本为0.7.2,它被打包成一个名为"python-amazon-sp-...

    2021-python-3.8.8-amd64-安装包.rar

    2. **优化性能**:Python 3.8.8在执行效率上进行了优化,使得代码运行更快,尤其是在处理大量数据时。这得益于编译器的改进和内部算法的优化。 3. **错误修复**:每个版本的更新都会包含对之前版本中已知问题的修复...

    python-3.8.10-amd64.rar

    - "python-3.8.10-amd64.exe"是Python的安装程序,双击运行后,用户可以选择自定义安装路径、是否添加Python到系统环境变量,以及选择安装额外的组件,如IDLE(集成开发环境)和pip(包管理器)。 - 安装过程中,...

    秒懂百科,Python第2课-少儿编程scratch项目源代码文件案例素材.zip

    在本压缩包“秒懂百科,Python第2课-少儿编程scratch项目源代码文件案例素材.zip”中,我们找到了一个名为“2-秒懂百科,Python第2课.sb2”的文件,这是一款针对少儿编程教育的项目源代码,旨在帮助孩子们通过...

    Python自定义函数计算给定日期是该年第几天的方法示例

    ### Python自定义函数计算给定日期是该年第几天的方法 #### 一、背景介绍 在进行日期相关的数据处理时,经常需要将一个具体的日期转换成一年中的第几天。这种转换对于数据分析、时间序列预测等场景非常有用。例如...

    vfp自定义函数集

    7. **汉字编码转换库**:有时候,可能需要编写或引用第三方库,如`iconv`,来进行更复杂的编码转换和字符集兼容性处理。 8. **汉字转换为拼音**:对于某些应用,可能需要将汉字转换为其对应的拼音,这时可以编写...

    python-3.7.7-amd64

    Python 3.7.7支持大量的第三方库,这些库可以通过Python的包管理器`pip`轻松安装。例如,`requests`用于HTTP请求,`numpy`和`pandas`用于科学计算,`Django`和`Flask`用于Web开发。丰富的生态系统使得Python成为多...

    python-3.6.8-amd64.exe

    对于开发者,Python提供了丰富的标准库和第三方库,如NumPy用于数值计算,Pandas用于数据处理,Django和Flask用于Web开发,以及TensorFlow和PyTorch用于机器学习等。 总之,“python-3.6.8-amd64.exe”是一个为64位...

    Python基础教程(crossin全60课)

    - **【Python第33课】处理文件中的数据** - **主要内容**:讲解如何处理文件中的数据。 - **知识点**: - 数据的解析与提取; - 数据清洗与预处理; - 数据存储与持久化。 - **【Python第34课】break** - **...

    python官方3.8.0b3-amd64版本exe安装包

    7. **优化的import机制**:Python 3.8对导入模块的机制进行了优化,提升了性能,特别是在大型项目中的导入速度。 8. **异步上下文管理器**:在3.8中,asyncio库的异步上下文管理器允许使用`async with`语句,使得...

    python官方3.7.2-amd64版本exe安装包

    此外,通过pip,你可以轻松安装和管理Python第三方库,如numpy、pandas、matplotlib等,用于数据处理、科学计算和可视化。 为了更好地利用Python,建议学习Python的基础语法,包括变量、数据类型、控制流、函数、类...

    python基础教程至60课(基础)

    #### Python第33课:处理文件中的数据 - **文件数据处理**:讨论如何对文件中的数据进行分析、过滤等操作。 #### Python第34课:Break - **循环中断**:解释`break`语句的作用,即提前退出循环。 #### Python第...

    python函数实验报告.doc

    - 函数可以接受参数,如`isPrime`函数中的`v`,用于传递值到函数内部进行处理。 - 参数类型可以是整数、字符串等,例如`demo`函数接收一个字符串`v`,统计其中的大写字母、小写字母、数字和其他字符的个数。 3. *...

    python-3.8.2-amd64.rar

    1. **下载安装**:通过运行"python-3.8.2-amd64.exe"启动安装过程,按照提示进行安装,可以选择自定义安装路径和是否将Python添加到系统PATH环境变量中。 2. **验证安装**:安装完成后,打开命令提示符或终端,输入...

    python-3.9.1-amd64.zip

    7. **标准库和第三方库**:熟悉常用的Python标准库,如os、sys、numpy、pandas等,并了解如何利用PyPI(Python Package Index)安装和使用第三方库。 Python 3.9.1的文档资源非常丰富,官网提供详尽的文档和教程,...

    python-3.10.0-amd64.rar

    6. **性能提升**:Python 3.10.0通过编译器优化和其他内部改进,提高了整体性能,尤其是在处理大量数据时。 7. **标准库增强**:许多标准库模块得到了增强和更新,例如`os`、`ssl`、`json`等,提供了更多的功能和更...

Global site tag (gtag.js) - Google Analytics