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

    一、函数对象,主要是讲函数都可以怎么用

    在面对对象编程中 一切皆对象

    具体体现

    1、函数可以被引用

    2、函数可以作为函数的参数

    3、函数可以作为函数的返回值

    4、可以被存储到容器类型中

    例:写一个购物车 举办登陆和注册,购物

    def funcl():
        print('run')
        
    a=funcl()
    a=funcl
    
    def func2(func):
         func()
         
    func2(func1)
    
    def func3():
        return func1
        
    f=func3()
    print(f)
    print(func1)
    

    二、函数嵌套

    ​ 1、嵌套调用 在一个函数中调用了另一个函数

    def max(x,y):
        return x if x>y else y
    def max4(a,b,c,d):
        res1=max(a,b)
        res2=max(res1,c)
        res3=max(res2,d)
        return res3
    print(max4(1,2,3,4))
    

    ​ 2、嵌套定义 在一个函数中定义了另一个函数

    ​ 定义在函数内的函数 只能在函数中使用 外界不能访问

    def a():
        def b():
            def c():
                def d()
                    print('from f3')
                d()
            c()    
        b()   
        
    f1()    
    

    三、名称空间

    ​ 定义:存储名称的空间

    ​ 名称空间的分类

    ​ 内置名称空间 存储解释器自带的一些名称与值的对应关系

    ​ (python解释器启动创建 所有代码全部执行完毕,关闭解释器时销毁)

    ​ 全局名称空间 文件级别的名称

    ​ 除了内置的和函数内的其他都在全局名称空间内

    ​ 局部名称空间,只要是函数内的名称就在局部名称空间内

    ​ 名称空间的加载顺序

    ​ 内置的==》全局的》局部的

    ​ 名称查找顺序

    ​ 局部==》全局的=》内置的

    四、作用域(作用范围)

    ​ 域 指的是区域 范围的意思

    ​ 全局名称空间和内置的名称空间在使用上没什么区别

    ​ 局部的定义就只能在局部使用

    ​ 全局和内置可以划分为同一范围

    ​ global表示全局范围 就是全局作用域

    ​ 局部的单独划分为一个范围

    ​ local局部作用域

    ​ 查看作用域

    ​ glibals()

    ​ locals()

    五、闭包函数

    ​ 1、什么是闭函数

    ​ 闭函数:该函数一点是定义在函数内的函数

    ​ 包函数:该内部函数包含对外层函数作用域名字的引用

    def outter():
    	x=111
    	def inner():
    		print(x)
    	return inner
    f=outter()
    
    x=22222
    f(
    

    ​ 为函数体传值的方案一:直接以参数的形式传入

    def f(x):
    	print(x)
    f(10)
    f(11)
    

    ​ 为函数体传值方案二:直接以参数的形式传入

    def outter(x):
    	def f():
    		print(x)
    	return f
    	
    fff=outter
    fff()
    
    fff1=outter(11)
    fff1()
    
    def outter(x):
    	x=10
    	def f():
    		print(x)
    	return f
    xx=outter(11)
    yy=outter(12)
    print(xxx)
    
    

    六、装饰器

    1、什么是装饰器
    

    ​ 装饰器指的是为被装饰对象添加新功能

    ​ 装饰器本身可以是任意可调用对象

    ​ 被装饰对象本身也可以是任意可调用对象

    ​ 2、为何要用装饰器

    ​ 开发封闭原则:对修改封闭,对扩展开发

    ​ 装饰器的实现原则:

    ​ 1、不能修改被装饰对象的源代码

    ​ 2、不能修改被装饰对象的调用方式

    ​ 装饰器的目的

    ​ 就是在遵守原则1和2的前提为被装饰对象添加新功能

    ​ 3、如何用

    1
    import time
    
    def index():
    	time.sleep(2)
    	print('welcome to index page')
    	
    def wrapper():
    	start=time.time
    	func()
    	stop=time.time()
    	print('run time is %s'%(stop-start))
    wrapper()
    2
    import time
    def outter(func):
    	def wrapper(*args,**kwargs):
    		start=time.time()
    		res=func(*rargs,**kwargs)
    		stop=time.time()
    		print('run time is %s'%(stop-start))
    	return res
    return wapper
    @outter#home=otter(home)
    def home(name):
    	time sleep(2)
    	print('welcome %s to homepage' %name)
    home('egon')
    
    
    

    七、叠加多个装饰器

    ​ 1、加载顺序(outter函数的调用顺序):自下而上

    ​ 2、执行顺序(wrapper函数的执行顺序)自下而上

    form functools import wraps#使其更像源代码的模块
    import time
    def outter(func):
    	@wraps(func)
    	def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print(stop-start)
            return res
    	return wrapper
    @outter
    def index():
    	'''
    	这是index函数。。。。
    	return
    	'''
    	print('from index')
    
    	
    
    def outterl(func1)#func1=wrapper2的内存地址
    	print('加载了outter1')
        def wrapper1(*args,**kwargs):
            print('执行了wrapper1')、
            res1=func(*args,**kwargs)
            return res1
        return wrapper1
    
    def outter2 (func2):#func2=wrapper3的内存地址
        print('加载了outter2')
        def wrapper2(*args,**kwargs):
        	print('执行了wrapper')
            res2=func2(*args,**kwargs)
            return res2
        return wrapper2
    
    def outter3(func3):#func3=最原始的那个index的内存地址
        print('加载了outter3')
        def wrapper3(*args,**kwargs):
            print('执行了wapper3')
            res3=func3('*args,**kwargs')
            return res3
        return wrapper3
    @outter1#outter1(wrapper2 的内存地址)========》index=wrapper的内存地址
    @outter2#outter2(wrapper3 的内存地址)========》wrapper2的内存地址
    @outter3#outter3(最原始的index的内存地址)=======》wrapper3的内存地址
    def index():
        print('from index')
    
    
    

    ​ 有参函数

    import time
    current_user={'user':None}
    
    def outter(func):
        def wrapper(*args,**kwargs):
            if current__user['user']is not None:
                res=func(*args,**kwargs):
                    return res
            user=input('username>>>>:').strip()
            pwd=input('password>>>:').strip()
            if user=='egon'and pwd=='123':
                print('login successfull')
                current_user['user']=user
                res=func(*args,**keargs)
                return res
            else:
                print('user or password error')
        return wrapper
    @outter
    def index():
        time.sleep(1)
        print('from index')
    @outter
    def home(name):
        print('welcome %s'%name)
    index()
    home('egon')      
                
    
    import time
    current_user={'user':None}
    def auth(engine='file')
        def outter(func):
            def wrapper(*args,**kwargs):
                if current_user['user']is not None:
                    res=func(*args,**kwargs)
                    return res
                user=input('username>>>:').strip()
                pwd=input('password>>>>:').strip()
                if engine=='file':#基于文件认证
                    if user=='egon'and pwd=='123'
                    print('login successfull')
                    current_user['user']=user
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('user or password error')
                elif engine=='mysql':
                    #基于mysql的认证
                    print('基于myql的认证')
                elif engine=='ldap':
                    #基于ldap的认证
                    print('基于ldap的认证')
                else:
                    print('不知道engine')
            return wrapper
        return outter
    @auth('ldap')
    def index():
        time.sleep(1)
        print('from index')
    @auth('mysql')
    def home(name):
        print('welcome %s'%name)
    index()
    home('egon')
    
    
    
  • 相关阅读:
    rosbag 那些事
    rosbag record and play
    xsens melodic ros driver
    ros the public key is not available
    pyhton2与pyhton3切换
    期待已久的2013年度最佳 jQuery 插件揭晓
    MVC学习资料
    依赖注入框架Autofac的简单使用
    bootstrap
    https://nodejstools.codeplex.com
  • 原文地址:https://www.cnblogs.com/liushen1995/p/10040515.html
Copyright © 2011-2022 走看看