(数据科学学习手札101)funcy:Python中的函数式编程百宝箱
本文示例文件已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
我们在使用Python
完成日常任务时,经常会遇到一些很小的辅助性的需求,又不想花费时间去搜索是否已有现成的库实现了这些功能,往往则需要自己临时编写一些逻辑或函数。
而事实上已经有勤劳伟大的开发者编写了集成众多小功能于一身的第三方库,本文要给大家介绍的funcy
就是其中非常实用的一个,它汇集了数量惊人的实用函数及装饰器,帮助我们使用Python
更好的践行函数式编程理念。
图1
2 funcy中的实用API
funcy
的设计宗旨就是汇集一系列花哨的实用函数,其在不断地迭代过程中,已经积累下相当多的功能,下面我们就来学习其中代表性的一些。
使用pip install funcy
完成安装后,推荐大家按照如下方式进行导入:
import funcy as fc
- 无限计数器
funcy
中的count()
可以生成一个可指定起点和步长的无限迭代器,默认参数start=0
,step=1
,我们可以用它来替代常规的while
循环+自增变量的逻辑:
for i in fc.count():
print(i, end='\r')
# 当i大于等于1000时停止迭代,否则继续
if i >= 1000:
break
- 展平嵌套数组
funcy
中的flatten()
可以用来展平任意的嵌套数组:
图2
- 在指定数组中插空
funcy
中的interpose()
可以用来将指定元素插入到对应数组的两两元素之间:
图3
- 批量删除满足指定条件的元素
在funcy
中有两种从原始列表中删除指定元素的方法,方式1是使用remove()
来传入条件判断函数来删除满足条件的元素,类似filter()
的方式:
图4
第二种方式是利用funcy
中的without()
,它可以帮我们从原始数组中排除指定的1个或多个元素,譬如下面我们把2、5、7、9排除掉:
图5
- 按照制定条件分组划分原始数组
funcy
中提供了group_by()
函数,帮助我们传入函数,作用于指定数组的每个元素上,并自动按照返回的结果进行分组输出,就像下面的例子那样:
图6
- 等长度拆分数组,丢弃末尾长度不足的部分
funcy
中的partition()
帮助我们对输入的数组做指定长度的切片划分,譬如下面的例子,我们对列表[0, 1, ..., 10]进行长度为3的切片拆分,剩余不足长度3的部分就会被丢弃:
图7
- 等长度拆分数组,并保留长度不足的部分
与partition()
功能相似,funcy
中的chunks()
会在等长度拆分数组的同时,保留末尾长度不足的部分单独输出:
图8
- 输出相邻成对元素二元组
利用funcy
中的pairwise()
,我们可以对输入数组从头开始,将相邻的成对元素以二元组的形式输出:
图9
- 合并多个同类型对象
利用merge()
,我们可以将传入的多个同类型数据结构拼成一个完整的,这在合并集合或字典时尤其受用:
图10
- 阻止函数遇到错误时的常规报错方式
有些情况下我们执行某些函数时,由于某些原因导致报错,但如果我们并不希望遇到错误就中断的话,就需要自己写额外的try...except...
逻辑,而funcy
中的silent()
则可以让这个过程变得很省事:
图11
- 阻止函数遇到指定错误时的常规报错方式
上面介绍的silent()
会帮助传入函数遇到任意错误时返回None,而funcy
中的ignore()
则赋予我们指定错误类型,以及报错时设定返回值的能力:
图12
- 装饰指定函数,使其记忆历史执行记录值
下面要介绍的方法非常的实用,想象一下这样的场景:你书写的某个函数接受输入,然后经过一段耗时不菲的计算过程输出结果,但在函数实际调用过程中经常遇到重复的传入参数。
这种时候你肯定希望自己的函数可以“记忆”下执行过的参数与输出结果,省得大量重复计算,而funcy
中的memoize
装饰器就可以帮助我们快速改造自己的函数:
图13
而函数的缓存记录可查询,可自定义添加,也可以手动清空:
图14
- 以标签:值的方式辅助debug
很多情况下,print()
循环过程变量变化情况的debug
方式虽然很粗糙,但有些时候下却很方便,但在一些诸如列表推导等情况下却不太方便注入print()
代码。
而利用funcy
中的tap()
函数,我们可以将迭代变量传入,并填写对应说明标签,即可快速查看运行过程,tap()
的逻辑其实很简单,相当于把输入值打印一下再原封不动地返回,但既然有现成的API,何乐而不为~
图15
- 约束某个函数的可执行次数
有些情况下,我们希望程序中的某个函数在整个程序的生命周期中只执行一次,譬如创建数据库连接等操作时,而funcy
中提供的装饰器once
就可以帮助我们快速实现这个功能,并且保证了线程安全:
图16
除了以上介绍的这些功能之外,funcy
还拥有其他众多的实用API,你可以进入其官方文档进行查看( https://funcy.readthedocs.io/en/stable/ )。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札101)funcy:Python中的函数式编程百宝箱的更多相关文章
- (数据科学学习手札48)Scala中的函数式编程
一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...
- (数据科学学习手札53)Python中tqdm模块的用法
一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...
- (数据科学学习手札54)Python中retry的简单用法
一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
随机推荐
- 【MySQL/C#/.NET】VS2010报错--“.Net Framework Data Provider。可能没有安装。”
前言 公司行业是金融软件,之前用的都是Oracle数据库.Oracle数据库用一个词来形容:大而全.MySQL的话,可能是因为开源.便宜,现在越来越主流. 我们也支持MySQL数据库,不过平时不用.最 ...
- 性能测试学习之路 (一)认识jmeter(性能测试流程 && 性能测试通过标准 &&jmeter体系结构)
性能测试是通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各项性能指标进行测试. 1 性能测试技能树 性能测试是一项综合性的工作,致力于暴露性能问题,评估系统性能趋势.性能测试工作实质 ...
- 基于.NET的程序读取Excel文件的解决方案
目录 0. 前言 1. 使用NPOI库读取Excel文件 2. 使用OleDbConnection 3. 相关参考 shanzm-2020年12月8日 23:48:11 0. 前言 以前基于 .NET ...
- 一起看下MySQL的崩溃恢复到底是怎么回事
目录 回顾 思考一个问题 checkponit机制 Checkpoint的种类及触发条件 LSN 推荐阅读 本文稍微有点晦涩.但是看过之后你就能Get到MySQL的崩溃恢复到底是怎么做的! 文章公号 ...
- Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?
Java堆内存分为年轻代和老年代,其中,年轻代分为Eden区和survival区,survival又分为fromSurvival和toSurvival. 首先第一个问题:为什么要有Survival区? ...
- uniapp导入导出Excel
众所周知,uniapp作为跨端利器,有诸多限制,其中之一便是vue页面不支持传统网页的dom.bom.blob等对象. 所以,百度上那些所谓的导入导出excel的方法,大部分都用不了,比如xlsx那个 ...
- DVWA各级文件包含漏洞
File Inclusion文件包含漏洞 漏洞分析 程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程被称为包含. 有时候由于网 ...
- 记录一次mac访问Windows共享目录失败
一,起因 起因,有人联系我说他们的mac电脑连接不上Windows的共享目录,Windows的电脑连接正常,没有报错,连接框抖两下就没了 二,排查问题 1,我自己想mstsc登陆服务器看看,结果服务器 ...
- 腾讯健康码16亿亮码背后的Elasticsearch系统调优实践【>>戳文章免费体验Elasticsearch服务30天】
[活动]Elasticsearch Service免费体验馆>>Elasticsearch Service新用户特惠狂欢低至4折>>Elasticsearch Service企 ...
- Tokyo 五年 IT 生活
今天阳光甚好,在家中小屋,闲来无事,回顾一下这五年的历程.我想从来东京的缘由.东京的环境.生活.IT这四个方面介绍一下. 首先,说一下为什么我会来到东京. 电子信息专业毕业,大学实验室学习IT,毕业后 ...