名词解释
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
闭包就是该函数体与执行这个函数的环境组成的一个包裹
基本定义:
内部函数包含对外部作用域而非全局作用域名字的引用
另外需补充两点:
1、我们之前都是通过参数将外部的值传给函数,闭包提供了另外的一种思路,将值传给函数并使其具有一定的绑定关系。
2、由于作用域的关系,我们就不能随便拿到函数内部的变量和函数了。return是python提供给我们的一种方式
代码示例
我们来看下面的这一段代码:
#常见的函数大概是这样的
name = 'zero' # 外部定义一个变量
def func(name): # 通过传参的形式传递给函数,执行相关操作
print(name)
func(name) #函数调用将name传递给函数
我们可以将这个上面的三行代码包裹起来,让func的函数一直传递的为'zero'
如下所示:
def func():
name = 'zero'
def inner():
print(name)
return inner # 此时返回的inner不仅仅是内部定义的函数inner,还包含name='zero'
f = func() # f就相当于一个包裹,包含内部inner函数还有了name='zero'的包装
f() # f无论在哪调用f()执行时,他都会在自己的包裹内找东西,即name = 'zero'
小结:
当函数体需要某一个参数值时有两种解决方式
#方式一:使用用函数的参数形式
#方式二:将该函数做闭包函数
def outter(url):
# url='http://www.baidu.com'
def index():
return urlopen(url).read()
return index
baidu=outter('http://www.baidu.com')
baidu()
闭包的意义:
1、return的函数不仅是一个函数对象还在函数外还包裹了一层作用域。使得该函数无论何处调用,优先使用自己外层包裹的作用域,打破了原来的层级限制。
简单一句话:闭包就是该函数体与执行这个函数的环境组成的一个包裹
2、:延迟计算,在我们需要时再调用return的函数。
需加强下面代码的理解,望大家再敲一遍加深理解
name = 'zero'
def func(name):
def inner():
print(name)
return inner # 此时返回的inner不仅仅是内部定义的函数inner,还包含name='zero'
f = func()
f()
from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read() # url引用的不是全局作用域的url(很明显全局无url名称),url属于index内部的名称
return get
baidu=index('http://www.baidu.com')
print(baidu().decode('utf-8'))