本文概括介绍Python函数式编程的一些概念及用法,详细请参考:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6aa24068b4c50a7e71501ab275d52000

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

1、高阶函数
高阶函数英文叫Higher-order function。什么是高阶函数?
变量可以指向函数,函数名也是变量。那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
编写高阶函数,就是让函数的参数能够接收别的函数。
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

# 一个最简单的高阶函数:
def add(x, y, f):return f(x) + f(y)# 当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数
# 定义,我们可以推导计算过程为:
x = -5
y = 6
f = abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
return 11

1.1、map/reduce
Python内建了map()和reduce()函数。

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
python代码实现:

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

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

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

python代码实现:

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

将两个函数结合使用,实现更多的功能:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> def char2num(s):
...     digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
...     return digits[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579# 整理成一个str2int的函数就是:
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}def str2int(s):def fn(x, y):return x * 10 + ydef char2num(s):return DIGITS[s]return reduce(fn, map(char2num, s))

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

#在一个list中,删掉偶数,只保留奇数,可以这么写:
def is_odd(n):return n % 2 == 1list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]#把一个序列中的空字符串删掉,可以这么写:
def not_empty(s):return s and s.strip()list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
# 结果: ['A', 'B', 'C']

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

1.3、sorted
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。
python代码实现:

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]# sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']# 可实现忽略大小写的排序:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']# 要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

对列表中每一个按照key规定的方法进行操作后再进行排序。
sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。

Python函数式编程简介(一)高阶函数相关推荐

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

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

  2. Python 函数式编程,Python中内置的高阶函数:map()、reduce()、filter()与sorted(),Python中返回函数

    函数式编程 是一种编程范式,比函数更高层次的抽象. 函数式编程将计算视为函数而非指令. 纯函数式编程:不需要变量,没有副作用,测试简单. 支持高阶函数,代码简洁. Python 支持的函数式编程 不是 ...

  3. 【吐血整理】Python 常用的几种高阶函数和简单的迭代函数

    目录 一.all() 函数--判断可迭代对象中的元素是否全为True 二.any() 函数--判断可迭代对象是否全为假值 三.filter() 函数--通过指定条件过滤序列 四.map() 函数--- ...

  4. Scala编程基础——集合高阶函数

    Scala编程基础--集合&高阶函数 集合 Scala中集合分为可变集合和不可变集合 可变集合:可以修改.添加.移除一个集合的元素. 不可变集合:安全的并发访问. 不可变集合,相比之下,永远不 ...

  5. Python函数式编程简介(二)返回函数

    本文为Python函数式编程的第二部分主要讲解返回函数和闭包 2.返回函数 2.1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常 ...

  6. Kotlin 编程核心基石—高阶函数

    前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...

  7. python基础之常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  8. python中的内置高阶函数

    一. 内置高阶函数的类型 (一).内置高阶函数map """ map():接收两个参数,一个是函数 一个是序列 map将传入的函数依次作用到序列的每个元素,并且把结果作为 ...

  9. python按照绝对值排序_Python高阶函数sorted排序

    sorted用法 sorted是Python提供的功能强大的排序函数.满足字符,数字等排序要求. 对数字进行排序: list = [-12, -2, -24, 20, 39, 10]; print(s ...

最新文章

  1. Web目录全能扫描工具DirBuster
  2. linux centos7 createrepo 创建本地 yum 仓库
  3. [Ubuntu软件]好用轻巧的录屏软件——Kazam
  4. pandas:数据类型的转换
  5. 近百家公司高级运维的面试题汇总
  6. Codeup1085: 阶乘的和
  7. idea 断点下一步快捷件_Intellij IDEA 创建控制台项目,断点调试快捷方式
  8. python2最新版本_Python 2.7.18发布,Python 2的最新版本
  9. java ssh 启动时间_java ssh项目启动异常说明
  10. dede WAP 版 限制标题title的字数的方法
  11. ETL设计详解(数据抽取、清洗与转换)
  12. 视频直播方案(加强版
  13. 【人生如逆旅,我亦是行人】-半年总结
  14. Doctrine浅析
  15. 麦克风声源定位原理_一种利用麦克风阵列进行声源定位的方法与流程
  16. bigemap地图源?
  17. ln lg,log在c语言中的表示-----转载自yam_killer的专栏
  18. YYCMS搭建影视网站教程
  19. 网络安全知识之什么是网络安全?
  20. 笑话hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

热门文章

  1. linux df -h卡成狗
  2. ”盒模型“之如何防止边框和内边距把元素撑开
  3. java基础:数据类型
  4. java数据结构之排序-- 插入排序算法
  5. [linux] 查看网络丢包信息
  6. 互联网时代的应用设计,互联网营销
  7. 将分享按钮加入到页面中
  8. 国产海量存储系统的新突破
  9. Linux 用户(user)和用户组(group)管理概述
  10. Laravel 将数据表中的数据导出,并生成seed文件