本文示例文件已上传至我的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中的函数式编程百宝箱的更多相关文章

  1. (数据科学学习手札48)Scala中的函数式编程

    一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...

  2. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  3. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  4. (数据科学学习手札136)Python中基于joblib实现极简并行计算加速

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...

  5. (数据科学学习手札53)Python中tqdm模块的用法

    一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...

  6. (数据科学学习手札54)Python中retry的简单用法

    一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...

  7. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  8. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  9. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

随机推荐

  1. Integer中的奇妙位运算

    Integer中的奇妙位运算 参考资料 https://segmentfault.com/a/1190000015763941 highestOneBit(int i) 函数的作用是获得传入参数的最高 ...

  2. win10拔下电源会黑一下屏

  3. 安装IAR编译器详解

    1.首先下载好安装包和破解包 我安装使用的版本:IAR for 8051 v9.10 链接: https://pan.baidu.com/s/13x36j5qL90YokrAlyChQhw 提取码: ...

  4. Python中数字按位取反的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Python中有个按位取反运算符:,但这个运算符并不是真正的按位取反,而是效果相当于原值乘以负一再减 ...

  5. 推荐系统实践 0x0c FM系列

    逻辑回归(LR) 在介绍FM系列之前,我想首先简单介绍一下逻辑回归.通常来说,逻辑回归模型能够综合利用更多的信息,如用户.物品.上下文等多种不同的特征,生成更为全面的结果.另外,逻辑回归将推荐问题看成 ...

  6. Jemter环境搭建

    Jemter环境搭建 步骤一:安装Jmeter 1.下载Jmeter,官网地址:http://jmeter.apache.org/download_jmeter.cgi 2.解压Jmeter安装包,J ...

  7. ARL资产导出对接Xray扫描

    使用ARL资产灯塔系统对目标进行资产整理的时候,能够对获取的结果进行导出: 导出之后为excel文件 想要将site中的URL导出为txt文件,再使用Xray高级版进行批量化扫描: https://w ...

  8. linux服务器性能分析只需1分钟

    背景: 现在的互联网公司,大多数时候应用服务都是部署在linux服务器上,那么当你的服务运行过程中出现了一些响应慢,资源瓶颈等疑似性能问题时,给你60秒,如何快速完成初步检测? 肯定有人会说用工具,公 ...

  9. Acwing 734. 能量石

    贪心(微扰) + dp 这道题还是比较难的,前置知识: 贪心的微扰(邻项交换)证法,例题:国王游戏,耍杂技的牛 01背包 算法1:暴力\(O(T * n! * n)\) 可以\(dfs\)全排列枚举所 ...

  10. hadoop技术产生

    一.为什么有大数据 我的理解是: 1)数据量达到了传统数据库的瓶颈 2)数据量的激增 3)硬件成本的降低 [ 技术水平的上升 ] 4)想通过大量的数据发现潜在的商业价值 二.什么是大数据 大数据指的是 ...