闭包函数
一、理解闭包须知
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()
来源:https://www.cnblogs.com/zhangtieshan/p/12535774.html