铺垫装饰器
import time # def func(): # sum_num=0 # for i in range(1000000): # sum_num+=i # # # start=time.time() # func() # print(time.time()-start) #函数的执行时间 # def func2(): # sum_num = 0 # for i in range(1000000): # sum_num += i # # # start = time.time() # func2() # print(time.time() - start) #既计算函数1的时间,有计算函数2的时间 # def timer(func_name): # start=time.time() # func_name() # print(time.time()-start) # # timer(func) # timer(func2) #
总结:并不是函数名()才能调用一个函数,只要是函数内存地址对应的变量都可以通过()来调用函数
实际上,我们函数名字可以被赋值,也可以作为一个容器类的元素
变量怎么使用,函数名字就可以怎么使用
# def a(): # print('在a函数里') # a() # print(a) #函数的内存地址# b=a # b() #也可以调用函数 # # lst=[a] # lst[0]() #也可以调用函数
函数名的本质:就可以做参数,又可以做返回值
#函数名可以做参数 # def a(): # print('在a函数里') # # # def b(func): # print(func) # func() # # b(a) #函数名可以作为返回值 # def b(): # def a(): # print('在a函数里') # print('--------a',a) # return a # # ret=b() # print(ret) # ret()
闭包:一旦内层函数引用了外层函数的变量,内层函数就变成给了一个闭包函数
# def b(): # name='李sir' # # def inner(): # # print('在inner里',name) # # return inner # # ret=b() # print(ret.__closure__) #查看是否是闭包函数
判断下列是否为闭包
# 例子1 #不是闭包 # def func1(): # a=1 # b=2 # def inner(): # print(1,2) # return inner # # ret2=func1() # print(ret2.__closure__) # # #例子2 #不是闭包 # def func1(): # a=1 # b=2 # def inner(a,b): # print(a,b) # return inner # # ret2=func1() # print(ret2.__closure__) #例子3 #是闭包 # def func1(): # a=1 # b=2 # def inner(): # print(a,b) # return inner # # ret2=func1() # print(ret2.__closure__) #例子4 #是闭包 # def func1(): # a=1 # b=2 # def inner(): # print(a,b) # return inner # # ret2=func1(1,2) # print(ret2.__closure__) # #例子5 # #是闭包 # a=1 # b=2 # def func1(): # def inner(): # print(a,b) # return inner # # ret2=func1() # print(ret2.__closure__)
闭包有什么用?
把一些固定的数据存储在二阶函数外层,既不被污染又可以重复使用,节省时间,增加了效率
from urllib import request #url相关的模块 import time def get_html(url): res=request.urlopen(url) return res.read().decode('utf-8') start=time.time() ret=get_html('https://www.cnblogs.com/gm11/') ret=get_html('https://www.cnblogs.com/gm11/') ret=get_html('https://www.cnblogs.com/gm11/') ret=get_html('https://www.cnblogs.com/gm11/') ret=get_html('https://www.cnblogs.com/gm11/') print(time.time()-start) #闭包优化 def get_html(url): dic={} def get_url(): if url in dic: return dic[url] else: res=request.urlopen(url) dic[url]=res return res.read().decode('utf-8') return get_url start=time.time() ret=get_html('https://www.cnblogs.com/gm11/') ret() ret() ret() ret() print(time.time()-start)