Python与Go异同之:函数式编程

我们先来介绍几个概念:

什么是纯正的函数式编程?
  • 不可变性:不能有状态,只有常量和函数
  • 函数只能有一个参数
    Go与Python作为一种通用的编程语言,它只是实现了函数式编程的一部分东西,并不纯正,它俩的函数式编程主要体现在闭包上面,我们来写一个数字累加的函数看一下,两种语言分别是怎么实现的。
先来看Go 语言的
func adder() func(int) int {
    sum := 0
    return func(v int) int {
        sum += v
        return sum
    }
}
func main()  {
    a := adder()
    for i := 0; i < 10; i++{
        fmt.Println(a(i))
    }
}

上面的两个函数就实现闭包的功能

Python实现的方式
def adder(value):
    sum = 10
    def sumAll(value):
        nonlocal sum
        sum = sum+value
        return sum
    return sumAll

if __name__ =='__main__':
    result = adder(sum)
    # 打印环境变量
    print(result.__closure__[0].cell_contents) 
    for x in range(10):
        print(result(x))

Python是原生支持闭包的,你可以使用closure查看闭包内容
我怎么感觉 Go的实现方式更好一点呢?你怎么认为呢?
最后我们用Go语言实现一个正统的函数式编程

type iAdder func(int) (int, iAdder)

func adders(base int) iAdder{
    return func(v int) (int, iAdder) {
        return base + v, adders(base+v)
    }
}
func main()  {
    a := adders(0)
    for i := 0; i < 10; i++{
        var s int
        s, a = a(i)
        fmt.Println(s,a)
    }
}

上面这个就是正统的函数式编程的写法,它没有定义变量,都是函数。

你可能感兴趣的:(Python与Go异同之:函数式编程)