(数据科学学习手札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 ...
随机推荐
- java面试复习重点:类的管理及常用工具,教你抓住面试的重点!
java复习: 类的管理及常用工具类 包 写在程序文件的第一行 一个Java 源文件中只能声明一个包, 且声明语句只能作为源文件的第一条指令 导入类能导入非public类,但是不能用因为在其他包缺省的 ...
- Docker 入门介绍
Docker是什么 从发布到现在 docker一直很受关注,在一定程度是改变了软件行业 如果你还不知道 docker 是什么是不是有点out了,接下来我们来介绍docker是什么,解决了什么问题,好处 ...
- 01_Activity生命周期及传递数据
1. Activity的生命周期: 2. Activity启动另一个Activity,并传递数据: package com.example.activitydemo; import android.a ...
- SQL优化之SQL 进阶技巧(下)
上文( SQL优化之SQL 进阶技巧(上) )我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧 一. 使用延迟查询优化 limit [offset], [r ...
- PriorityQueue 优先队列的实现
PriorityQueue 的 implementation PriorityQueue即是优先队列.通俗的说就是体育课的时候老师要求从高到低排序,老师能直接一眼看出谁是最高的在班级里.当这个最高的离 ...
- msql语句
表相关语句: 创表相关 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s ...
- centos7中安装redis出现的问题
重现步骤: 1.解压redis包后 执行make命令.出现一堆东西,其中有gcc:命令未找到. 解决:安装 yum install gcc-c++(需要有网) 2.安装完gcc命令后,再make.出现 ...
- PyQt(Python+Qt)学习随笔:QTableWidgetItem项whatsThis、toolTip、statusTip提示信息访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件的QTableWidgetItem项提示信息包括工具栏提示.状态栏提 ...
- PyQt学习随笔:截获窗口Widget组件的关闭事件
在PyQt中,QWidget类对应基础的窗口组件,如果要在窗口组件关闭时截获关闭事件,提供自己的控制机制,则可以通过在自定义的派生类中重写closeEvent方法. 重写closeEvent方法的语法 ...
- javascript中 fn() 和 return fn() 的区别
在js中用return和不用return,输出结果有的时候傻傻搞不清,之前在网上看到个例子挺经典,不过讲的不清楚,上例子: var i = 0; function fn(){ i++; if ...