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)

运行效果:

猜你喜欢

转载自blog.csdn.net/cnds123/article/details/129892762
今日推荐