zoukankan      html  css  js  c++  java
  • 闭包函数装饰器

    一:闭包函数:

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

    
    
    #完整的闭包函数结构,嵌套调用
    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


  • 相关阅读:
    vue-vue-cli3配置文件的查看和修改
    vue-vue-cli3初始化项目
    vue-vue构建版本runtime-compiler和runtime-only的区别
    vue-vue构建版本runtime-compiler和runtime-only的区别
    vue-vue-cli2目录结构介绍
    Redis设计与实现(十一)事件
    Redis设计与实现(十)AOF持久化
    Redis设计与实现(九)RDB持久化
    Redis设计与实现(八)数据库
    Redis设计与实现(七)对象
  • 原文地址:https://www.cnblogs.com/Gaimo/p/11179815.html
Copyright © 2011-2022 走看看