首页 / 知识
使用Python的toolz库开始函数式编程
2023-11-12 13:38:00
toolz库允许你操作函数,使其更容易理解,更容易测试代码。
在这个由两部分组成的系列文章的第二部分中,我们将继续探索如何将函数式编程方法中的好想法引入到Python中,以实现两全其美。
在上一篇文章中,我们介绍了不可变数据结构。这些数据结构使得我们可以编写“纯”函数,或者说是没有副作用的函数,仅仅接受一些参数并返回结果,同时保持良好的性能。
在这篇文章中,我们使用toolz库来构建。这个库具有操作此类函数的函数,并且它们在纯函数中表现得特别好。在函数式编程世界中,它们通常被称为“高阶函数”,因为它们将函数作为参数,将函数作为结果返回。
让我们从这里开始:
defadd_one_word(words,word):
returnwords.set(words.get(word,0)+1)
这个函数假设它的第一个参数是一个不可变的类似字典的对象,它返回一个新的类似字典的在相关位置递增的对象:这就是一个简单的频率计数器。
但是,只有将它应用于单词流并做归纳时才有用。我们可以使用内置模块functools中的归纳器。
functools.reduce(function,stream,initializer)
我们想要一个函数,应用于流,并且能能返回频率计数。
我们首先使用toolz.curry函数:
add_all_words=curry(functools.reduce,add_one_word)
使用此版本,我们需要提供初始化程序。但是,我们不能只将pyrsistent.m函数添加到curry函数中;因为这个顺序是错误的。
add_all_words_flipped=flip(add_all_words)
flip这个高阶函数返回一个调用原始函数的函数,并且翻转参数顺序。
get_all_words=add_all_words_flipped(pyrsistent.m())
我们利用flip自动调整其参数的特性给它一个初始值:一个空字典。
现在我们可以执行get_all_words(word_stream)这个函数来获取频率字典。但是,我们如何获得一个单词流呢?Python文件是按行供流的。
defto_words(lines):
forlineinlines:
yieldfromline.split()
在单独测试每个函数后,我们可以将它们组合在一起:
words_from_file=toolz.compose(get_all_words,to_words)
在这种情况下,组合只是使两个函数很容易阅读:首先将文件的行流应用于to_words,然后将get_all_words应用于to_words的结果。但是文字上读起来似乎与代码执行相反。
当我们开始认真对待可组合性时,这很重要。有时可以将代码编写为一个单元序列,单独测试每个单元,最后将它们全部组合。如果有几个组合元素时,组合的顺序可能就很难理解。
toolz库借用了Unix命令行的做法,并使用pipe作为执行相同操作的函数,但顺序相反。
words_from_file=toolz.pipe(to_words,get_all_words)
现在读起来更直观了:将输入传递到to_words,并将结果传递给get_all_words。在命令行上,等效写法如下所示:
$catfiles|to_words|get_all_words
toolz库允许我们操作函数,切片、分割和组合,以使我们的代码更容易理解和测试。
以上内容为大家介绍了使用Python的toolz库开始函数式编程,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
Python的字典排序
Python的字典排序,代码,数据,培训,字典,函数,表达式,内容,列表,排列,问题,字典是Python语言中的一种数据结构,每一个字典元素是由一对key-valu为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规Python之关于高效使用字典的清单
Python之关于高效使用字典的清单,代码,数据,字典,培训,扩大,时报,方式,方法,对象,列表,字典(dict)对象是Python最常用的数据结构,社区曾有人开Python切片操作详细例子
Python切片操作详细例子,情况,连续,培训,数据,切片,操作,终点,两者,矛盾,起点,以下示例均以列表a=[0,1,2,3,4,5,6,7,8,9]为例:>>>a=[0,1,2,3,4python unittest控制用例的执行顺
python unittest控制用例的执行顺序,名字,交易,培训,方法,顺序,测试,方式,功能,订单,接口,为什么要进行顺序控制呢?使用过testng的同学就知道python内置函数:map、reduce、filte
python内置函数:map、reduce、filter的用法和区别,数据,培训,数字,函数,序列,内容,元素,参数,列表,个数,map:根据函数对指定序列做映射map参数python操作系统接口模块:OS
python操作系统接口模块:OS,管理,工作,工具,系统,服务,培训,模块,文件,目录,函数,OS模块提供了很多与操作系统进行交互的函数,比如常见的使用函Python 递归函数
Python 递归函数,第一,第三,培训,个人,人大,函数,程序,条件,以此类推,例题,递归:函数调用自己本身递归的核心:1)递归推导式2)递归终止条件不过python 的内置字典
python 的内置字典,时间,环境,培训,数据,元素,方法,放入,定义,顺序,对象,python内置了字典:dict(key-value存储方式)的支持,dict全称dictionarypython 命名关键字参数
python 命名关键字参数,位置,参数,名字,培训,关键字,函数,后面,定义,方式,上面,对于关键字参数,函数的调用者可以传入任意不受限制的关键字参4种出色的Python测试框架!
4种出色的Python测试框架!,项目,代码,测试,标准,扩大,规模,企业,培训,设计,名称,企业软件需要测试,如同建筑物需要消防和安全检查。如果你知道Python基础之numpy中的常见函数有
Python基础之numpy中的常见函数有哪些,数组,基础,培训,元素,方向,矩阵,函数,乘积,维度,索引,有些Python小白对numpy中的常见函数不太了解,今天