Python中的高阶函数和闭包概念
高阶函数和闭包是 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 中的高阶函数和闭
