• Python学习心得第四周-04 闭包函数和装饰器


    大前提:函数的作用域关系是在函数定义阶段就已经固定死的,与调用位置无关

    闭包函数:
    1、闭指的是-》定义在函数的内部的函数
    2、包-》该内部函数包含对其外层函数作用域名字的引用

    闭包函数通常需要结合函数对象的概念,将闭包函数返回到外部使用
    def outter():
        x=100
        def inner():
            print(x)
    
        return inner
    
    
    f=outter()
    
    # x=200
    # f()
    
    def foo():
        x=300
        def bar():
            x=400
            f()
        bar()
    
    foo()
    闭包函数的基本形式
    def outter(x):
        def inner():
            print(x)
        return inner
    import requests#爬虫
    安装requests,cmd--在python安装路径下-Scripts
    pip install requests

    通过参数的形式为函数体传值
    def get(url):
        response=requests.get(url)
        print(len(response.text))
    
    
    x='https://www.baidu.com'
    get(x)
    get(x)
    get(x)
    
    y='https://www.jd.com'
    get(y)
    get(y)
    get(y)
    
    
    #将值包给函数
    
    def outter(url):
        #url='https://www.jd.com'
        def get():
            response=requests.get(url)
            print(len(response.text))
        return get
    
    jd=outter('https://www.jd.com')
    jd()
    jd()
    jd()
    
    baidu=outter('https://www.baidu.com')
    baidu()
    baidu()
    baidu()
    
    
    
    ################
    
    def outter():
        x=1
        def foo():
            print(x)
        return foo
    
    
    f=outter()
    print(f)
    

      

    装饰器
    1、什么是装饰器
    装饰指的是为被装饰对象添加新的功能
    器指的的是工具

    装饰器本身可以任意可调用的对象,被装饰的对象也可以是任意可调用的对象

    目标:
    写一个函数用来为另外一个函数添加新功能,需要遵循开放封闭原则(对修改是封闭的,对扩展是开放的)
    1、不修改被装饰对象的源代码
    2、不修改被装饰对象的调用方式
    import time
    
    def index():
        time.sleep(3)
        print('welcome to index page')
    
    
    def outter(func): #func=最原始index
        def wrapper():
            start_time=time.time()
            func()
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
        return wrapper
    
    index=outter(index) #index=wrapper
    
    index() #wrapper()
    

     

    import time
    
    def index():
        time.sleep(0.5)
        print('welcome to index page')
        return 1234
    
    def home(name):
        time.sleep(1)
        print('welcome %s to home page' %name)
    
    
    def timmer(func): #func=最原始index
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
            return res
        return wrapper
    
    
    # index=timmer(index) #index=wrapper
    # home=timmer(home)
    
    # 正常的调用
    res=index() #res=wrapper()
    print(res)
    # home('egon') #wrapper('egon')
    装饰器的语法糖:在被装饰对象正上方单独一行写上@装饰器名字
    import time
    
    def timmer(func): #func=最原始index
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
            return res
        return wrapper
    
    
    @timmer #index=timmer(index)
    def index():
        time.sleep(0.5)
        print('welcome to index page')
        return 1234
    
    @timmer #home=timmer(home)
    def home(name):
        time.sleep(1)
        print('welcome %s to home page' %name)
    
    
    # 正常的调用
    res=index() #res=wrapper()
    print(res)
    home('egon') #wrapper('egon')
    

      

    函数对象、函数嵌套、名称空间与作用域、装饰器

    链接:http://www.cnblogs.com/linhaifeng/articles/7532497.html

    
    
  • 相关阅读:
    ASP.NET MVC自定义Module记录管道事件执行顺序
    Pro ASP.NET MVC 5 Platform-第三章 ASP.NET 生命周期
    C#基础-反射
    C#7语法快速参考-第一章 Hello World
    两张趣图助你理解 HTTP 状态码!
    dev listbox使用
    aspose导出数据
    dev chart使用
    linq多个条件
    json返回数据多个是数组,单个就不是处理方案
  • 原文地址:https://www.cnblogs.com/zhutiancheng/p/9324144.html
Copyright © 2020-2023  润新知