美文网首页
Python高阶函数

Python高阶函数

作者: GoPython | 来源:发表于2019-02-17 18:41 被阅读0次

    本文要点

    1.什么是高阶函数

    2.python中有哪些常用的高阶函数

    什么是高阶函数?

    在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在 python 中一切皆对象,函数也不例外。比如求绝对值函数 abs,我们可以用一个变量 f 指向 abs 函数,那么当调用 f() 的时候可以得到和 abs() 一样的效果,这说明变量可以指向函数!

    同理我们将 abs 指向另一个函数 abs = len,那么 abs 将不再是求绝对值的函数了,abs指向的是求长度的 len 函数。这说明函数名其实就是指向函数的变量!

    既然变量可以指向函数,而函数的参数可以接收变量。也就是说一个函数可以接收另一个函数作为参数。下面我们来看一个DEMO。定义一个 add 函数,它接受三个参数 x, y, f,其中 x, y 是数字,f 是一个函数。

    1defadd(x, y, f):

    2returnf(x) + f(y)

    3

    4result = add(-12,-98, abs)

    5print(result)

    输出结果:110

    上面的 add() 函数就是一个高阶函数,其实高阶函数的概念很简单,能接收函数作参数的函数就是高阶函数。

    python中常用的高阶函数

    1.map()

    map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

    例如,对于 list [1, 2, 3, 4, 5, 6, 7, 8, 9]

    如果希望把 list 的每个元素都作平方,就可以用 map() 函数:

    因此,我们只需要传入函数 f(x)=x * x,就可以利用 map() 函数完成这个计算:

    1deff(x):

    2returnx * x

    3

    4

    5print(list(map(f, [iforiinrange(1,10)])))

    输出结果:

    1[1,4,9,16,25,36,49,64,81]

    注意:map() 函数不改变原有的 list,而是返回一个新的 list。

    由于 list 包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

    2.reduce()

    reduce() 函数接收的参数和 map() 类似,一个函数 f,一个 list,但行为和 map() 不同,reduce() 传入的函数 f 必须接收两个参数,reduce() 对 list 的每个元素反复调用函数f,并返回最终结果值。

    下面我们来看个 demo:

    1defprod(x, y):

    2returnx * y

    3

    4

    5print(reduce(prod, [2,4,5,7,12]))

    输出结果:3360

    prod() 函数接收两个参数,返回 x 和 y 的乘积

    调用 reduce(prod, [2, 4, 5, 7, 12]) 时,reduce 函数将做如下计算:

    先计算头两个元素prod(2, 4)结果为:8,

    再把计算结果和第3个元素传给 prod(8, 5) 结果为:40,

    再把计算结果和第4个元素传给 prod(40, 7) 结果为:280,

    再把计算结果和第5个元素传给 prod(280, 12) 结果为:3360,

    由于没有更多元素了,最终返回结果:3360

    reduce() 还可以接收第 3 个可选参数,作为计算的初始值。如果把初始值设为 100,计算:

    1reduce(prod, [2,4,5,7,12],100)

    结果变为:336000,因为第一轮的计算是:

    计算初始值和第一个元素:prod(100, 2),结果为:200。

    3.filter()

    filter() 函数是 Python 内置的另一个有用的高阶函数,filter() 函数接收一个函数 f 和一个 list,这个函数 f 的作用是对每个元素进行判断,返回 True 或 False,filter() 根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新 list。

    例如,要从一个 list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

    1defis_odd(x):

    2

    3ifx %2==1:

    4returnx

    然后用 filter() 过滤掉偶数:

    1print(list(filter(is_odd, [1,4,6,7,9,12,17])))

    结果:[1, 7, 9, 17]

    利用 filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:

    1defis_not_empty(s):

    2returnsandlen(s.strip()) >0

    3

    4print(list(filter(is_not_empty, ['test',None,'','str','  ','END'])))

    1

    给大家留一个小小的练习题:

    请利用 filter() 过滤出1~100中平方根是整数的数,即结果应该是:

    1[1,4,9,16,25,36,49,64,81,100]

    相关文章

      网友评论

          本文标题:Python高阶函数

          本文链接:https://www.haomeiwen.com/subject/pifneqtx.html