二. 函数进阶(闭包)一
一 .闭包
概念: 是一个闭包 把一个函数当做参数返回一个替代的函数 本质上就是一个返回函数的函数
闭包函数 嵌套函数 调用外部函数的变量
闭包作业:
可以保护你的变量不受侵害
可以让一个变量常驻内存中
# 简单闭包 def fun1(): print("哈哈哈哈哈哈name") def fun2(): print("啦啦啦啦啦啦啦") fun1() fun2() # 啦啦啦啦啦啦啦 # 哈哈哈哈哈哈name
# 闭包函数 嵌套函数 调用外部函数的变量 def ss(): a=20000 可以让一个变量常驻内存中 def inner(): print(a) print(inner.__closure__) ss() def ls(): a="张三啊哈哈哈哈啊哈" def ll(): print(a) return ll inn=ls() inn() # (<cell at 0x0000012CFC17A708: int object at 0x0000012CFC159CD0>,) # 张三啊哈哈哈哈啊哈
# 函数名可以作为返回值 def func(): print(123) def nice(f): print(456) f() return f # 函数名可以作为返回值 ff=nice(func) # 函数名可以作为函数的参数 ff() # 456 # 123 # 123
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from urllib.request import urlopen ret=urlopen('https://www.88tph.com/topic/zhuangshihua/').read() print(ret) def get_rul(): ul='https://www.88tph.com/topic/zhuangshihua/' ret=urlopen(ul).read() print(ret) get_rul() def geta(): ula='http://huaban.com/boards/29108884/' def cc(): ret=urlopen(ula).read() print(ret) return cc bb=geta() bb()
a=1 b=5 def hh(a,b): print(a,b) aa=hh(6,44) print(aa,"111") # 6 44 # None 111 a=1 b=5 def hh(a,b): return a,b aa=hh(6,44) print(aa,"111") print(aa) # (6, 44) 111 # (6, 44)
def dd(*args): print(type(args)) ff=0 for i in args: ff+=i print(ff) print(type(ff)) dd(5,5,5,5) # <class 'tuple'> # 20 # <class 'int'>
三层嵌套函数使用 闭包
# 三层嵌套函数使用 闭包 # cc.__closure__ 判断闭包是否存在 不存在返会None def aa(b): print("这是aa函数") name=6666 def bb(): print("这是bb函数") print(name) print(b) def cc(): print("这是cc函数") print(name) print(b) print(cc.__closure__) return cc print(bb.__closure__) return bb bb=aa(999999) cc=bb() cc()
一共有三种命名空间从大范围到小范围的顺序:内置命名空间、全局命名空间、局部命名空间
作用域(包括函数的作用域链):
函数的嵌套:
嵌套调用
嵌套定义:定义在内部的函数无法直接在全局被调用
函数名的本质:
就是一个变量,保存了函数所在的内存地址
闭包:
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
案例 . 闭包函数获取网络应用
from urllib.request import urlopen def getl(): def aa(url): name=urlopen(url).read() return name return aa aa=getl() cc=aa("http://www.xiaohuar.com/") print(cc) cc=aa("https://re.jd.com/list/item/1421-37857431390.html?re_dcp=202m0QjIIg==&cu=true&utm_source=baidu-nks&utm_medium=cpc&utm_campaign=t_262767352_baidunks&utm_term=83117993061_0_5d7f065e74ab4f90bfcf5694d08c39d6") print(cc)
from urllib.request import urlopen def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read() return get xiaohua = index() content = xiaohua() print(content) 闭包函数获取网络应用