铺垫装饰器


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)