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

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

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

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

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

fact = (lambda highfunc: highfunc(highfunc))(lambda func: lambda n: n == 0 and 1 or n * func(func)(n - 1))
ret = fact(5)
# 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(3)
print(p3(10)) # 1000

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

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

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

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

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

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

lambda func: func(func) # 这样就实现了递归了哈。

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

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

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

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

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

发布了26 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/anonymous_qsh/article/details/80585568
今日推荐