希望大佬们不吝啬 Star 鼓励一下 ;-)
举个例子,当你在原生 Python 里使用函数式编程的时候,不免会写出如下代码:
# 先给所有元素 +1,
# 再筛选大于 4 的元素,
# 打印,
# 再让所有元素 +1,
# 最后让 l 变成 List,方便后续的操作
l = [1, 2, 3, 4, 5]
l = filter(lambda x: x > 4, map(lambda x: x + 1, l))
l = list(l)
print(l)
# [5, 6]
l = list(map(lambda x: x + 1, l))
assert l==[6, 7]
这里有几个让人不舒服的地方
filter
和 map
之类的操作,只能是嵌套的,而不能是链式调用list
化要也需要嵌套使用fc
库能够优雅地解决以上问题,而你只需要在环境终端里输入
$ pip install fc
然后上述的代码就可以改成:
from fc import Fc
# 建议用括号 () 把链式的 Fc 包起来,就可以实现多行链式调用了(虽然有点丑,但是是无可奈何的。。。
l = (
Fc([1, 2, 3, 4, 5])
.map(lambda x: x + 1)
.filter(lambda x: x > 4)
.print() # [5, 6]
.map(lambda x: x + 1)
.done()
)
assert l == [6, 7]
并且当你不需要 print 的时候,只需要简单在前面加上一个 #
即可轻松注释。
注:Fc 不会改变传入的 Iterable,即以只读的形式对待传入的参数,每次链式都会创建一个新的 Fc(时间复杂度为 O(1),可以忽略不计),满足函数式无副作用的思想。
fc 考虑了性能上的优化策略,所有的支持链式的 Fc 的类成员函数基本上都是使用生成器的方式返回(yield),即实现了惰性求值,优化了时间和空间效率,只有个别函数由于实现原因(需要从后向前计数等)会转换成数组,并且这种函数都会被标注在文档上,方便进行性能排查。
当然,如果你有任何建议(不限于性能优化等)都可以提 issue 或者发邮件到 [email protected] 联系我。
; )
本项目默认使用的是驼峰命名
,但由于 Python 一贯是使用下划线命名
,所以 fc 提供了一个 Fc_
的类,除了把驼峰式
例如 getAfter
变成了 get_after
以外,功能上没有任何差别,可以放心使用。(不过因为是动态生成的,所以 IDE 可能不会提供自动补全,所以如果不是刚需的话,不是特别建议手撸下划线式(当然不用太在意这个,功能、性能又不会有影响,就是怕手误打错而已))。
1
silhouette 2018-05-22 20:38:31 +08:00 via Android
6666
|
2
Arnie97 2018-05-22 20:44:32 +08:00 via Android
之前有一个 Shell 管道画风的库,和这个库功能较为类似: https://github.com/0101/pipetools
|
4
hourann 2018-05-22 21:09:28 +08:00 via iPhone
链式调用确实是个痛点…
|
6
msg7086 2018-05-22 23:17:18 +08:00
这是把 Python 写出了 Ruby 的风格吗……
|
8
inflationaaron 2018-05-22 23:45:45 +08:00
对于函数式来说 point free style 会更好一点
|