• 技术文章 >Python技术 >Python基础教程

    关于python函数式编程详细介绍

    2020-10-24 17:29:48原创3371

    小编收到小伙伴们要求,带大家了解关于函数式编程,这个内容想必大家并不陌生,也是经常需要应用的,已经整理好以下详细的介绍,一起来看看吧~

    函数式编程理解:

    编写代码的时候,函数式编程更多的是从声明式的方法,而传统的编程更多的是命令式的方法。例如,上面的筛选学生年纪,传统的编程思想是,我创建了什么,我循环了什么,我判断了什么,得出了什么结果;函数式编程的思想是,我声明了一个筛选的函数,我声明了一个判断的函数,我把这两个函数结合起来,得出了一个结果。

    关于纯函数

    在函数式编程的概念中,有一个重要的概念是纯函数,那么什么是纯函数呢?

    我们用代码来解释什么是纯函数:

    const z = 10;
    add(x, y) {
     return x + y;
    }
    复制代码
    上面的add函数就是一个纯函数,它读取x和y两个参数的值,返回它们的和,并且不会受到全局的z变量的影响
     
    把这个函数改一下
    const z = 10;
    add(x, y) {
     return x + y + z;
    }
    复制代码

    这个函数就变成了不纯的函数了,因为它返回的值会受到全局的z的影响,换句话说,这个函数会被外部环境影响,我们就得出了第一个判断是否纯函数的重要依据——纯函数不会受到外部环境的影响。

    再用splice和slice来解释一下:

    var xs = [1,2,3,4,5];
    // 纯的
    xs.slice(0,3);
    //=> [1,2,3]
    xs.slice(0,3);
    //=> [1,2,3]
    xs.slice(0,3);
    //=> [1,2,3]
    // 不纯的
    xs.splice(0,3);
    //=> [1,2,3]
    xs.splice(0,3);
    //=> [4,5]
    xs.splice(0,3);
    //=> []
    复制代码

    slice收到同样的参数,每次返回相同的值,所以是纯函数,splice收到同样的参数,每次返回不同的值,所以不是纯函数,我们就得出了第二个判断是否纯函数的重要依据——纯函数相同的输入,永远会得到相同的输出。

    总结:

    '纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用'
    复制代码

    关于柯里化

    柯里化的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

    const add = x => y => x + y;
    add(1)(2);
    // => 3
    复制代码

    上面的例子,就是一个很典型的柯里化函数,在我们第一调用的时候,接收了第一次传入的参数(用闭包记住),返回了一个新的函数;在第二次调用的时候,接收第二次传入的参数,并且和第一次传入的函数相加,返回它们的和。

    运用上面的思想编写一个的柯里化函数:

    currying(fn, ...args1) {
     // '判断传入的参数是否满足传入函数需要的参数,比如说add函数需要两个参数相加,那么判断是否传入了两个参数,满足调用传入函数计算结果'
     if (args1.length >= fn.length) {
     console.log(args1, '--1--');
     return fn(...args1);
     }
     // '不满足返回一个新的函数,继续调用柯里化函数,传入保存的第一次传入的函数,传入保存的第一次传入的参数,传入第二次传入的参数,继续上面的判断逻辑,返回计算结果'
     return (...args2) => {
     console.log(args2, '--2--');
     return currying(fn, ...args1, ...args2);
     };
    },
    // 定义一个一般函数
    const add = (x, y) => x + y;
    // 使用
    const increment = currying(add, 1);
    console.log(increment(2));
    const addTen = currying(add, 10);
    console.log(addTen(2));
    // => [2] --2--
    // => [1,2] --1--
    // => 3
    // => [2] --2--
    // => [10,2] --1--
    // => 12
    复制代码

    柯里化函数比较重要的思想是:

    多次判断传入的参数是否满足计算需求,满足,返回计算结果,如果不满足,继续返回一个新的柯里化函数

    关于代码组合

    首先,先写一个简单的组合函数:

    const compose = (f, g) => x => f(g(x));

    这个组合函数接收两个函数当作参数,然后返回一个新的函数,x是两个函数之间都要使用的值,比如说:

    const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
    // 使用,实现一个功能,字符串变成大写,加上个感叹号,还要截取一部分,再在前面加上注释
    const toUpperCase = x => x.toUpperCase();
    const exclaim = x => `${x}!`;
    const head = x => `slice is: ${x}`;
    const reverse = x => x.slice(0, 7);
    const shout = compose(exclaim, toUpperCase, head, reverse)
    shout('my name is maya')
    // => SLICE IS: MY NAME!
    复制代码

    组合的原理其实就是数学中的结合律:

    (a + b) + c = a + (b + c)

    对组合的理解是:

    组合是什么,组合就是运用了数学里的结合律,像是搭积木一样,把不同的函数联系起来,让数据在里面流动

    在各种库里面都有组合的函数,lodash,underscore,ramda等等,比如在underscore里面,组合是这样的:

     // Returns a function that is the composition of a list of functions, each
     // consuming the return value of the function that follows.
     _.compose = function() {
     var args = arguments;
     var start = args.length - 1;
     return function() {
     var i = start;
     var result = args[start].apply(this, arguments);
     while (i--) result = args[i].call(this, result);
     return result;
     };
     };
    复制代码

    相信大家到这里已经初步了解了函数式编程的概念了,那么我们怎么使用函数式编程的方式写代码呢,举个例子:

    // 伪代码,思路
    // 比如说,我们请求后台拿到了一个数据,然后我们需要筛选几次这个数据, 取出里面的一部分,并且排序
    // 数据
    const res = {
     status: 200,
     data: [
     {
     id: xxx,
     name: xxx,
     time: xxx,
     content: xxx,
     created: xxx
     },
     ...
     ]
    }
    // 封装的请求函数
    const http = xxx;
    // '传统写法是这样的'
    http.post
     .then(res => 拿到数据)
     .then(res => 做出筛选)
     .then(res => 做出筛选)
     .then(res => 取出一部分)
     .then(res => 排序)
     
    // '函数式编程是这样的'
    // 声明一个筛选函数
    const a = curry()
    // 声明一个取出函数
    const b = curry()
    // 声明一个排序函数
    const c = curry()
    // 组合起来
    const shout = compose(c, b, a)
    // 使用
    shout(http.post)
    复制代码

    如果想要在项目里面正式使用函数式编程有这样几个步骤:

    1、先尝试使用ES6自带的高阶函数

    2、熟悉了ES6自带的高阶函数后,可以自己尝试写几个高阶函数

    3、在这个过程中,尽量使用纯函数编写代码

    4、对函数式编程有所了解之后,尝试使用类似ramda的库来编写代码

    5、在使用ramda的过程中,可以尝试研究它的源代码

    6、尝试编写自己的库,柯里化函数,组合函数等

    以上就是关于函数式的全部内容介绍,大家可以消化学习,如需了解更多python实用知识,点击进入PyThon学习网教学中心

    专题推荐:python函数式编程介绍
    上一篇:解析python split()方法的用法及实例代码 下一篇:Python中如何使用range()函数创建数字列表

    相关文章推荐

    • python进制转换:十进制转二进制的用法• 了解python的join()方法用法及使用• python编程:面向对象与过程是什么?• 解析python split()方法的用法及实例代码

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网