基本概念

函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量。因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用。而允许使用白变量的程序设计语言,由于函数内部的变量状态是不确定的,同样的输入可能有不同的输出,我们称这种函数为有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传递给另一个函数,还允许返回一个函数!

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

(这部分内容摘抄与廖雪峰老师的博客文章,自己也进行了学习)

高阶函数

  • 变量可以指向函数

      #变量可以指向函数
    f = abs;
    print(abs(-10));#10
    print(f(-10));#10
    #在这里用f和abs调用的结果和效果是一样的

说明变量f 已经指向了函数 abs本身。

  • 函数名也是变量

    函数名就是指向函数的变量。如:

      abs = 10;
    print(abs(-10));
    # Traceback (most recent call last):
    # File "test01.py", line 164, in <module>
    # print(abs(-10));
    # TypeError: 'int' object is not callable

abs已经被赋值10,是一个指向10的变量了,就不能通过abs(-10)来调用该函数了,因为abs这个变量已经不指向求绝对值函数了。

  • 传入函数

    就是一个函数可以作为另一个函数的参数,这种函数称为高阶函数。

      #一个简单的高阶函数
    def add(x, y, f):
    return f(x) + f(y);
    print(add(5, -6, abs));#11
map/reduce

python内建了map()和reduce()函数。

  • map()函数

    map函数接收两个参数,一个是函数,一个是iterable(可迭代的对象),map将传入的函数一次作用到序列的每个元素,并把结果作为新的iterator返回。

      #map()函数
    def f(x):
    return x * x;
    r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
    print(list(r));
    # [1, 4, 9, 16, 25, 36, 49, 64, 81]
  • reduce()函数

    该函数必须接收两个参数,reduce把函数结果继续和序列的下一个元素做累积计算。

    如:累加

      #reduce()函数
    from functools import reduce;
    def add1(x, y):
    return x + y;
    print(reduce(add1, [1, 3, 5, 7, 9]));#25

这并不是reduce的用武之地,当我们要把上面的数列变成整数13579时,reduce就排上用场了:

	def fn(x, y):
return x * 10 + y;
print(reduce(fn, [1, 3, 5, 7, 9]));

这个例子也没什么意义,但是当我们要把字符串 str 转换成int的函数时,就用上了reduce(结合map)。

filter()函数
  • filter

    python内置的filter函数用于过滤序列。和map类似也接收一个函数和一个序列,但是不同的是,filter把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

    在一个list中,删掉偶数,只保留奇数:

      #filter函数
    #在一个list中删除偶数,只保留奇数
    def is_odd(n):
    return n % 2 == 1;
    print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])));
    # 1, 5, 9, 15
  • 用filter求素数

    思想:计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:

  1. 首先,列出从2开始的所有自然数,构造一个序列:

     2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  2. 取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

     3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  3. 取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

     5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  4. 取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

     7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

不断筛下去,就可以得到所有的素数。

注明:该算法描述来源于廖雪峰老师的文章。

sorted()函数

排序算法

#sorted函数排序
print(sorted([36, -2, 5, 7, 1, -10]));
# [-10, -2, 1, 5, 7, 36];

sorted也是一个高阶函数,可以接受一个key函数来实现自定义的排序,列如按绝对值大小排序:

#sorted函数排序
print(sorted([36, -2, 5, 7, 1, -10], key=abs));
# [1, -2, 5, 7, -10, 36]

sorted函数可以用来对字符串进行排序。

sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。

总结

对函数式编程的学习这部分比较重要,学习这部分让我想到了前端框架reactJs,react也是强调函数式编程的,也是react的特性。就是说一个函数可可以作为另一个函数的参数。上面的学习例子都是很简单的,需要自己不断的练习。

python函数式编程之高阶函数学习的更多相关文章

  1. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  2. 【python】python函数式编程、高阶函数

    1.map() : python内置的高阶函数,接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并            返回. def f(x): r ...

  3. Learning Python 012 函数式编程 1 高阶函数

    Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...

  4. python学习笔记1 -- 函数式编程之高阶函数 map 和reduce

    我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def  fw(参数)这种方式定义一个函数 python有很多的内置函 ...

  5. python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值

    使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...

  6. python学习笔记1 -- 函数式编程之高阶函数 filter

    filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...

  7. 小白的Python之路 day3 函数式编程,高阶函数

    函数式编程介绍   函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  8. Python3学习之路~3.2 递归、函数式编程、高阶函数、匿名函数、嵌套函数

    1 递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. def calc(n): print(n) if int(n / 2) == 0: return n r ...

  9. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

随机推荐

  1. 利用epoll实现异步IO

    之前异步IO一直没搞明白,大致的理解就是在一个大的循环中,有两部分:第一部分是监听事件:第二部分是处理事件(通过添加回调函数的方式).就拿网络通信来说,可以先通过调用 select 模块中的 sele ...

  2. 2.2 - ATM+购物商城程序

    要求:模拟实现一个ATM + 购物商城程序1.额度 15000或自定义2.实现购物商城,买东西加入 购物车,调用信用卡接口结账3.可以提现,手续费5%4.支持多账户登录5.支持账户间转账6.记录每月日 ...

  3. detectron安装+caffe2安装

    detectron安装+caffe2安装 因为想跑一下facebook最近开源的detectron物体检测平台,所以安装caffe2+detectron 总结: 一定要好好看官方安装教程:https: ...

  4. Django框架错误处理

    错误处理 在一些网站开发中.经常会需要捕获一些错误,然后将这些错误返回比较优美的界面,或者是将这个错误的请求做一些日志保存.那么我们本节就来讲讲如何实现. 常用的错误码: 404:服务器没有指定的ur ...

  5. Linux(8)- nginx+uWSGI+virtualenv+supervisor 发布web服务器

    一.理论梳理 WSGI是web服务器的网关接口,它是一个规范,描述了web服务器(下图中的WEB server)如何与web应用程序(下图中的Application)通信,以及web应用程序如何链接在 ...

  6. Open Source VOIP applications, both clients and servers (开源sip server & sip client 和开发库)

    SIP Proxies SBO SIP Proxy Bypass All types of Internet Firewall JAIN-SIP Proxy Mini-SIP-Proxy A very ...

  7. dedecms中的内容页中的变量

    {dede:php runphp='yes'} var_dump($refObj->Fields); {/dede:php}

  8. HTTP协议简要介绍

    1. 网络基础 TCP/IP 通常使用的网络是在TCP/IP协议簇基础上运作的. HTTP属于它内部的一个子集. TCP/IP分为4个层次, 应用层, 传输层, 网络层, 链路层. (Applicat ...

  9. 使用Stanford Parser进行句法分析

    一.句法分析 1.定义 句法分析判断输入的单词序列(一般为句子)的构成是否合乎给定的语法,并通过构造句法树来确定句子的结构以及各层次句法成分之间的关系,即确定一个句子中的哪些词构成一个短语,哪些词是动 ...

  10. Java基础知识陷阱(一)

    本文发表于本人博客. 事隔好多年了,重新拿起来Java这门语言,看似熟悉其实还很陌生,想想应该梳理下顺便提高下自己.这次先来看看Java里面的String这个对象. 经典的先看下面一段代码,请问最终创 ...