“闭包”是什么?| Python 主题月

简介: “闭包”是什么?| Python 主题月

什么是闭包


Python中的闭包是一个比较模糊的概念,有很多朋友都认为不好理解,但是随着深入学习,就会发现闭包无论如何都是需要去理解的,下面我将自己对闭包的理解进行阐述,希望能够对你有所帮助 ~


我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。


闭包的格式


如下:


def 外层函数(参数):
    def 内层函数():
        print("内层函数执行", 参数)
    return 内层函数
内层函数的引用 = 外层函数("传入参数")
内层函数的引用()
复制代码


外层函数中的参数,不一定要有,据情况而定,但是一般情况下都会有并在内函数中使用到


闭包的实例


如下:


def outfunc(a):   # 定义外函数
    def infunc(b):  # 定义内函数
        return a*b  # 内函数的返回值
    return infunc   # 外函数的返回值,返回内函数的对象
func_instance = outfunc(8)   # 外函数的实例,是一个function对象
print(type(func_instance))   # 打印外函数实例的类型
res = func_instance(10)      # 外函数实例的调用
print(res)
复制代码


输出


➜  test git:(master) ✗ python3 testpy.py
<class 'function'>
80
复制代码


在上面的代码中,内函数直接使用了外函数的变量值,那如果想要在内函数中对外函数的变量值进行修改,怎么操作呢?


修改外函数的变量值


想要修改外函数的变量值,需要用到nonlocal关键字。


def outfunc(a):
    def infunc(b):
        nonlocal a
        a = a*2
        return a*b
    return infunc
func_instance = outfunc(8)
print(type(func_instance))
res = func_instance(10)
print(res)
复制代码


输出


➜  test git:(master) ✗ python3 testpy.py
<class 'function'>
160
复制代码


如上即可。


闭包的使用场景


Python中,闭包的主要用途就是用于装饰器的实现。后续讲解。

还有就是可以简化参数重复传递,比如:


def add(a,b,c):
    print(a*b*c)
add(1,2,1)
add(1,2,2)
add(1,2,3)
add(1,2,4)
add(1,2,5)
复制代码


输出


➜  test git:(master) ✗ python3 testpy.py 
2
4
6
8
10
复制代码


你会发现,a和b是固定不变的,我们怎么样才能减少a和b的传参,而只改变c的值呢?这个时候闭包就起到了作用。


def addNew(a,b):
    def addC(c):
        return a*b*c
    return addC
func_ins = addNew(1,2)
print(func_ins(1))
print(func_ins(2))
print(func_ins(3))
print(func_ins(4))
print(func_ins(5))
复制代码


输出


➜  test git:(master) ✗ python3 testpy.py
2
4
6
8
10
相关文章
|
17天前
|
Python
闭包(Closure)是**Python中的一种高级特性
闭包(Closure)是**Python中的一种高级特性
34 8
|
1月前
|
存储 缓存 算法
Python闭包|你应该知道的常见用例(下)
Python闭包|你应该知道的常见用例(下)
22 1
Python闭包|你应该知道的常见用例(下)
|
1月前
|
自然语言处理 小程序 测试技术
Python闭包|你应该知道的常见用例(上)
Python闭包|你应该知道的常见用例(上)
26 3
Python闭包|你应该知道的常见用例(上)
|
5月前
|
监控 测试技术 Python
颠覆传统!Python闭包与装饰器的高级实战技巧,让你的项目效率翻倍
【7月更文挑战第7天】Python的闭包与装饰器是强大的工具。闭包是能记住外部作用域变量的内部函数,常用于动态函数创建和工厂模式。例如,`make_power`返回含外部变量`n`的`power`闭包。装饰器则允许在不修改函数代码的情况下添加新功能,如日志或性能监控。`my_decorator`函数接收一个函数并返回包装后的函数,添加了前后处理逻辑。掌握这两者,可提升编程效率和灵活性。
43 3
|
2月前
|
Python
深入理解Python中的闭包
深入理解Python中的闭包
30 0
|
4月前
|
数据安全/隐私保护 Python
Python闭包:函数定义的神秘力量!
Python闭包:函数定义的神秘力量!
60 0
|
5月前
|
程序员 Python
从零到一,彻底掌握Python闭包与装饰器的精髓,成为编程界的隐藏Boss
【7月更文挑战第7天】探索Python编程的两大基石:闭包与装饰器。闭包是内部函数记住外部作用域的变量,如`make_multiplier_of`返回的`multiplier`,它保持对`n`的引用。装饰器则是函数工厂,接收函数并返回新函数,如`my_decorator`,它在不改变原函数代码的情况下添加日志功能。掌握这些,让代码更优雅,效率更高,助你成为编程高手。
35 3
|
5月前
|
程序员 Python
程序员必看!Python闭包与装饰器的高级应用,让你的代码更优雅、更强大
【7月更文挑战第7天】Python中的闭包和装饰器是高级特性,用于增强代码功能。闭包是内部函数记住外部作用域的变量,常用于动态函数和函数工厂。示例展示了`make_multiplier_of`返回记住n值的`multiplier`闭包。装饰器则是接收函数并返回新函数的函数,用于不修改原函数代码就添加功能。`my_decorator`装饰器通过`@`语法应用到`say_hello`函数上,展示了在调用前后添加额外行为的能力。这两种技术能提升代码的优雅性和效率。
42 3
|
5月前
|
Python
Python编程实战:利用闭包与装饰器优化日志记录功能
【7月更文挑战第7天】Python的闭包和装饰器简化了日志记录。通过定义如`log_decorator`的装饰器,可以在不修改原函数代码的情况下添加日志功能。当@log_decorator用于`add(x, y)`函数时,调用时自动记录日志。进一步,`timestamp_log_decorator`展示了如何创建特定功能的装饰器,如添加时间戳。这些技术减少了代码冗余,提高了代码的可维护性。
72 1
|
5月前
|
数据采集 自然语言处理 大数据
​「Python大数据」LDA主题分析模型
使用Python进行文本聚类,流程包括读取VOC数据、jieba分词、去除停用词,应用LDA模型(n_components=5)进行主题分析,并通过pyLDAvis生成可视化HTML。关键代码涉及数据预处理、CountVectorizer、LatentDirichletAllocation以及HTML文件的本地化处理。停用词和业务术语列表用于优化分词效果。
286 0
​「Python大数据」LDA主题分析模型