python 入门 day13

一、叠加多个装饰器

from functools import wraps     #python内置模块,将被装饰对象的属性赋值给装饰器

def outter(func):
    @wraps(func)                #模块的语法糖
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    # wrapper.__name__ = func.__name__
    # wrapper.__doc__ = func.__doc__
    return wrapper

@outter #index=outter(index) #index=wrapper
def index():
    """
    这是index函数....
    :return:
    """
    print('from index')


print(index.__name__) #print(wrapper.__name__)      #查看wrapper的函数名字,为index
print(index.__doc__)                                #查看wrapper的注释,和index一样

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

2.执行顺序(wrapper函数的执行顺序):自上而下

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

print('======================================================')
index()                     #如同撕包裹
import time

def timmer(func):
    def aaa(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs) #最原始那个index的内存地址()
        stop=time.time()
        print('run time is %s' %(stop -start))
        return res
    return aaa

def auth(func):
    def bbb(*args,**kwargs):
        name=input('name>>>: ').strip()
        pwd=input('pwd>>>: ').strip()
        if name == 'egon' and pwd == '123':
            print('login successfull')
            res=func(*args,**kwargs)
            return res
        else:
            print('user or pwd error')
    return bbb

@timmer
@auth
def index():
    time.sleep(1)
    print('from index')

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,**kwargs)
            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':            #函数没file参数,不走下方if
                # 基于文件的认证
                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('基于mysql的认证')
            elif engine == 'ldap':
                # 基于ldap的认证
                print('基于ldap的认证')
            else:
                print('不知道engine')
        return wrapper
    return outter

@auth('ldap') #@outter #index=outter(index) # index=wrapper
def index():
    time.sleep(1)
    print('from index')

@auth('mysql') #@outter # home=outter(home) #home=wrapper
def home(name):
    print('welcome %s' %name)

index()
home('egon')

三、三元表达式

# def max2(x,y):
#     if x > y:
#         return x
#     else:
#         return y
# res=max2(10,20)

x=10
y=20
res=x if x > y else y # 变量= 判断为真的结果 if 条件 else 判断为假的结果   只能用于 if  else
print(res)

res='OK' if False else 'No'
print(res)

四、生成式

列表生成式

# for i in range(10):
#     if i > 4:
#         l.append(i**2)
l=[i**2 for i in range(10) if i > 4]
print(l)
names=['egon_nb','alex','hxx']

# for name in names:
#     if name.endswith('nb'):
#         name.upper()
res=[name.upper() for name in names if name.endswith('nb')]     #不能加else 后面可以继续加 for   if               [执行代码 for取值范围 if判断条件]

print(res)

字典生成式

res={i:i**2 for i in range(10) if i > 3} #{关键字:执行代码 for取值范围 if判断条件}不能加else
print(res)

print({i for i in 'hello'})

五、匿名函数

匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景

func=lambda x,y:x+y             #匿名函数模块
print(func(1,2))                #没有意义,这种函数主要针对临时使用

res=(lambda x,y:x+y)(1,2)
print(res)
salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}
print(max(salaries,key=lambda k:salaries[k]))
# for循环的结果         比较依据
# 'egon'                3000
# 'alex'                100000000
# 'wupeiqi'             10000
# 'yuanhao'             2000

def func(k):
    return salaries[k]
print(min(salaries,key=func))

print(sorted(salaries,key=lambda k:salaries[k],reverse=True))

猜你喜欢

转载自www.cnblogs.com/wujinsheng/p/10045951.html