好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Python函数之闭包

收录于话题

#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就不是闭包

查看更多关于Python函数之闭包的详细内容...

  阅读:27次