python-叠加多个装饰器-有参装饰器-三元表达式-生成式-匿名函数

一、叠加多个装饰器

from functools import wraps
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函数....
    """
    print('from index')

print(index.__name__)
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
@outter2
@outter3
def index():
    print('from index')


print('=====================')
index()

示范2:

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

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

index()

二、有参装饰器

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('基于mysql的认证')
            elif engine == 'ldap':
                # 基于ldap的认证
                print('基于ldap的认证')
            else:
                print('其他')
        return wrapper
    return outter

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

@auth('file') #@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)
print(res)


#用之后
x = 10
y = 20

res = x if x > y else y
print(res)


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

四、生成式

列表生成式

l = []
for i in range(10):
    if i > 4:
        l.append(i ** 2)
print(l)

# 用之后
l = [i ** 2 for i in range(10) if i > 4]
print(l)

示范1:

names = ['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb']
sbs = []
for name in names:
    if name.endswith('sb'):
        sbs.append(name)

print(sbs) #['alex_sb', 'kevin_sb', 'hxx_sb', 'cxx_sb']


names = ['egon', 'alex_sb', 'kevin_sb', 'hxx_sb', 'cxx_sb']
sbs = [name for name in names if name.endswith('sb')]
sbs1 = [name.upper() for name in names if name.endswith('sb')]
print(sbs) #['alex_sb', 'kevin_sb', 'hxx_sb', 'cxx_sb']
print(sbs1) #['ALEX_SB', 'KEVIN_SB', 'HXX_SB', 'CXX_SB']

字典生成式

res = {i: i ** 2 for i in range(10) if i > 3}
print(res) #{4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

print({i for i in 'hello'}) #{'l', 'o', 'e', 'h'}

五、匿名函数

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

示范1:

res = (lambda x, y: x + y)(1, 2)
print(res)

示范2:

salaries = {
    'egon': 3000,
    'alex': 100000000,
    'wupeiqi': 10000,
    'yuanhao': 2000
}

def func(k):
    return salaries[k]

print(max(salaries)) #根据key比较
print(max(salaries,key=lambda k:salaries[k])) #按照value比较
print(min(salaries,key=func)) 
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值