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

Python中的高阶函数和闭包概念

发布时间:2023-06-06 11:17:40

高阶函数和闭包是 Python 中非常重要的概念。高阶函数可以接收其他函数作为参数,或者返回一个函数作为结果,是函数式编程的核心思想;而闭包则是函数式编程中的特殊技巧,可以捕获外部函数的局部变量,将其封装在内部函数中。这篇文章将详细介绍 Python 中的高阶函数和闭包。

一、高阶函数

1.1 什么是高阶函数

高阶函数(Higher-Order Function)是指接收其他函数作为参数,或者返回一个函数作为结果的函数,其实质是将函数当作一等公民对待。函数可以像变量一样被赋值、转换、操作,可以作为参数传递到另一个函数中,或者作为另一个函数的返回值。

1.2 高阶函数的应用

高阶函数可以优雅地实现很多编程任务,包括但不限于以下几个方面:

1. 映射(Map):接收一个函数和一个序列作为参数,将函数作用于序列中的每一个元素,返回一个新的序列。

2. 过滤(Filter):接收一个函数和一个序列作为参数,根据函数的结果来筛选序列中的元素,返回一个新的序列。

3. 聚合(Reduce):接收一个函数和一个序列作为参数,对序列中的元素进行聚合操作,返回一个单值结果。

4. 化简(Fold):类似于聚合操作,但与聚合不同的是化简操作可以接收一个初始值作为起点。

5. 排序(Sort):接收一个函数和一个序列作为参数,按照函数的要求来排序序列中的元素,返回一个新的序列。

6. 懒惰求值(Lazy Evaluation):将函数映射到序列中的每一个元素时,并不立即执行函数,而是返回一个生成器,只有在需要使用时才会真正执行计算。

1.3 高阶函数的实现

下面是一些 Python 中常用的高阶函数:

1. map(function, iterable, ...):将函数作用于可迭代对象中的每一个元素,返回一个新的列表。

def square(x):
    return x * x

list1 = [1, 2, 3, 4, 5]
result = map(square, list1)
print(result)
# Output: <map object at 0x000001>

result = list(result)
print(result)
# Output: [1, 4, 9, 16, 25]

2. filter(function, iterable):根据函数的结果来筛选可迭代对象中的元素,返回一个新的列表。

def is_even(x):
    return x % 2 == 0

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = filter(is_even, list1)
print(result)
# Output: <filter object at 0x000002>

result = list(result)
print(result)
# Output: [2, 4, 6, 8, 10]

3. reduce(function, iterable[, initializer]):将可迭代对象中的元素进行聚合操作,返回一个单值结果。

from functools import reduce

def add(x, y):
    return x + y
    
list1 = [1, 2, 3, 4, 5]
result = reduce(add, list1)
print(result)
# Output: 15

4. sorted(iterable[, key][, reverse]):将可迭代对象中的元素按照函数的要求进行排序,返回一个新的列表。

list1 = [1, 8, 3, 6, 5, 4, 7, 2, 9, 10]
result = sorted(list1)
print(result)
# Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

5. lazy_eval(creater):将函数映射到序列中的每一个元素时,并不立即执行函数,而是返回一个生成器。

def square(x):
    return x * x

def lazy_eval(creator):
    def wrapper(*args, **kwargs):
        for val in creator(*args, **kwargs):
            yield val
    return wrapper

list1 = [1, 2, 3, 4, 5]
result = lazy_eval(map)(square, list1)
print(result)
# Output: <generator object lazy_eval.<locals>.wrapper at 0x000003>

result = list(result)
print(result)
# Output: [1, 4, 9, 16, 25]

二、闭包

2.1 什么是闭包

闭包(Closure)可以理解为封闭的包裹,在 Python 中是指可以捕获外部函数中的局部变量,将其封装在内部函数中,返回内部函数的一个函数对象。这个函数对象可以随时被调用,访问局部变量的值,即便外部函数已经执行完毕,局部变量也不会被销毁,因为它们被封装在闭包内部。闭包的一个重要特点是可以沿用外部函数的环境。

2.2 闭包的应用

闭包可以用来创建工厂函数,生成特定的函数对象,每个函数对象都有不同的状态,且状态受外部变量的影响。常见的应用场景包括但不限于以下几个方面:

1. 实现计数器:每次调用函数计数器加1,记录函数被调用次数。

def counter():
    count = 0
    def inc():
        nonlocal count
        count += 1
        return count
    return inc

c = counter()
print(c()) # Output: 1
print(c()) # Output: 2
print(c()) # Output: 3

2. 实现缓存机制:每次调用函数时,检查是否有缓存数据,如果有直接返回,否则执行函数并缓存结果。

def cache(func):
    c = {}
    def wrapper(*args):
        if args not in c:
            c[args] = func(*args)
        return c[args]
    return wrapper

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

print(fib(10)) # Output: 55
print(fib(11)) # Output: 89
print(fib(12)) # Output: 144

3. 实现装饰器:根据外部变量的值来选择是否执行被装饰函数。

def debug(debug_mode=False):
    def wrapper(func):
        def inner(*args, **kwargs):
            if debug_mode:
                print(f'function {func.__name__} called.')
            return func(*args, **kwargs)
        return inner
    return wrapper

@debug(debug_mode=True)
def square(x):
    return x * x

print(square(4)) # Output: function square called. 16

2.3 闭包的实现

为了实现闭包,我们需要在外部函数中定义一个内部函数,内部函数捕获外部函数的变量,并返回一个函数对象。下面是一个简单的例子:

def outer_func(text):
    def inner_func():
        print(text)
    return inner_func

f = outer_func('Hello, Python!')
f() # Output: Hello, Python!

在这个例子中,outer_func 函数接收一个 text 参数,并返回一个 inner_func 函数对象。当 inner_func 被调用时,它会打印出 text 变量的值。因为 text 变量被捕获在 inner_func 中,不会被销毁。

三、总结

本文介绍了 Python 中的高阶函数和闭