欢迎访问宙启技术站
智能推送

Python中高阶函数的定义和使用方法

发布时间:2023-05-20 17:05:46

Python中的高阶函数是指能够接受另一个函数作为参数,或者能够返回一个函数作为结果的函数。这种特性使得Python中的高阶函数非常灵活且功能强大,可以极大地减少代码量,提高代码的可读性和可维护性。本文将介绍Python中高阶函数的定义和使用方法,以及相关的例子和应用。

高阶函数的定义

在Python中,函数也是一种对象,因此可以将函数作为参数传递给另一个函数或作为函数的返回值。这种将函数作为参数或返回值的函数就是高阶函数。Python中内置了很多高阶函数,例如map、filter、reduce等,同时我们也可以自己定义高阶函数。

下面是一个简单的例子,其中func为一个高阶函数,它将另一个函数作为参数:

def func(f, lst):
    return [f(x) for x in lst]

def square(x):
    return x ** 2

lst = [1, 2, 3, 4, 5]
print(func(square, lst))

输出结果为:[1, 4, 9, 16, 25]

在上述例子中,函数func接受一个函数f和一个列表lst作为参数,然后使用列表推导式返回了f作用于lst中每个元素后的结果。在调用函数func时,我们传递了函数square和列表lst作为参数。函数square会将它的参数平方后返回,而函数func会将函数square作用于列表lst中的每个元素来得到一个新的列表。

高阶函数的使用方法

高阶函数的使用方法与普通函数并无区别,只需要将另一个函数作为参数传递给高阶函数或将高阶函数的返回值赋值给一个变量即可。

map

map函数是Python中非常常用的高阶函数之一,它可以将一个函数作用于一个迭代器或容器中的每个元素,并返回一个新的容器。map函数的基本语法如下:

map(function, iterable, ...)

其中,function为作用于每个元素的函数,iterable为待处理的迭代器或容器。注意:多个iterable参数可以用逗号隔开,如果function接受多个参数,则第i个参数来自iterable的第i个元素。例如:

lst1 = [1, 2, 3, 4, 5]
lst2 = [6, 7, 8, 9, 10]
result = map(lambda x, y: x + y, lst1, lst2)

上述代码中,我们使用了lambda表达式创建了一个函数,将lst1和lst2中对应位置的元素相加,然后使用map函数将其作用于lst1和lst2中的每个元素。最终的结果将被保存在result中,并且其类型为map对象。

如果我们希望将map对象转换为列表,则可以使用list函数进行转换:

lst = list(result)  # [7, 9, 11, 13, 15]

filter

filter函数也是Python中非常常用的高阶函数之一,它可以根据函数的返回值确定哪些元素应该被保留,并将其返回为一个新的容器。filter函数的基本语法如下:

filter(function, iterable)

其中,function为返回值为True或False的函数,iterable为待处理的迭代器或容器。注意:返回值为True的元素会被保留,返回值为False的元素会被过滤掉。

例如:

lst = [1, 2, 3, 4, 5]
result = filter(lambda x: x % 2 == 0, lst)

上述代码中,我们使用了lambda表达式创建了一个函数,判断lst中的每个元素是否为偶数。然后使用filter函数将其作用于lst中的每个元素。最终的结果将被保存在result中,并且其类型为filter对象。

如果我们希望将filter对象转换为列表,则可以使用list函数进行转换:

lst2 = list(result)  # [2, 4]

reduce

reduce函数也是Python中非常常用的高阶函数之一,它可以根据一个二元操作函数对一个序列的元素逐个进行操作,并返回最终的结果。reduce函数的基本语法如下:

reduce(function, sequence[, initial])

其中,function为接受两个参数并返回一个结果的函数,sequence为待操作的序列。注意:sequence必须是可迭代的,并且function为二元操作函数。initial为可选参数,表示初始值。

例如:

from functools import reduce

lst = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x + y, lst)

print(result)  # 15

上述代码中,我们使用了lambda表达式创建了一个函数,将lst中的每个元素相加,然后使用reduce函数将其作用于lst中的每个元素。最终的结果将被保存在result中。

使用高阶函数的例子

高阶函数也可以应用在其他场景中,下面是几个使用高阶函数的例子。

例子1:函数的包装器

函数的包装器是一种非常常用的高阶函数,它可以在原函数的基础上包装一些功能,例如增加日志、计时、验证等。下面是一个简单的函数包装器例子:

import time
import logging

def wrapper(func):
    def inner(*args, **kwargs):
        logging.info('start...')
        t1 = time.time()
        res = func(*args, **kwargs)
        t2 = time.time()
        logging.info('elapsed time: %.2f' % (t2 - t1))
        logging.info('end.')
        return res
    return inner

@wrapper
def add(x, y):
    return x + y

print(add(1, 2))

上述代码中,我们定义了一个函数wrapper,它接受一个函数func作为参数,返回一个新的函数inner。inner函数中先打印了一个日志,然后记录了函数执行前的时间t1,执行函数func,记录函数执行后的时间t2,再打印一个日志,最后返回函数的执行结果res。

接下来,我们使用@语法糖将函数add包装起来,@语法糖可以将函数add作为参数传递给函数wrapper,并将wrapper返回的新函数inner赋值给add。当我们调用函数add时,实际上是在调用inner函数,inner函数会先执行wrapper函数中定义的日志和计时功能,然后再执行实际的函数add,最后再执行wrapper函数中定义的日志和计时功能。

例子2:函数的缓存

函数的缓存是一种非常常用的高阶函数,它可以记录函数的执行结果,并将其保存在一个字典中,下次再调用函数时,如果参数相同,则直接从字典中取出结果,无需再次执行函数。下面是一个简单的函数缓存例子:

import functools

def cache(func):
    cache_data = {}

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        key = str(args) + str(kwargs)
        if key not in cache_data:
            cache_data[key] = func(*args, **kwargs)
        return cache_data[key]

    return wrapper

@cache
def fib(n):
    if n <= 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

print(fib(100))

上述代码中,我们定义了一个函数cache,它接受一个函数func作为参数,返回一个新的函数wrapper。wrapper函数中