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

    1、闭包函数

    (1)闭指的是该函数时一个内部函数;

    (2)包指的是该函数包含对外部作用域(非全局作用域)名字的应用

    # def outter():
    # x = 1
    # def inner():
    # print(x)
    # return inner
    #f=outter()
    # def f2():
    # x=1111111
    # f()
    # f2()

    2、函数的传值方式
    (1)使用参数的形式
     def inner(x):
    # print(x)
    # inner(1)
    # inner(1)
    # inner(1)

    (2)包给函数
    
    
    def outter(x):
    # x=1
    def inner():
    print(x)
    return inner #返回inner的内存地址

    f=outter(18) #outter()就是inner的内存地址
    f() #加()调用inner函数


     import requests
    # def outter(url):
    # # url='https://www.baidu.com'
    # def get():
    # response=requests.get(url)
    # if response.status_code == 200:
    # print(response.text)
    # return get
    #
    # baidu=outter('https://www.baidu.com')
    # python=outter('https://www.python.org')
    # baidu()
    # baidu()
    #
    # python()
    # python()

    3、装饰器
    (1)什么是装饰器?
    器指的是工具,而程序中的函数就具备某一功能的工具;装饰指的是为被装饰器对象添加额外的功能;
    就目前尚未知识来看:
    定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能;
    其实:
    装饰器本身可以是任意可调用的对象,被装饰的对象也可以是任意可调用的对象

    (2)为什么要用装饰器?
    软件的维护应该遵循开放封闭的原则
    开放封闭的原则指的是:软件一旦上线运行后对修改源代码是封闭的,对扩展功能是开放的,这就
    用到了装饰器。
    装饰器的实现毕勋遵循两大原则:
    1、不修改被装饰对象的源代码
    2、不修改被装饰对象的调用方式
    (装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能)

    (3)如何用装饰器?
    # import time
    # def index():
    # print('welcom to index')
    # time.sleep(3)
    #
    # def timmer(func):
    # #func=最原始的index
    # def wrapper():
    # start=time.time()
    # func() #调用index函数
    # stop=time.time()
    # print('run time is %s' %(stop - start))
    # return wrapper
    #
    # index=timmer(index) #index=wrapper函数的内存地址
    # index()


    4、装饰器修正
    (1)被装饰函数有返回值
    import time
    def index():
    print('hoole')
    time.sleep(3)
    return 234

    def timmer(func):
    def y():
    ster = time.time()
    res = func()
    stop = time.time()
    print('run is %s' %(stop-ster))
    return(res)
    return y
    index =timmer(index)
    res=index()
    print(res)

    (2)被装饰函数是有参函数
    import time
    def home(name):
    print('holle %s'%(name))
    time.sleep(3)

    def index():
    print('weloce come')
    time.sleep(2)

    def timmer(func):
    def y(*args ,**kwargs ): #参数y需要有形参,调用home就是调用y函数,home的实参,传给y 函数使用
    ster = time.time()
    func(*args ,**kwargs)
    stop = time.time()
    print('rnu is %s' %(stop -ster))
    return y

    index = timmer(index)
    index()
    home=timmer(home)
    home('qqc')

    5、装饰器语法糖
    在被装饰的整上方,并且是单独一行写上@装饰器名
    # import time
    # def timmer(func):
    # #func=最原始的index
    # def wrapper(*args,**kwargs):
    # start=time.time()
    # res=func(*args,**kwargs)
    # stop=time.time()
    # print('run time is %s' %(stop - start))
    # return res
    # return wrapper
    #
    # @timmer # index=timmer(index)
    # def index():
    # print('welcome to index')
    # time.sleep(3)
    # return 123
    #
    # @timmer # home=timmer(home)
    # def home(name):
    # print('welcome %s to home page' %name)
    # time.sleep(2)
    #
    # res=index()
    # print(res)
    # home('egon')








    def deco(func):
    def wrapper(*args,**kwargs):
    res=func(*args,**kwargs)
    return res
    return wrapper
    
    
    (装饰器通用模式)





  • 相关阅读:
    MySQL 数据库入门操作
    select count(*)和select count(1)
    Oracle instr 及 like
    myeclipse添加svn
    Lanucherr 默认显示第几屏
    【毕设】班级管理系统——易搜
    【毕设】班级管理系统——找回密码模块
    【毕设】班级管理系统——登录模块
    【毕设】班级管理系统——系统介绍
    快速生成扇形图
  • 原文地址:https://www.cnblogs.com/quqinchao/p/qqcnm.html
Copyright © 2011-2022 走看看