目录

  • 目录
  • 函数式编程
  • Python 函数式编程的特点
  • 高阶函数
  • 匿名函数 lambda
  • 函数式编程相关的内置函数
    • filter 序列对象过滤器
    • map
    • reduce 折叠
    • 自定义的排序函数
  • 最后

函数式编程

首先要确定一点就是:函数 != 函数式,函数式编程是一种编程的范式。
特点:

  • 把计算视为函数而非指令
  • 纯函数式编程,不需要变量,没有副作用,测试简单
  • 支持高阶函数,代码简洁

Python 函数式编程的特点

需要注意的是,Python 不是也不可能会成为一种纯函数是编程语言,但 Python 仍支持许多有价值的函数式编程语言的构建方法。

  • Python 不是纯函数是编程,因为 Python 支持变量
  • Python 支持高阶函数,而且函数也可以作为变量传入
  • Python 支持闭包,可以返回一个函数

高阶函数

首先要明确一点,函数是由变量来引用的,这也是一个 Python 的特性:将对象引用和对象分离。
EG:

In [1]: abs(-1)
Out[1]: 1In [2]: f = abs # 将函数名赋值给一个变量,让变量获得函数的引用In [3]: f(-1)
Out[3]: 1In [5]: abs = lenIn [6]: abs([1, 2, 3])
Out[6]: 3

高阶函数: 能够接收函数作为一个参数的函数,就是高阶函数。
下面定义一个高阶函数:

In [1]: def add(x, y, f):...:     return f(x) + f(y)...:In [2]: add(-1, -10, abs)
Out[2]: 11

函数 add 接收内建函数 abs 作为一个参数,所以 add 是一个高阶函数。

匿名函数 lambda

格式

lamba [arg1[, arg2, ...]]: expression # --> return: object of function

匿名函数,顾名思义就是没有名字的函数,可以忽略函数定义的函数。所以匿名函数的好处之一就是创建简易、方便,不需要以标准的定义方式(def)来创建。而且匿名函数可以如一般函数那样返回一个 callable 的函数对象,所以匿名函数一般会赋值给一个变量,或者直接作为一个函数实参来使用。从匿名函数的语法格式来看,其缺点也很明显,就是其函数体只能是一条 expression 而不能是一条关键字语句,如:print

NOTE: 因为匿名函数可以快速的返回一个函数对象,并且可以直接作为一个函数的实参使用,所以匿名函数经常被用于构建函数式的编程中。
EXAMPLE:

In [4]: def add(x, y):...:     return x + y...:In [5]: lambda x, y: x + y
Out[5]: <function __main__.<lambda>> # 返回一个可调用的函数对象In [6]: lam_add= lambda x, y: x + yIn [7]: lam_add(1, 2)
Out[7]: 3

上面两种方式的结果是一致的。

注意: 如果 lambda 返回的对象没有赋值给一个变量,那么这个函数对象的引用 == 0,会被垃圾回收掉。

函数式编程相关的内置函数

Python 提供了几个与函数式编程相关的内置函数,之所以说与函数式编程相关是因为这几个内置函数都需要接收一个函数对象作为参数,而这个函数对象通常由 lambda 来提供。

filter() 序列对象过滤器

让序列对象中的每一个元素都通过一个指定的过滤器,最终符合过滤条件(Return True)的元素会被返回为一个新的序列。
要自己实现一个 filter 函数,并不难。EG.

def filter(bool_func, seq):filtered_seq = []for index in seq:if bool_func(index):filtered_seq.append()return filtered_seq

EXAMPLE 1:求偶数

In [13]: filter(lambda x: x % 2 == 0, range(1,10))
Out[13]: [2, 4, 6, 8]

EXAMPLE 2:删除 None 或者空字符串

In [14]: def is_not_empty(s):...:     return s and len(s.strip()) > 0...:In [15]: filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
Out[15]: ['test', 'str', 'END']``

注意: 传入 filter 的函数最终的返回值一定是 True or False

map()

map 和 filter 很类似,但 map 函数通过把函数参数依次作用在 seq 的每个元素上,得到一个新的 seq 并返回。而且 map 的函数参数不要求一定要返回 True or False 。除此之外, map 还能处理多个序列参数。

def map(func, seq):maped_seq = []for index in seq:maped_seq.append(func(index))return maped_seq

EXAMPLE 1:处理单个序列对象

In [17]: map(lambda x :x+2, range(1,10))
Out[17]: [3, 4, 5, 6, 7, 8, 9, 10, 11]

EXAMPLE 2:处理多个序列对象

In [24]: map(lambda x, y :x + y, range(1,10), range(1,10))
Out[24]: [2, 4, 6, 8, 10, 12, 14, 16, 18]

注意:如果传递多个序列对象给 map 时,其处理的算法如下
1. 并行的将多个序列中 index 相同的元素获取,并捆绑到同一个元组中
2. 将这一个元组传递给函数参数中进行处理。
所以需要注意的是,两个序列的元素个数是否一致,函数参数是否能正确的处理这个元组对象

In [26]: map(None, range(1,6), range(1,6))
Out[26]: [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]In [27]: zip(range(1,6), range(1,6))
Out[27]: [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]`

从这个例子可以看出 map 可以完成一个简单的 zip 功能,这是由其内部的实现算法决定的。

reduce() 折叠

reduce 需要传入一个 二元函数(具有两个形参的函数) 、一个序列对象和一个可选的 初始化器
其最常用的例子就是 累加

In [28]: reduce(add, range(1, 100))
Out[28]: 4950In [35]: reduce(add, range(1, 100), 5000)# 初始化器 == 5000,即从 5000 开始累加
Out[35]: 9950

等效于:reduce(func, [1, 2, 3]) ⇒ func(func(1, 2), 3)

自定义的排序函数

Python 内置了一个排序函数 sorted

In [1]: sorted([36, 5, 12, 9, 21])
Out[1]: [5, 9, 12, 21, 36]

时 sorted 也是一个高阶函数,它可以接收一个比较函数来实现自定义排序。
比较函数的定义是:传入两个待比较的元素 x, y
1. 如果 x 应该排在 y 的前面,返回 -1
2. 如果 x 应该排在 y 的后面,返回 1
3. 如果 x 和 y 相等,返回 0

所以我们可以自定义一个比较函数,并且传递给 sorted 函数:

In [3]: def reversed_cmp(x, y):...:     if x > y:...:         return -1...:     if x < y:...:         return 1...:     return 0...:In [4]: sorted([36, 5, 12, 9, 21], reversed_cmp)...: [36, 21, 12, 9, 5]...:
Out[4]: [36, 21, 12, 9, 5]

最后

本篇给出了一些内置高阶函数的例子,其实在编程中使用得更多的是自定义的高价函数,其中 闭包 就是一种非常常用的函数式编程。

Python 进阶_函数式编程相关推荐

  1. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊...

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

  2. Scala进阶_函数式编程(过滤丶排序丶分组丶聚合)

    过滤 | filter 过滤符合一定条件的元素 定义 方法签名 def filter(p: (A) ⇒ Boolean): TraversableOnce[A] 方法解析 filter方法 API 说 ...

  3. python支持函数式编程吗_利用Fn.py库在Python中进行函数式编程

    尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): ...

  4. 在 Python 中使用函数式编程的最佳实践!

    在函数式编程中,如何使用 Python 编写出优秀的代码? 作者 | Amandine Lee 译者 | 弯月 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 简介 Python 是一种 ...

  5. Python 进阶_生成器 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

  6. python语言支持函数式编程_python是函数式语言么

    函数式编程:functional,是一种编程范式. 函数式编程的特点:1. 把计算视为函数而非指令 2. 纯函数式编程:不需要变量,没有副作用,测试简单 3. 支持高阶函数,代码简洁 Python支持 ...

  7. python函数式编程模式_函数式编程指引

    概述¶ 本章介绍函数式编程的基本概念.如您仅想学习 Python 语言的特性,可跳过本章直接查看 迭代器. 编程语言支持通过以下几种方式来解构具体问题: 大多数的编程语言都是 过程式 的,所谓程序就是 ...

  8. python的函数式编程实例_函数式编程例子

    函数式编程例子 [篇一:函数式编程例子] 在 08 年的时候 ( 这经历记忆犹新 ) 我也跟 lz 一样,翻了好多文章, google 了好几个星期,最后我知道它 是这么个东西: ul li 它是函数 ...

  9. 【笔记】效率之门——Python中的函数式编程技巧

    文章目录 Python函数式编程 1. 数据 2. 推导式 3. 函数式编程 3.1. Lambda函数 3.2. python内置函数 3.3. 高阶函数 4. 函数式编程的应用 Python函数式 ...

最新文章

  1. Windows 7 开发新特性
  2. Expression Blend实例中文教程(2) - 界面快速入门
  3. 黑盒测试之等价类测试
  4. 复合的赋值运算符例题_Java千问:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!...
  5. 136 Single Number(找唯一数Medium)
  6. 计算机基础知识与基本操作文档,计算机基础知识与基本操作——图文混排课件...
  7. char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
  8. 10.FreeRTOS学习笔记-中断管理
  9. IT行业最重要的四件宝--我的实习体会
  10. c# winForm使用Aspose.Cells读取CSV文件中文乱码问题
  11. 小项目,吃货联盟,java初级小项目,源代码
  12. centos7.x使用yum安装nginx
  13. 2021年后Win10续用IE Flash插件的方法
  14. SPSS应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。
  15. 一文搞懂深度学习所有工具——Anaconda、CUDA、cuDNN
  16. VTK学习笔记(二十三)vtk空间几何变换
  17. Python中的字符串详解
  18. python爬取招聘网站源码及数据分析_Python爬取招聘网站进行数据分析,福利待遇一清二楚,高薪很简单...
  19. 搭建完美的数学计算环境: iTeXmacs+maxima
  20. 二叉树的中序遍历-python

热门文章

  1. iphone录屏怎么录声音_ev录屏怎么录制声音 ev录屏声音设置教程
  2. 回文数猜想代码c语言,跪求用C++写出回文数猜想程序,课程设计需要,谢谢。。。...
  3. 问题:AttributeError: module 'tensorflow' has no attribute 'gfile'
  4. 一个模型搞定图像标注、读图问答两件事,VQA准确率逼近人类水平 | Demo可玩...
  5. 放话挑战GPT-3!以色列推出参数多30亿、词条多5倍的新语言模型|公测不用排队...
  6. 马斯克刚失了一枚大火箭!
  7. CNCC技术论坛 | 面向人工智能芯片的编程语言和编译器
  8. iPhone用户状告App厂商手脚不干净,偷窥我电脑剪切板干什么
  9. 性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
  10. jquery easyui的应用-2