Python高阶函数(Higher-order Function)
Python高阶函数(Higher-order Function)
abs()这个内置函数来得到一个数的绝对值
print(abs(-100)) #输出:100
我们把代码修改下,把abs赋值给一个变量:
f = abs
print(f(-100)) #输出:100
函数名其实就是指向函数的变量, abs(-100)是函数调用,而其名称abs是函数本身,我们可以将其赋值给变量,这样一来,变量可以指向(引用)函数,这时变量就获得了函数的功能,如上例中的 f ,直接调用f()和直接调用abs()完全相同。
既然变量可以指向函数,函数的参数能接收变量,那么,一个函数就可以接收另一个函数作为参数,这是高阶函数的一种情况。
什么是高阶函数?能接受函数名作为参数传入或把函数名做为结果值返回的函数,称为高阶函数。
具体说来,只要满足下面的任意一个条件就是高阶函数:
1、接受另外一个函数名作为参数传。
2、返回值(return)为另外一个函数名。
接受另外一个函数名作为参数传的情况,示例源码如下:
def fun():
print("这是fun函数输出")
def high_fun(func): #接受另外一个函数名作为参数传
print("high_fun函数输出")
# 在函数内部,通过传入的函数参数调用
func()
high_fun(fun)
运行效果:
下面再看一个例子
定义一个 myAdd 函数,它接受三个参数 x, y, f,其中 x, y 是数字,f 是一个函数。源码如下:
def myAdd(x, y, f):
return f(x) + f(y)
result = myAdd(-12, -98, abs) #abs是内置的求绝对值的函数
print(result) #输出结果:110
运行效果:
返回值(return)为另外一个函数名的情况,示例源码如下:
def fun():
print("这是fun函数输出")
def high_fun(func):
print("high_fun函数输出")
return func #返回值(return)为另外一个函数名
result = high_fun(fun)
result()
运行效果:
需要留意一点,若要高阶函数的返回值为函数,则必须要把函数作为参数传入。
下面介绍几个python提供的常用高阶函数
如map()、filter()和reduce()函数等。
map()和filter()是内置函数【关于内置函数官方文档https://docs.python.org/zh-cn/3/library/functions.html】
reduce()不是一个内置函数,在functools模块【关于functools 模块官方文档https://docs.python.org/zh-cn/3/library/functools.html 】中。需要先import,如:
from functools import reduce
map函数
基本语法是map(function, iterable, ...)
接收的参数,第一个是函数名,后面的是可迭代(iterable)对象,其功能是将迭代对象中的每一个项(元素)作为函数的参数依次传入到函数值中执行加工。当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。返回值是一个迭代器(Iterator)对象。
例1、源码如下:
def f(x):
return x**2 #返回一个数的2次方
r = map(f, [1, 2, 3, 4, 5])
print(list(r)) #输出:[1, 4, 9, 16, 25]
运行效果:
例子中,用map函数,可以让列表中的每一个数都完成一次对函数参数的调用,并将结果返回到一个可迭代对象中。
通过 list(map()) 将map函数返回的迭代对象转化为列表。
例2、Map可以和lambda函数联合使用:
calc = lambda x: x**2
r1= map(calc, [1, 2, 3, 4, 5])
print(list(r1)) #输出:[1, 4, 9, 16, 25]
#上面的代码和下面的代码等效
r2= map(lambda x: x**2, [1, 2, 3, 4, 5])
print(list(r2)) #输出:[1, 4, 9, 16, 25]
运行效果:
例3、当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束:
print(list(map(lambda x, y : x + y, [1, 2, 3], [1, 2, 3, 4]))) #输出:[2, 4, 6]
print(list(map(lambda x, y : x + y, [1, 2, 3, 4], [1, 2, 3]))) #输出:[2, 4, 6]
filter()函数
基本语法如下:
filter(function, iterable)
前者为函数,后者为可迭代(iterable)对象
filter函数其主要功能是过滤,如果是一个函数的话,则将第二个可迭代对象里的每一个元素作为函数的参数进行计算,把返回True的值筛选出来;如果第一个参数为None,则直接将第二个参数中为True的值筛选出来。其返回值构成迭代器(iterator)对象。
例1、源码如下:
def is_odd(n):
return n % 2 == 1
res = filter(is_odd, range(10))
print(list(res)) #输出:[1, 3, 5, 7, 9]
例2、将上例改用lambda函数:
res = filter(lambda x : x % 2, range(10))
print(list(res)) #输出:[1, 3, 5, 7, 9]
例3、第一个参数为None的情况:
temp = filter(None, [1, 0, False, True])
print(list(temp)) #输出:[1, True]
reduce函数
基本语法如下:
reduce(function, sequence [,initializer] )
说明:function有两个参数,reduce依次从iterable中取一个元素,和上一次调用function的结果做参数,再次调用function。
若提供initializer参数,会以iterable中的第一个元素和initializer作为参数调用function。
其返回值为单一的值。
示例源码如下:
from functools import reduce
calc = lambda x, y: x+y
res1 = reduce(calc, [1, 2, 3, 4]) #计算 (((1+2)+3)+4)的值
print(res1)
res2 = reduce(calc, [1, 2, 3, 4],100) #计算 ((((100+1=)+2)+3)+4) 的值
print(res2)
运行效果: