收录于话题
#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://HdhCmsTestxiaohuar测试数据/").read()
? ?return?content
print("加载中...")
print(func()) ? #每次执行的时候,content都会被请清空,加载缓慢,有可能卡顿
print(func())
print(func())
print(func())
此时利用闭包的话,既可以将其缓存下来,不用每次都加载.
代码如下:
from?urllib.request?import?urlopen
def?fun():
? ?content=urlopen("http://HdhCmsTestxiaohuar测试数据/").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就不是闭包