链式编程是一种非常高效的组织代码的方式,典型如pandas与scikit-learn中的pipe(),以及R中的管道操作符%>%等,它们都可以帮助我们像连接管道一样,将计算过程中的不同步骤顺滑的连接起来,从而取代繁琐的函数嵌套以及避免多余中间变量的创建。
图1链式编程与常规写法的比较如下例:
# 非链式写法 func4(func3(func2(func1(A)))) # 链式写法 A.func1().func2().func3().func4()哪一种写法更简洁明了,想必大家一眼就看得出来,而今天的文章就将带大家认识如何借助funct的力量,来改造Python原生列表,赋予其链式计算的能力。
2 利用funct.Array实现链式计算funct的设计理念就是类似Python列表但更棒,它借鉴了numpy的很多特点,配合功能丰富的各种链式计算方法,使得我们在使用它完成计算任务编写代码如丝般顺滑时~
利用pip install funct完成安装(本文演示版本为0.9.2)之后,下面我们来认识它的一些优秀特性吧~
2.1 funct.Array的创建funct中类比列表和numpy中的数组,创造了Array这种特别的数据结构,常用的有如下几种创建方式:
从其他数据结构创建
最常规的方式是从现有的其他数据结构,转换到Array,常见如下面的几个例子:
图2类似numpy风格的规则创建方法
除了从现成的数据中创建Array之外,我们还可以类似numpy中的linspace()等API那样,基于规则批量创建数据,常用的有如下两种方法:
图3创建嵌套Array
既然是建立在列表的基础上,那么funct对嵌套Array尤其是不规则嵌套Array的支持也是很到位的:
图4但在配合多个numpy数组构建嵌套Array时要注意,最后一定要加上toArray()方法才能彻底完成转换:
图5 2.2 funct.Array的索引大致介绍完如何创建funct.Array之后,很重要的一点就是如何对已有Array进行索引,在funct中针对Array设计了如下几种丰富的索引方式:
列表式索引
既然继承自列表,自然可以使用Python原生列表的索引与切片方式:
图6数组式索引
我们都知道Python原生列表不能传入一系列标号对应的数组来一次性索引出多个值,除非转换为numpy数组或pandas的Series,但这又会在一些应用场景下丢失灵活性,但在Array中,它可以!
图7Bool值索引
Array同样支持传入Bool值索引,使得我们可以将某个条件判断之后的判断结果作为索引依据传入:
图8多层索引
既然Array是支持嵌套结构的,自然可以进行多层索引,但需要注意的是:
图9 2.3 funct.Array的链式骚操作讲完了如何创建与索引funct.Array之后,就来到了本文的重头戏——Array的链式运算上,在funct.Array中,几乎所有常见的数值与逻辑运算都被封装到方法中,我们来一阶一阶的来看看不同情况下如何组织代码:
level1:基础的数值运算