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

python中的闭包函数有哪些

发布时间:2023-05-14 02:41:22

Python中的闭包函数是一种非常强大的编程技巧,它允许我们在函数中嵌套函数,并且可以使内部的函数持有外部函数的局部变量,以避免变量被外部函数修改所导致的问题。实际上,在Python中定义闭包函数的方法非常简单,只需要在一个函数中再定义一个函数,并将内部函数返回即可。下面我们来介绍一下Python中常见的闭包函数。

1. 计数器函数

计数器函数是闭包函数的最简单的类型之一。这种函数可以用来计数,通常会统计某一个事件发生的次数。例如,我们可以编写一个函数,用来计算一个函数被调用的次数。

示例代码:

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

在上面的代码中,我们定义了一个counter函数,并在其中定义了一个inner函数,这个函数可以访问counter函数的局部变量,并对它进行修改。

现在,我们可以创建一个计数器对象,并使用它来计数函数被调用的次数:

c = counter()

print(c())
print(c())
print(c())

运行上面代码后,我们可以看到输出:

1
2
3

2. 缓存函数

缓存函数是另一种非常常见的闭包函数类型,通常用于缓存一些数据以避免重复计算。

示例代码:

def cache(func):
    memo = {}
    
    def inner(n):
        if n not in memo:
            memo[n] = func(n)
        return memo[n]
    
    return inner

在上述代码中,我们定义了一个缓存函数cache,它的参数是一个函数func。在这个函数中,我们定义了一个内部函数inner,并创建了一个空字典memo。当inner函数接收到一个参数n时,它会首先检查这个参数是否已经存在memo字典中,如果是,就直接从memo字典中返回对应的值;如果不是,就调用func函数,并将得到的结果缓存到memo字典中,再将结果返回。

现在,我们可以编写一个函数来进行测试:

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

在上述代码中,我们编写了一个名为fib的函数,并使用@cache装饰器将它转换为一个缓存函数。这个函数的实现很简单,它使用递归的方式计算斐波那契数列。由于使用了缓存函数,当我们第二次调用这个函数时,计算过程就会变得非常快。

3. 装饰器函数

装饰器函数也是一种闭包函数类型。它通常用于对其他函数进行修饰,以添加一些额外的功能。

示例代码:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before the function is called.")
        result = func(*args, **kwargs)
        print("After the function is called.")
        return result
    return wrapper

在上述代码中,我们定义了一个my_decorator函数,并创建了一个内部函数wrapper。当使用my_decorator装饰一个函数时,wrapper函数就会替代原始的函数。在wrapper函数中,我们首先输出一条信息,然后调用原始的函数,并将结果返回。接着,我们再输出另一条信息。

现在,我们可以定义一个名为my_function的函数,并使用my_decorator进行修饰:

@my_decorator
def my_function():
    print("This is my function.")

在上述代码中,我们使用@my_decorator装饰my_function函数。当我们调用这个函数时,装饰器就会自动地添加前后缀信息。

4. 生成器函数

生成器函数也是一种常见的闭包函数类型,它通常用于生成一系列的值,而不需要一次性将这些值全部计算完毕。

示例代码:

def my_generator():
    for i in range(10):
        yield i * i

在上述代码中,我们定义了一个my_generator函数,它使用了一个yield语句来产生一系列的值。当我们调用这个函数时,它会返回一个生成器对象。每次我们对这个对象进行迭代时,它都会生成一个新的值。

现在,我们可以对这个生成器对象进行迭代,并输出它所产生的值:

g = my_generator()

for i in g:
    print(i)

运行上面代码后,我们可以看到输出:

0
1
4
9
16
25
36
49
64
81

5. 实例方法

实例方法也可以视为一种闭包函数类型。它通常用于给Python类添加一些额外的方法。

示例代码:

class MyList:
    def __init__(self, lst):
        self.lst = lst

    def __call__(self):
        return self.lst

    def apply(self, func):
        return MyList([func(x) for x in self.lst])

在上述代码中,我们定义了一个MyList类,并实现了两个方法。__call__方法可以使实例像一个函数一样被调用;apply方法接受一个函数作为参数,并返回一个新的MyList实例,其中包含对原始列表中所有元素应用该函数后的结果。

现在,我们可以创建一个名为my_list的MyList实例,并对它应用apply方法,以将所有元素平方:

my_list = MyList([1, 2, 3, 4, 5])

result = my_list.apply(lambda x: x**2)()

print(result)

运行上面代码后,我们可以看到输出:

[1, 4, 9, 16, 25]

总结

本文介绍了Python中的五种常见闭包函数类型:计数器函数、缓存函数、装饰器函数、生成器函数和实例方法。闭包函数是一种非常有用的编程技巧,它可以使我们写出更加简洁、灵活的代码。掌握了这些闭包函数的基本概念和用法之后,我们就可以更加自如地处理各种复杂的编程问题。