Python学习之路_day11

一:叠加多个装饰器

  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

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 == 'Grace' 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('Grace')
基于某项认证的示例

三:三元表达式

两个数进行比较:
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
print(res)

也可以改成Ture或False类型的:

res='OK' if False else 'No'
print(res)
三元表达式

四:列表生成式

names=['egon','Grace','zd_sb','hxx_sb']
sbs=[]
for name in names:
    if name.endswith('sb'):
        sbs.append(name)
# sbs=[name for name in names if name.endswith('sb')]
# print(sbs)
print([name for name in names if name.endswith('sb')])
列表生成式
names=['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb']
sbs=[]
for name in names:
    if name.endswith('sb'):
        sbs.append(name)

sbs=[name.upper() for name in names if name.endswith('sb')]



print([name.upper() for name in names])
print([name for name in names if name.endswith('sb')])
也可以在列表生成式里面加上其他功能

五:字典生成式

示例:
1.
res={i:i**2 for i in range(10) if i > 3}
print(res)
2.
print({i for i in 'hello'})
字典生成式

六:匿名函数(lambda)

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

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

res=(lambda x,y:x+y)(1,2)
print(res)
两数相加

max,min,sorted等函数可以与匿名函数搭配使用。

max及sorted和匿名函数的搭配使用

猜你喜欢

转载自www.cnblogs.com/liuxiaolu/p/10046000.html