python 函数式编程 库_python进阶-函数式编程库toolz用法介绍-part1

函数式编程除去本身一套的哲学之外,在python中通常可以起到简化代码,增强程序的可读性的作用,一般提起python函数式编程都会涉及到itertools,functools,operator等模块的讲解,以及内置的map、reduce、filter、all、any、enumerate、zip等函数的用法,本篇文章需要同学在对上述三方库和内置函数有一定理解的基础上来进一步了解使用toolz模块。

toolz模块的源码在这里

下面通过一些简单的例子来说明利用toolz进行函数式编程的方法(程序运行环境为python3.6)

首先定义一些简单的函数和样例数据备用

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def square(x):

return x ** 2

def iseven(n):

return n % 2 == 0

def add(x, y):

return x + y

def mul(x, y):

return x * y

def lesser(x, y):

if x < y:

return x

else:

return y

def greater(x, y):

if x > y:

return x

else:

return y

内置的map函数, 即将第一个参数传入的函数作用与第二参数传入的列表,注意在python3中map、filter等返回的是一个迭代器,所以想要得到全部的值需要用list转换一下。

list(map(square, data))

#>>> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

map的作用方式类似于numpy数组的广播方式(broadcasting)

import numpy as np

X = np.arange(1, 11)

X**2

#>>> array([ 1, 4, 9, 16, 25, 36, 49, 64, 81, 100])

还可以用列表解析的方式等价于map的作用方式

res = [square(d) for d in data]

#>>> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

下面是filter函数,第一个参数为函数,第二个为数据列表,返回列表中使函数值为真的数据。

list(filter(iseven, data))

#>>> [2, 4, 6, 8, 10]

reduce的用法如下,即将列表中的元素从左到右累计计算,计算的结果作为参数继续向后传递,最终得到一个结果。注意,reduce的第三个参数可以传入一个初始值,从而影响最后的结果。

from functools import reduce

#reduce函数在py3中放在了functools里

reduce(add,data)

#>>> 55

reduce(add,data,10)

#>>> 65

lambda函数即匿名函数,结合上面的map、reduce等方法通常能够使得代码简洁,十分方便。下面以lambda来实现内置的求和函数。

sum_ = lambda data: reduce(add,data,0)

sum_(data)

#>>> 55

下面终于到toolz出场了。toolz.groupby可以看做是上面filter的增强版,不仅可以输出满足条件的子列表,还可以将数据划分到相关的不同集合

groupby(iseven, data)

#>>> {False: [1, 3, 5, 7, 9], True: [2, 4, 6, 8, 10]}

groupby(lambda n: n % 3, data)

#>>> {0: [3, 6, 9], 1: [1, 4, 7, 10], 2: [2, 5, 8]}

groupby(len, ['Alice', 'Bob', 'Charlie', 'Dan', 'Edith', 'Frank'])

# >>> {3: ['Bob', 'Dan'], 5: ['Alice', 'Edith', 'Frank'], 7: ['Charlie']}

接下来将会介绍更多toolz的相关用法。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值