收录于话题
#Python入门
27个
概要:
1.什么是闭包; 2闭包的作用; 3.__closure__ 查看是否是闭包
一.闭包的定义及作用
1.定义:
闭包就是内层函数,对外层函数(非全局)变量的引用.
2.作用:⽤⽤
1. 保护变量
2. 常驻内存(就是让一个变量能够常驻内存. 供后面的程序使用.)
基本写法:在外层函数中声明一个变量,在内层函数使用或者返回这个变量
def outer():
a = 10
def inner():
return a
return inner
例如:
def outer():
name = \”alex\” #常驻内存
def inner():
print(name)
inner()
outer()
1).保护变量
a = 10
def func():
global a
a = 20
print(a)
func() #全局变量可能会被修改, 全局变量是不安全的. 可能会被其他函数所更改
此时需要用闭包来保护我们的变量.
2).常驻内存:
python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡. 将会常驻在内存中. 也就是说.使用闭包,可以保证外层函数中的变量在内存中常驻. 这样做 有什么好处呢? 非常大的好处. 我们来看一个关于爬冲的代码.
例子
from urllib.request import urlopen #爬虫
def func():
content = urlopen(\”http://www.xiaohuar.com/\”).read()
return content
print(\”加载中…\”)
print(func()) #每次执行的时候,content都会被请清空,加载缓慢,有可能卡顿
print(func())
print(func())
print(func())
此时利用闭包的话,既可以将其缓存下来,不用每次都加载.
代码如下:
from urllib.request import urlopen
def fun():
content=urlopen(\”http://www.xiaohuar.com/\”).read()
def inner():
return content
return inner
print(\”加载中….\”)
c=fun()
print(\”加载完毕\”)
print(c())
print(c()) #中间不会卡顿
print(c())
二.函数名称.__closure__ 查看是否是闭包
def outer():
a= 10
def inner():
print(a)
return inner
ret =outer()
ret()
print(ret.__closure__) #(<cell at 0x0000000001E2A468: int object at 0x00000000583C6D30>,)
我们可以使用__closure__来检测函数是否是闭包. 使用函数名.__closure__返回cell就是 闭包. 返回None就不是闭包