闭包函数-装饰器

一:闭包函数:

定义:函数里套有其他函数的形式,两层以上的


#完整的闭包函数结构,嵌套调用
def
func(): name = 'eva' def inner(): print(name) return inner f = func() f()

 

   内部函数包含对外部作用域而非全局作用域名字的引用,该内部函数称为闭包函数

#函数内部定义的函数称为内部函数  

给函数体传值的方式 传参
 def index(x,y):
     print(x,y)
 给函数体传值的第二种方法 闭包
 def outter(x,y): # 动态的绑定关系
    # x=1
    # y=2
     def my_max():
        if x>y:
            return x
         else:
             return y
     return my_max
 res1=outter(12,30)  #res就是my_maxd函数的内存地址
 print(res1())

 

 爬虫:动态的修改网址 url(攻防的策略)

import requests
def my_get=(url):
    requests=requests.get('https//www.baidu.com')
    if requests.status_code==200:
        print(len(requests.text))
res=my_get('https//www.baidu.com') #修改地址即可
res1=my_get('https//www.baidu.com')
res2=my_get('https//www.baidu.com')
res3=my_get('https//www.baidu.com')
res()

 二、装饰器:

  装饰器的本质:一个闭包函数(可调用的对象)

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展(不修改被装饰对象的源代码和调用方式)

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer   
def func1(a):
    print(a)

func1(1)

1、装饰器的主要功能:

在不改变函数调用方式的基础上在函数的前、后添加功能。

import time
print(time.time())
# 1562992535.343285  时间戳,当前的时间距离1970-1-1 00:00:00  Unix诞生的元年
    time.sleep(3) # 让程序暂停3秒

2、装饰器的固定格式:  

def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner

3、简单的装饰器:

"""
1.统计index函数执行的时间
"""
import time
def index():
    time.sleep(3)
    print('澳门最大线上赌场开业啦!')

def outter(func):  # func = 最原始的index函数的内存地址
    def get_time():
        start = time.time()
        func()  # func = index函数的内存地址() 直接调用
        end = time.time()
        print('index run time:%s'%(end-start))
    return get_time
index = outter(index)  # outter(最原始的index函数内存地址)
# index指向get_time函数的内存地址
index()


装饰器的流程图:统计index的执行时间

  index和函数名 index没有任何关系,只是命名重复而已,加括号的就认为是函数的调用,优先级最高的。 

4、装饰器语法糖:

 
  装饰器在装饰的时候  顺序从下往上
  装饰器在执行的时候  顺序从上往下

#  以此类推@outter2调用func1赋值给新的变量func2.......

 

多个装饰器装饰同一个函数

有些时候,我们也会用到多个装饰器装饰同一个函数的情况。

@outter  # index = outter(index)  outter(最原始的index的函数的内存地址)
def index():
    time.sleep(3)
    print('澳门最大线上赌场开业啦!')
    return 'index'
# res1 = index()
@outter  # login = outter(login)
def login(name):
    time.sleep(1)
    print('%s is sb'%name)
    return 'login'
# res = login('egon')
@outter  # home = outter(home)
def home(*args,**kwargs):
    time.sleep(1)
    return 'home'
login = outter(login)  # outter(最原始的login函数的内存地址)
index = outter(index)
home = outter(home)
"""
语法糖在书写的时候应该与被装饰对象紧紧挨着 
两者之间不要有空格
"""

 

 

 5、装饰器的固定格式:

def outter(func):
    def inner(*args,**kwargs):
        print('执行被装饰函数之前 你可以做的操作')
        res = func(*args,**kwargs)
        print('执行被装饰函数之后 你可以做的操作')
        return res
    return inner


 

posted @ 2019-07-13 17:01  游走De提莫  阅读(214)  评论(0编辑  收藏  举报