天天看点

如何高调使用Python函数式编程 如何高调使用Python函数式编程

如何高调使用Python函数式编程

首先我们考虑一个初学编程一般会了解的问题,计算n的阶乘,一个学过编程的程序猿可以简单的写出如下代码:

def fact(n):
    return n ==  and  or n * fact(n - )
ret = fact()
# ret = 120
           

这次我们的主角函数式编程,可以写出如下代码:

fact = (lambda highfunc: highfunc(highfunc))(lambda func: lambda n: n ==  and  or n * func(func)(n - ))
ret = fact()
# ret = 120
           

如果不理解上面的代码,先来介绍一下基础的知识。

python 里面的匿名函数(lambda),在这里就不过多描述了,相信学过py的各位看官们应该比较熟悉他。

为了讲清楚这一点,我们首先来看一个例子,计算a的n次幂。我们很容易得到如下代码:

def make_power_fn(power):
    def power_fn(base):
        return base ** power
    return power_fn

p3 = make_power_fn()
print(p3()) # 1000
           

我们可以发现可以省略power_fn这个函数的名字,那样我们就可以得到下面的代码:

def make_power_fn(power):
    return lambda base: base ** power
           

更进一步的,我们可以得到如下代码:

make_power_fn = lambda power: lambda base: base ** power
           

理解了上述代码,我们现在可以讨论一开始提出的问题了,计算n的阶乘。

我们首先来实现递归,简单一点说,我们可以吧匿名函数作为参数传递下去,没听明白,我们来看一个简单的例子。

我们现在修改一下原始的计算阶乘的函数:

def fact(func, n):
    return n ==  and  or n * func(func, n - )
           

然后我们把函数的定义取消掉。

fact = lambda func, n: n ==  and  or n * func(func, n - )
print(fact(fact, )) # 120
           

现在看起来已经比较好了,但是还是有func的参数传递,我们想要直接调用fact(),也就是说我们需要把后面那个函数作为参数传递给前面,最终我们便得到了一开始的代码。

终于讲完了,小白一枚,大佬们看看就好了。