(数据科学学习手札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 ...
随机推荐
- 如何利用小熊派获取MPU6050六轴原始数据
摘要:使用小熊派开发板,通过硬件IIC与MPU6050六轴传感器模块通信,完成相应寄存器配置,成功获取陀螺仪.加速度计数据. 本问主要讲述使用小熊派开发板+MPU6050六轴传感器,获取加速度计以及陀 ...
- PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQ ...
- Python中函数的参数带星号是什么意思?
参数带星号表示支持可变不定数量的参数,这种方法叫参数收集. 星号又可以带1个或2个,带1个表示按位置来收集参数,带2个星号表示按关键字来收集参数. 1.带一个星号的参数收集模式: 这种模式是在函数定义 ...
- Python中使用百分号占位符的字符串格式化方法中%s和%r的输出内容有何不同?
Python中使用百分号占位符的字符串格式化方法中%s和%r表示需要显示的数据对应变量x会以str(x)还是repr(x)输出内容展示. 关于str和repr的关系请见: <Python中rep ...
- PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...
- PyQt(Python+Qt)学习随笔:QTableWidget的currentItem、rowCount、columnCount等部件状态属性访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 老猿将QTableWidget表格部件中反映部件当前情况的一些方法归类为部件状态访问方法,包括部件的 ...
- 第12.6节 Python标准库其他内置模块导览
一. 文本处理服务 string模块 : 常见的字符串操作 difflib模块: 计算差异的辅助工具 textwrap模块: 文本自动换行与填充,能够格式化文本段落,以适应给定的屏幕宽度: unico ...
- PyQt(Python+Qt)学习随笔:QTableView的showGrid属性
老猿Python博文目录 老猿Python博客地址 showGrid属性用于控制视图中数据项之间是否显示网格,如果该属性为True,则绘制网格:如果该属性为False,则不绘制网格. showGrid ...
- 读github,deepfm,pytorch源码 记录
代码:https://github.com/chenxijun1029/DeepFM_with_PyTorch 2020/12/2首先是数据预处理文件:dataPreprocess.py1. 源数据集 ...
- [亲测可用]BCompare文件比较对比工具4.3.4绿色版
程序员必备良品 Beyond Compare 灰常好用,一直使用的文本 文件比较工具,用来对比两个文件文本的差异,可以用于各种代码,文本对比 使用方法: 解开压缩后:添加右键的 !添加右键.bat,运 ...