第 14 天:Python 高阶函数

函数式编程现在逐渐被广大开发群体接受,越来越多的开发者们开始使用这种优雅的开发模式,而我们使用函数式编程最主要的是需要清楚:

  1. 什么是高阶函数(Higher-order Functions)?

  2. Python 中高阶函数有哪些?要怎么用?

高阶函数概念

在函数式编程中,我们可以将函数当作变量一样自由使用。一个函数接收另一个函数作为参数,这种函数称之为高阶函数。

举个例子:

def high_func(f, arr): return [f(x) for x in arr]

上面的例子中, high_func 就是一个高阶函数。其中第一个参数 f 是一个函数,第二个参数 arr 是一个数组,返回的值是数组中的所有的值在经过 f 函数计算后得到的一个列表。例如:

from math import factorial
def high_func(f, arr): return [f(x) for x in arr]
def square(n): return n ** 2
# 使用python自带数学函数print(high_func(factorial, list(range(10))))# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
# 使用自定义函数print(high_func(square, list(range(10))))# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Python 常用高阶函数

如同java、scala等语言,我们很多常用的高阶函数基本都一致。在开发中我们经常使用的最基本的高阶函数其实就几个,而我们也可以基于这些函数去进行适当的扩展,那么下面开始介绍几种常用的高阶函数。

map

Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted.

根据提供的函数对指定序列做映射, 并返回映射后的序列,定义:

map(func, *iterables) --> map object
  • function # 序列中的每个元素需要执行的操作, 可以是匿名函数

  • *iterables # 一个或多个序列

正如前面所举的例子 high_func 函数, map 函数是 high_func 函数高阶版,可以传入一个函数和多个序列。

from math import factorial
def square(n): return n ** 2
# 使用python自带数学函数facMap = map(factorial, list(range(10)))print(list(facMap))# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
# 使用自定义函数squareMap = map(square, list(range(10)))print(list(squareMap))# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

可以看到输出了同样的结果,只是与 python2.X 不用的是, python3.X 中返回 map类 ,而前者直接返回一个列表。

我们使用匿名函数,也可以传入多个序列,如下

# 使用匿名函数lamMap = map(lambda x: x * 2, list(range(10)))print(list(lamMap))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 传入多个序列mutiMap = map(lambda x, y: x+y, list(range(10)), list(range(11, 15)))print(list(mutiMap))# print out: [11, 13, 15, 17]

reduce

Apply a function of two arguments cumulatively to the items of a sequence,from left to right, so as to reduce the sequence to a single value.

大致上来讲, reduce 函数需要传入一个有两个参数的函数,然后用这个函数从左至右顺序遍历序列并生成结果,定义如下:

reduce(function, sequence[, initial]) -> value
  • function # 函数, 序列中的每个元素需要执行的操作, 可以是匿名函数

  • sequence # 需要执行操作的序列

  • initial # 可选,初始参数

最后返回函数的计算结果, 和初始参数类型相同

简单举个例子:

# 注意,现在 reduce() 函数已经放入到functools包中。from functools import reduce
result = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
print(result)# print out 15

我们可以看到,序列 [1, 2, 3, 4, 5] 通过匿名函数进行了累加。

设定初始值:

# 设定初始参数:s = reduce(lambda x, y: x + y, ['1', '2', '3', '4', '5'], "数字 = ")
print(s)# print out:数字 = 12345

需要注意的是:序列数据类型需要和初始参数一致。

filter

Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true.

filter() 函数用来过滤序列中不符合条件的值,返回一个迭代器,该迭代器生成那些函数(项)为true的iterable项。如果函数为None,则返回为true的项。定义如下:

filter(function or None, iterable) --> filter object
  • function or None # 过滤操作执行的函数

  • iterable # 需要过滤的序列

举个例子:

def boy(n): if n % 2 == 0: return True return False
# 自定义函数filterList = filter(boy, list(range(20)))
print(list(filterList))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 自定义函数filterList2 = filter(lambda n: n % 2 == 0, list(range(20)))
print(list(filterList2))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

上面我们可以看到,列表中不能被 2 整除的数据都被排除了。

sorted

Return a new list containing all items from the iterable in ascending order.

A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order.

sorted 函数默认将序列升序排列后返回一个新的 list,还可以自定义键函数来进行排序,也可以设置 reverse 参数确定是升序还是降序,如果 reverse = True 则为降序。函数定义如下:

def sorted(iterable: Iterable[_T], *, key: Optional[Callable[[_T], Any]] = ..., reverse: bool = ...) -> List[_T]: ...
  • iterable # 序列

  • key # 可以用来计算的排序函数。

  • reverse # 排序规则,reverse = True降序,reverse = False 升序(默认)。

举个简单例子:

list01 = [5, -1, 3, 6, -7, 8, -11, 2]list02 = ['apple', 'pig', 'monkey', 'money']
print(sorted(list01))# print out: [-11, -7, -1, 2, 3, 5, 6, 8]
print(sorted(list01, key=abs))# print out: [-1, 2, 3, 5, 6, -7, 8, -11]
# 默认升序print(sorted(list02))# print out: ['apple', 'money', 'monkey', 'pig']
# 降序print(sorted(list02, reverse=True))# print out: ['pig', 'monkey', 'money', 'apple']
# 匿名函数排序print(sorted(list02, key=lambda x: len(x), reverse=True))# print out: ['monkey', 'apple', 'money', 'pig']

总结

以上我们简单的介绍了几个常用的高阶函数的使用,当然还有很多的高阶函数我们可以去研究,比如 zip 函数等,希望此节的介绍对大家有所帮助。

代码地址

python 高阶函数[1]

参考资料

[1]

python 高阶函数: https://github.com/JustDoPython/python-100-day/tree/master/day-005

系列文章

第10天:Python类与对象

(0)

相关推荐

  • 面试题-python3 内置函数map reduce filter 如何使用?

    前言 面试时候经常会考到 map reduce filter 这三个内置函数的使用 map() 函数 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个 ...

  • 弄懂这 5 个问题,拿下 Python 迭代器

    我的施工之路 1.我的施工计划 2.数字专题 3.字符串专题 4.列表专题 5.流程控制专题 6.编程风格专题 7.函数使用 8.面向对象编程(上篇) 9.面向对象编程(下篇) 10.十大数据结构 1 ...

  • 学Python2好还是Python3好?小白必看!

    近期有人咨询小编:学Python用Python2好还是Python3好?Python3和Python2有什么区别呢?我们一起来看看吧. Python3和Python2区别还是挺大的. Python2和 ...

  • 第一次把 Python 的切片理解得如此透彻

    来源:Python猫 作者:豌豆花下猫 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice) ...

  • Python高阶函数

    该篇中主要介绍什么是高阶函数,高阶函数的用法以及几个常见的内置的高阶函数. 什么是高阶函数? 高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身, ...

  • 安利5个Python高阶函数:lambda,Map,Filter,Itertools,Generat...

    任何编程语言的高级特征通常都是通过大量的使用经验才发现的.比如你在编写一个复杂的项目,并在 stackoverflow 上寻找某个问题的答案.然后你突然发现了一个非常优雅的解决方案,它使用了你从不知道 ...

  • 没有学不会的python--函数式编程以及高阶函数

    没有学不会的python 函数式编程 到现在为止,我们的没有学不会python系列文章已经讲了很多知识点了,如果是第一次刷到这篇文章的朋友可以去我主页看一下以前写的文章.前面讲了很多知识点,每个知识点 ...

  • 高阶函数

    高阶函数 函数柯里化 函数柯里化,又称部分求值.一个currying函数首先会接收一些参数,接受这些参数后该函数不会立即求值.而是会将传入的参数在函数内保存,待函数真正需要求值时,之前的所有参数都会被 ...

  • js 高阶函数reduce ——数组取交集、并集

    两个数组取交集 vs 多个数组取交集 => js reduce函数的妙用 1.reduce函数的用法及取数组交集 <script> // 值集数组 let arr1 = [1,2] ...

  • Julia机器核心编程.高阶函数

    我这个起名好麻烦,都说函数完了.有整出来一个高阶函数,比较麻烦. 嵌套函数,简单来说,就是在函数中定义函数. 闭包是一个函数对象,它可以记住封闭范围中的值,即使它们不在内存中也是如此. 嵌套函数有助于 ...

  • 4个vlookup函数的高阶用法

    一.提取固定长度的数字 如下图,我们想要提取工号,只需要将函数设置为:=VLOOKUP(0,{0,1}*MID(A2,ROW($1:$30),6),2,0), 因为这个一个数组公式所以我们要按Ctrl ...

  • 这些高阶的函数技术,你掌握了么

    在 JavaScript 中,函数为一等公民(First Class),所谓的 "一等公民",指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另 ...

  • Python 内置函数最全汇总,现看现用

    今天,好好看看这些Python内置函数,也许你明天就能用到Python 内置函数最全汇总:1 abs()绝对值或复数的模In [1]: abs(-6)Out[1]: 62 all() 接受一个迭代器, ...