一、函数式编程——Functional Programming

函数式=编程语言定义的函数+数学意义的函数

在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。
而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。
对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

二、高阶函数

两点性质:

1.函数本身也可以赋值给变量,变量可以指向函数

  1. >>> f = abs
  2. >>> f(-10)
  3. 10

#说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。

2.“函数即变量”

函数名其实就是指向函数的变量!例如,对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数!

小结:既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

  1. def add(x, y, f):
  2. return f(x) + f(y)
  3. print(add(-5, 6, abs))#abs函数作为一个参数传给add函数

高阶函数的意义就是,让函数接受的参数也是一个函数名。

三、map(),filter(), reduce()

1.map()函数

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

注意:传到函数是函数名,如果写成了函数()形式,就成了传入函数的返回值做参数。

具体实例

  1. >>> def f(x):
  2. ... return x * x
  3. ...
  4. >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
  5. >>> list(r)
  6. [1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list

实际上:map函数就是执行了一个for循环操作,处理序列中的每个元素,得到的结果是一个“可迭代对象(原来是什么数据类型,得到就是什么)”,该可迭代对象中元素的个数及位置与原来一样。

2.filter()函数

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

具体实例:在一个list中,删掉偶数,只保留奇数

  1. def is_odd(n):
  2. return n % 2 == 1
  3. list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
  4. # 结果: [1, 5, 9, 15]

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
注意到filter()函数返回的是一个可迭代序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

注意:filter()函数遍历序列中的每个函数,判断每个元素并得到布尔值,如果结果是true,就保留下来。

3.reduce()函数

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

  1. reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

具体实例:把序列[1, 3, 5, 7, 9]变换成整数13579

  1. >>> from functools import reduce
  2. >>> def fn(x, y):
  3. ... return x * 10 + y
  4. ...
  5. >>> reduce(fn, [1, 3, 5, 7, 9])
  6. 13579

改进:配合map(),我们就可以写出把str转换为int的函数

  1. >>> from functools import reduce
  2. >>> def fn(x, y):
  3. ... return x * 10 + y
  4. ...
  5. >>> def char2num(s):
  6. ... digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
  7. ... return digits[s]
  8. ...
  9. >>> reduce(fn, map(char2num, '13579'))
  10. 13579

注:reduce()函数处理一个序列,然后把序列进行合并操作。

四、匿名函数

当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便,

  1. >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
  2. [1, 4, 9, 16, 25, 36, 49, 64, 81]

通过对比可以看出,匿名函数lambda x: x * x实际上就是:

  1. def f(x):
  2. return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

同样,也可以把匿名函数作为返回值返回。

  1. def build(x, y):
  2. return lambda: x * x + y * y

Python进阶【第五篇】函数式编程及某些特殊函数的更多相关文章

  1. Python 进阶(一)函数式编程

    来自慕课网: 简介: 函数:function ,在入门课程已学 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式,函数≠函数式,好比:计算≠计算机

  2. 简学Python第三章__函数式编程、递归、内置函数

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  3. Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)

    Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...

  4. Python开发第五篇

    面向对象程序设计 面向过程编程:就是分析问题的解决步骤,按部就班的编写代码解决问题 函数式编程:就是把代码封装到函数中,然后在使用时调用封装好的函数 面向对象编程:把一类事物所共有的属性和行为提取出来 ...

  5. Python 进阶(五)定制类

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAF/CAIAAACUs6uhAAAgAElEQVR4nOzdZXubx7ov8PPV9tlrt0 ...

  6. python学习第十一天 -- 函数式编程

    在介绍函数式编程之前,先介绍几个概念性的东西. 什么是函数式编程? 函数式编程的特点: 1.把计算视为函数而非指令; 2.纯函数式编程:不需要变量,没有副作用,测试简单; 3.支持高阶函数,代码简洁. ...

  7. Python学习笔记二:函数式编程

    1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...

  8. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  9. Python学习总结之五 -- 入门函数式编程

    函数式编程 最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转. 今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见 ...

随机推荐

  1. vue-preview的使用

    使用vue-preview做图片缩率图1.安装 npm i vue-preview -S2.如果使用vue-cli生成的项目,需要修改webpack.base.conf.js文件中的loaders,添 ...

  2. Linux下安装zookeeper集群(奇数个)

    1.  解压zookeeper压缩包 2.  data里创建“myid”文件(命令touch myid),内容是1(命令 echo 1 >> myid) 3.  zoo.cnf里配置dat ...

  3. tf中计算图 执行流程学习【转载】

    转自:https://blog.csdn.net/dcrmg/article/details/79028003 https://blog.csdn.net/qian99/article/details ...

  4. 用v-if 来给不同筛选出来的todo添加不同的按钮

    凡是数据里面有属性a为2的 我就给它放1,2,3   3个按钮 ,有属性为3的就没得按钮 ,属性a为1的 就给它 13两个按钮 效果如下:

  5. CMake使用总结(转的)+自己的实践心得

    来自https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform make,可用 ...

  6. iOS 开发笔记-获取某个APP素材

    2019.02.01 更新 以下这种方式只适合越狱的手机,目前12.1以后,iTools已经不适合了,请看最下面第二种方式. 有时候,我们看到别人的APP做得挺漂亮的,那么我们想查看该APP的图片素材 ...

  7. andorid CmakeLists

    # cmake要求低版本 cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either ...

  8. the import XXXX cannot be resolved 解决方法

    明明XXX类完全没问题 突然就报错了 解决方法: 原因一:一个项目引用了兄弟项目的类,报错The import XXX cannot be resolved 解决办法:需要在引用的兄弟项目右键选择Ma ...

  9. spring对JDBC的整合支持

    参考网址:https://blog.csdn.net/u013821825/article/details/51606171 springMVC,目前用到的jar包 spring IOC 5个包  + ...

  10. WebSocket.之.基础入门-后端响应消息

    WebSocket.之.基础入门-后端响应消息 在<WebSocket.之.基础入门-前端发送消息>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 inde ...