本文示例文件已上传至我的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=0step=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. Beta冲刺——用户测试报告

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 用户测试报告 用户 ...

  2. 禅道的bug提交

  3. Python的富比较方法__lt__、__gt__之间的关联关系分析

    Python的富比较方法包括__lt__.__gt__分别表示:小于.大于,对应的操作运算符为:"<".">".那么是否象普通数字运算一样,这两个方 ...

  4. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...

  5. PHP代码审计分段讲解(8)

    20 十六进制与数字比较 源代码为: <?php error_reporting(0); function noother_says_correct($temp) { $flag = 'flag ...

  6. Nmap学习使用指南

    本博客严重参考 Nmap使用指南1.0: https://github.com/scanfsec/penetration/blob/master/Nmap%E4%BD%BF%E7%94%A8%E6%8 ...

  7. 测试点常用用例设计(登录、修改密码、输入框、上传视频、XSS、URL篡改)

    1.无效-视频文件测试点: 视频大小过大 视频大小过小 视频名称过长 视频名称包含特殊字符 视频名称包含中文.中英混合 视频文件格式错误 视频文件重复性上传 2.有效-视频文件测试点: 选择符合要求的 ...

  8. Android10_原理机制系列_Window介绍及WMS的启动过程

    简介 Window简介 Android中,Window是一个重要部分,用户看到的界面.触摸显示界面进行一系列操作都涉及到Window.但实际上,Window本身并不具备绘制功能. 该篇简单介绍下Win ...

  9. mysql 列转行 动态写法

    -- 列转行动态sql -- 测试表DROP TABLE IF EXISTS `tb_score`; CREATE TABLE `tb_score` ( `id` int(11) NOT NULL A ...

  10. 【游记】CSp2020

    同步发表于洛谷博客 初赛 Day -2 做了个模拟(非洛谷),只有一丁点分,显然过不了 (盗张 i am ak f 的图) Day 0 颓,颓,颓,又做了一套模拟,坚定了退役的信心. Day 1 人好 ...