闭包函数
闭包函数
一、理解闭包须知
1、闭包函数=名称空间与作用域+函数嵌套+函数对象
2、核心点:名字的查找关系是以函数定义阶段为准
二、什么是闭包函数
“ 闭”的概念:闭函数指的是该函数是内嵌函数;打个比方:笼子内放一个小白鼠,小白鼠就是相对于笼子的比函数。
“包的概念:”包函数指的是该函数包含对外层函数作用域名字的引用(注意:不是对全局的作用域,只是局部的作用域):打个比方:笼子的小白鼠要吃东西,只能在笼子找。
闭包函数:名称空间于作用域的应用+函数的嵌套
def f2():
x = 11111
def f1():
print(x)
f1()
#f2与f1就是闭包函数,借上述的比喻,f1是相对于f2的闭函数相当于
#笼子的小白鼠,f2是相对于f1的包函数相当于笼子,f1名称的查找只会去
#f2函数体内查找,于其他任何函数定义于调用无关,因为它们都不是f1函数的
#包
x = 22222
def f3():
x = 33333
f2()
def f4():
x = 44444
f3()
f4() #打印1111
三、闭包函数:函数对象
def f1():
x = 33333333333333333333
def f2():
print('函数f2:',x)
return f2
f=f1()
print(f)
x=4444
f()
def foo():
x=5555
f()
foo()
三:为何要有闭包函数=》闭包函数的应用
两种为函数体传参的方式
方式一
直接把函数体需要的参数定义成形参
def f2(x):
print(x)
f2(1)
f2(2)
f2(3)
方式二
def f1(x): # x=3
x=3
def f2():
print(x)
return f2
x=f1(3)
print(x)
x() #间接对闭包函数进行传参
四、
获取网站内存对应上述原理的两种传承方式
方式一
如果多次只需要获得一个网站的内容时,需要重复的将网址传入形参。
import requests
def get(url):
response = requests.get(url)
print(len(response.text))
get('https://www.baidu.com')
get('https://www.cnblogs.com/zhangtieshan/')
get('https://zhuanlan.zhihu.com/p/109056932')
方式二
如果多次只需要获得一个网站的内容时,不需要重复的将网址传入形参,将闭包函数的调用赋值给一个变量后,每次调用时,在变量后加括号就行,省去了重复传入网址的操作。
import requests
def outter(url):
url = 'https://www.baidu.com'
def get():
response = requests.get(url)
print(len(response.text))
return get
baidu = outter('https://www.baidu.com')
baidu()
baidu()
baidu()
baidu()
baidu()