闭包函数及装饰器

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

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

具体体现

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')


posted @ 2018-11-29 20:05  shengkengliu  阅读(118)  评论(0编辑  收藏  举报