装饰器和表达生成式

from functools import wraps

叠加多个装饰器:多个装饰器的加载顺序和执行顺序
1.加载顺序:outter函数的调用过程:自下而上
2.执行顺序:wrapper函数的执行顺序:自上而下
@deco 在最上层执行时候在最内层,调用上一层,如果没有上一层则调用index
def outter1(func1): #func1=wrapper2的内存地址
    print('加载了outter1')
    def wrapper1(*args,**kwargs):
        print('执行了wrapper1')
        res1=func1(*args,**kwargs)
        return res1
    return wrapper1

def outter2(func2): #func2=wrapper3的内存地址
    print('加载了outter2')
    def wrapper2(*args,**kwargs):
        print('执行了wrapper2')
        res2=func2(*args,**kwargs)
        return res2
    return wrapper2

def outter3(func3): # func3=最原始的那个index的内存地址
    print('加载了outter3')
    def wrapper3(*args,**kwargs):
        print('执行了wrapper3')
        res3=func3(*args,**kwargs)
        return res3
    return wrapper3

@outter1 # outter1(wrapper2的内存地址)======>index=wrapper1的内存地址
@outter2 # outter2(wrapper3的内存地址)======>wrapper2的内存地址
@outter3 # outter3(最原始的那个index的内存地址)===>wrapper3的内存地址
def index():
    print('from index')
index()

有参装饰器:三层闭包函数
import time


login_status={'name':None,'status':False}

def auth(engine='file'):
    def outter(func):
        def wrapper(*args,**kwargs):
            if login_status['name'] is not None:
                res = func(*args,**kwargs)
                return res
            name = input('username>>>:').strip()
            pwd = input('password>>>:').strip()
            if engine == 'file':
                if name == 'egon' and pwd =='123':
                    print('login successful')
                    login_status['name'] = name
                    login_status['status'] = True
                    res = func(*args,**kwargs)
                    return res
                else:
                    print('username or password error')
            elif engine == 'mysql':
                pass
            elif engine == 'ldap':
                pass
        return wrapper
    return outter


@auth('file')
def index():
    time.sleep(2)
    print('welcome to index page')

index()

三元表达式
x=10
y=20

x if x > y else y
生成式
    列表生成式
        l=[]
        for i in range(10)
        l.append(i)
        print(l)
        
        l = [i for i in range(10)]
        
    字典生成式
        l = {}  字典和集合
    元组没有生成式
        
匿名函数与内置函数
    匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景
    lambda x,y:x+y

内置函数
    max()
    sorted 排序

posted @ 2018-12-03 15:07  yyf1  阅读(161)  评论(0编辑  收藏  举报