AI智能
改变未来

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Python函数之闭包