偷学Python第二十二天:Python中的闭包
古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼
闭包
在函数中提出的概念,简单来说就是一个函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被执行。这样的一个函数我们称之为闭包。实际上闭包可以看做一种更加广义的函数概念。因为其已经不再是传统意义上定义的函数。
闭包的条件:
- 外部函数中定义了内部函数
- 外部函数是有返回值
- 返回值是:内部函数
- 内部函数还引用了外部函数的变量
格式
def 外部函数():
...
def 内部函数():
...
return 内部函数
示例代码
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/21
"""
def func():
a = 100
def inner_func():
b = 200
print(a, b)
return inner_func
x = func()
print(x) # <function func.<locals>.inner_func at 0x0000021704CD9620>
x() # 100 200
# 这样就可以直接调用inner_func函数,如果return不返回一个内部函数的话是不会有任何输出的
使用闭包还可以完成计数器的效果
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/21
"""
def generate_count():
container = [0]
def add_one():
container[0] += 1
print(f"这是第{container[0]}次调用")
return add_one
count = generate_count()
count() # 这是第1次调用
count() # 这是第2次调用
count() # 这是第3次调用
闭包的缺点
- 作用域没有那么直观
- 因为变量不会被垃圾回收所以有一定的内存占用问题。
闭包的作用:
-
可以使用同级的作用域
-
读取其他元素的内部变量
-
延长作用域
今日学习总结
-
闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成.
-
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存.
-
闭包的好处,使代码变得简洁,便于阅读代码。
-
闭包是理解装饰器的基础