Python之函数式编程:funcy,功能更加齐全的函数式编程库
off999 2024-10-23 12:41 43 浏览 0 评论
引言
通过前面的关于Python中进行函数式编程的系列文章的介绍,我们已经把函数式编程范式中的相关特性,以及Python内置的类、functools模块对函数式编程范式的支持,都介绍了一遍。
今天这篇文章,打算介绍一个支持Python更好地进行函数式编程的三方模块:funcy。
本文的主要内容有:
1、funcy模块的简单介绍
2、funcy中的三大件:map、filter和reduce
3、柯里化和偏函数的支持
4、组合函数的支持
5、funcy中的其他特性
funcy模块的简单介绍
funcy模块是一个用于函数式编程的Python三方模块,该模块提供了絮叨简洁且强大的函数和工具,用于简化函数式编程的开发。
funcy模块旨在使Python编程更具有声明性和功能性,进一步减少代码的冗余,同时提高代码的可读性和可维护性。
安装funcy
funcy模块的安装很简单,直接使用pip进行安装即可:
pip install funcy说明:根据各自不同的环境,可能是pip3,不要机械的复制。
源码地址
https://github.com/Suor/funcy感兴趣的可以自行查阅。
funcy中的三大件:map、filter和reduce
首先看下定义:
从定义中,我们可以看到,funcy模块中的map和filter是函数,但是函数体实现中,还是使用了Python内置的map和filter类。
不同于functools.reduce,funcy中的规约功能,函数名为reductions()。
下面,我们通过代码进行演示、验证:
import funcy as fn
# 测试funcy模块的map函数
square_nums = fn.map(lambda x: x * x, range(10))
print(square_nums)
# funcy模块的map函数的返回值,确实是内置类map的实例化对象
print(isinstance(square_nums, map))
print(list(square_nums))
print('=' * 40)
# 测试filter
odd_nums = fn.filter(lambda x: x % 2 == 1, range(10))
print(odd_nums)
print(isinstance(odd_nums, filter))
print(list(odd_nums))
print('=' * 40)
# 测试reduce
sum_result = fn.reductions(lambda x, y: x + y, range(10), acc=100)
print(sum_result)
print(sum_result.__next__())
print(sum_result.__next__())
print(sum_result.__next__())
print(fn.last(sum_result))
执行结果:
从定义及代码的验证中,可以得知:
1、funcy模块中的map()函数和filter()函数,本质上都是返回Python内置的map和filter内置类的实例化对象,从而实现map和filter算子的逻辑。
2、需要特别说明的是,funcy模块中的reductions()函数,不同于functools中的reduce()函数,reductions()是延迟计算的逻辑,返回的是一个生成器。
3、funcy模块中提供了快速访问序列、生成器等的实用函数,比如last()可以获取序列或者生成器中的最后一个元素。
柯里化和偏函数的支持
首先看下funcy模块中的curry()的定义:
通过代码验证一下funcy.curry()的使用:
import funcy as fn
# 模拟一个相加的多元函数
def add(x, y, z):
return x + y + z
# 自定义实现柯里化的方法
def inner_curried_add(x):
def add_y(y):
def add_z(z):
return x + y + z
return add_z
return add_y
# 使用funcy实现柯里化
funcy_curried_add = fn.curry(add)
print(funcy_curried_add)
print(add(1, 2, 3))
print('=' * 20)
print(inner_curried_add(1)(2)(3))
print('=' * 20)
print(funcy_curried_add(1)(2)(3))
执行结果:
接下来,再看下funcy模块中的偏函数的功能:
import funcy as fn
import functools
# 模拟一个相加的多元函数
def add(x, y, z):
return x + y + z
# functools的偏函数功能
functools_add_one = functools.partial(add, 1)
print(functools_add_one)
print(functools_add_one(2, 3))
print('=' * 40)
# funcy的偏函数功能
funcy_add_one = fn.partial(add, 1)
print(funcy_add_one)
print(funcy_add_one(2, 3))
执行结果:
可以看到funcy模块中的偏函数本质上就是functools中的partial类。
从定义中也可以看出:
组合函数的支持
funcy模块中的compose()可以将多个函数组合,从而生成一个新的函数。可以用于进行纯函数的复用、组合,实现对数据的流水线式处理的功能。
从定义中可以看出,compose()函数的功能,是通过叠加map和functools.reduce()来实现的。
接下来,通过实例看下compose()函数的使用:
import funcy as fn
# 实现一个 y = (x + 1) ^ 2的功能
f = fn.compose(lambda x: x ** 2, lambda x: x + 1)
print(f)
print(f(1))
print(f(10))
执行结果:
需要注意的是,最先进行的计算操作写在最后,这个顺序决定了计算的顺序。
funcy中的其他特性
funcy模块的其他特性中,需要特别关注的有两个,一个是关于序列的操作,另一个就是一些好用的装饰器。
首先看序列的操作
funcy模块支持懒序列的操作,可以在需要时生成元素,具有延迟计算的特性,从前面的reductions()函数中可以看到这一点。
通过代码简单演示一下懒序列的使用:
import funcy as fn
# 定义一个斐波那契数列的生成器
def fibonacci():
a, b = 0, 1
for i in range(100):
yield a
a, b = b, a + b
fib = fibonacci()
# 第一个
print(fn.first(fib))
# 第二个
print(fn.second(fib))
# 第n个
print(fn.nth(50, fib))
# 最后一个
print(fn.last(fib))
执行结果:
还有更多的函数可以使用,感兴趣的同学可以自行尝试。
接下来看几个比较实用的装饰器
1、retry():重试装饰器
通过代码简单试用一下:
import funcy as fn
import random
@fn.retry(3)
def random_with_fails():
res = random.random()
if res > 0.5:
print(res)
raise ValueError('Random value too large')
return res
print(random_with_fails())
可以多运行几次,会发现有时正常返回,有时会抛异常:
2、memoize():缓存装饰器
直接通过代码演示:
import funcy as fn
import time
@fn.memoize
def add(a, b):
print('calculating...')
time.sleep(1)
return a + b
print(add(10, 20))
print('=' * 40)
print(add(10, 20))
print('=' * 40)
print(add(11, 20))
执行结果:
3、ignore()装饰:忽略指定异常
同样通过代码简单使用一下:
import funcy as fn
@fn.ignore((TypeError, ZeroDivisionError), default='出现异常')
def divide(a, b):
return a / b
print(divide(10, 20))
print('=' * 40)
# TypeError被忽略,同时返回指定的默认值
print(divide('abc', 20))
print('=' * 40)
# ZeroDivisionError被忽略,同时返回指定的默认值
print(divide(10, 0))
执行结果:
总结
本文简单介绍了Python中的三方模块funcy中的各种特性,主要是在函数式编程中的一些支持,此外,还补充了几个比较实用的装饰器。
感谢您的拨冗阅读,希望对您有所帮助。
相关推荐
- 最新电脑主机配置清单(2021电脑主机主流配置)
-
1.CPU全志a31s80元主板建议联想乐pad160元显示屏7寸分辨率建议在800*480以上约110元电源接口约0.2元wifi模块约20元蓝牙模块约20元硬盘建议金...
- windows7系统界面(win7界面什么样)
-
关于这个问题,要将Win1系统调成Win7界面,您可以尝试以下几个步骤:1.下载并安装一个Win7主题:在网上搜索并下载一个Win7主题,例如“Windows7ThemeforWin10”,...
- 把文件隐藏了怎么显示出来(文件隐藏起来了怎么找)
-
需要显示出来因为有些文件被系统默认设置为隐藏状态,为了查看或编辑这些文件,需要将它们显示出来。如果你使用Windows操作系统,可以在文件资源管理器中点击“查看”选项卡,然后勾选“隐藏项目”复选框,隐...
- mercury路由器wifi密码(mercury路由器wifi密码忘了怎么办)
-
水星路由器宽带密码查看的方法:一、首先登陆原来路由器管理界面,输入路由器账号密码登陆。二、进入路由器管理界面后,点击进入“备份和载入配置”,然后点击“备份配置文件”,然后将备份的配置文件存放在电脑桌...
- microsoft word产品密钥(微软word产品密钥)
-
产品密钥是由一些字符组成的代码,用于激活对应产品。产品密钥是产品授权的证明,它是根据一定的算法(如椭圆算法)等产生的随机数。当用户输入密钥产品会根据其输入的密钥判断是否满足相应的算法,通过这样来判断,...
- 笔记本显卡推荐(笔记本显卡推荐性价比高)
-
1、微星R7850TF2GD5/OC:这款微星显卡是用GCN架构设计的图形核心,里面有1024个sp单元,执行、输出能力都非常的强悍,能完美地将DX11.1特效呈现出来。它还能够支持驳接各种大型...
- hp系统重装win10(hp怎么重装系统win10)
-
答具体解决方法如下准备工作: 1、下载u启动u盘启动盘制作工具 2、下载win10系统镜像并存入u盘启动盘中 3、硬盘模式更改为ahci模式 安装win10系统操作步骤: 1、首先,我们提...
- 惠普笔记本电脑售后服务(惠普笔记本电脑售后服务维修点)
-
惠普笔记本电脑的售后服务包括全国联保、上门维修、24小时服务热线等多种服务。消费者可以通过官网或客户服务热线轻松预约维修服务,享受专业、高效的技术支持。同时,惠普还提供质保服务和延保服务,保障消费者的...
- 住房公积金管理中心官网(广州住房公积金管理中心官网)
-
按照《住房公积金管理条例》有关规定,住房公积金管理中心性质属于事业单位,隶属事业单位编制。使用手机查询住房公积金的方法。微信查询法1、打开微信,点击进入“我”的页面,在这个页面找到钱包;2、点击进入...
- 远程控制系统(路灯远程控制系统)
-
汽车远程控制系统是一种通过移动终端或其他设备远程控制汽车的系统,可以实现远程锁车/解锁、远程启动车辆、远程启动空调、...
- 惠普1136打印机驱动(惠普1136打印机驱动用的是1130吗)
-
原因:1、可能是安装驱动步骤错了,下载驱动的步骤一定要按步骤检查安装。2、可能是驱动程序兼容性问题,或驱动程序损坏,建议使用驱动管理软件安装,这样简单,而且是最新的,兼容性、稳定性好。3、可能是打印机...
- office2013标准版产品密钥(microsoft office2013产品密钥在哪里能找到)
-
win7/win8/win10系统下VisualStudio2013各个版本的密钥:VisualStudioUltimate2013KEY:BWG7X-J98B3-W34RT-33B3R-...
- win7旗舰版电脑非常卡怎么办
-
针对Windows7旗舰版卡顿的情况,可以尝试以下几种方法来解决:1.升级硬件:如果你的电脑配置较低,可以考虑升级一下硬件,例如更换内存条、加装固态硬盘等。2.清理磁盘:清理电脑中不必要的文件、...
- 随身wifi怎么用的使用教程(随身wifi怎么用的使用教程图解)
-
1、将随身wifi插入电脑端,按照提示操作2、首次安装驱动后,随身wifi会随机生成10位默认密码,每台电脑是不相同的。为方便连接,也可手动设置为相同的密码。3、随身WiFi客户端支持3种手机连接方式...
- gho文件制作u盘启动盘(ghost文件制作启动盘)
-
有些优盘制作工具只会制作启动盘,里面是没有包括映像文件的,需要你自己下载。后拷贝gho文件到GHO目录里。你可以检查一下优盘里的内容,尤其是GHO文件夹,没有的话,自己拷贝需要的进入就行了。(1)制作...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
