辣鸡 Python!(骂完之后依然摸着头发日渐稀疏的脑袋找 Bug)

问题的引出

因为 Python 的屎一样的函数式支持——不支持链式调用等,举个例子:

1
2
3
4
5
6
7
8
9
l = [1,2,3,4]
ml = map(lambda x:x-1,map(lambda x:x+1,l))
a = ml[0]
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
#TypeError: 'map' object is not subscriptable

a = list(ml)[0]
# 1

这段代码有 2 个令人感觉很不符合常规操作的地方

  1. 多个连续的「函数式操作」居然只能用拙劣的「函数嵌套」来完成,而不能支持「链式调用」
  2. 函数式操作之后,返回的类型居然只是一个可迭代对象,如果想使用下标索引的话,还要自己再手动 list() 再嵌套一层

我每次写的时候…真的咽不下这口气…(气到翻白眼.jpg)

紧急救心丸

为什么不能像这个一样呢?

1
2
3
l = [1, 2, 3, 4, 5, 6, 7]
ml = l.filter(lambda x: x > 3).filter(lambda x: x < 6)
# ml == [4, 5]

这样多舒服!多优雅啊!(自卖自夸)

然后我就撸了一个轮子(虽然核心代码就这么几十行)

->地址在这<-

顺便丢到了 Pypi 上供大家 ForkFuck性能上和原生的差不多,只要不 List 或者 Done 那基本上不会有太大的问题——都是返回迭代器的(惰性求值返回引用两点决定了不会有太大的性能损耗),唯一的一点可能有损耗的地方就是每次都会创建 Fc 对象(不过既然你都选择了 Python 那哪里还会在乎这几个 O(1) 的操作。。。)

用法很简单

1
$ pip install fc

当然还是推荐装到 virtualenv 里面,毕竟没有命令行工具啥的,装好之后直接在项目里 from fc import Fc 就行了,用法在 README 里面,如果想深入了解用法的话,可以看看这个测试用例,基本上涵盖了所有的函数,并且如有更新也会在这个文件里实时添加测试。

当然,这个小轮子只有那么几十行代码,如果想了解实现的话,直接看代码就好了~

祝大家玩得开心~

在最后

骂也骂了,库也写了,现在唯一希望的就是 Python 老大哥能够早日支持原生迭代器的链式调用、多行 Lambda 和多行链式调用不用加 \ 了(要求有点多啊这)。。。

(顺便再求一个 Star)