第二十八篇 闭包函数
一、回顾
- 1.函数对象:可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制
- 2.名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,也即是在任意位置调用函数都需要找到函数定义阶段时的作用域关系
a = 2
def f():
def f1():
print(a)
return f1
x = f()
def f2():
a = 6
x()
f2() # 2
```当程序执行到f1()中时,函数f1()查找变量的顺序是local ----> enclose(封装)---->global---->built in(内置),最终找到 a = 2。由于 a = 6 属于f2()函数中的局部变量,所以它永远也影响不了f()函数中的f1()函数
-
3.两种为函数传值的方式
- 1.使用参数直接传给目标函数
def f(x): print(x) f(1) # 1
- 2.通过外层函数“包”给内层函数
def f(x) def f1(): print(x) return f1 a = f(1) a() # 1
二、什么是闭包
- 1.闭包指的是:函数内部函数对外部作用域而非全局作用域的引用
- 2.简单来说,闭包的概念就是当我们在函数内定义一个函数时,这个内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用
三、闭包函数的应用
1.闭包的意义:返回的内层函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域。(也就是当需要去外层查找变量时优先查找包裹自己的函数内的变量)
2.应用领域:延迟计算(以前需要传参,现在可以把目标函数包在我们设计的函数中)、爬虫
import requests
# 以前每爬一次都需要输入一次网址
def get(url):
response = requests.get(url)
data = reponse.text
print(data)
get('https://www.baidu.com')
get('https://www.baidu.com')
# 利用闭包函数则只需要输入一次,下次爬时只需要调用函数即可
def outer(url):
def get1():
response = requests.get(url)
data1 = reponse.text
print(data)
return get1
result = outer('https://www.baidu.com')
result()
result()