1. 程式人生 > >裝飾器的補充(疊加多個裝飾器,有參裝飾器,三元表達式,生成式,匿名函數)

裝飾器的補充(疊加多個裝飾器,有參裝飾器,三元表達式,生成式,匿名函數)

-s def names 多個 not 登錄 index 補充 art

1,疊加多個裝飾器

  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)

import time


#時間統計函數
def timmer(func): def wrapper(*args, **kwargs): start = time.time() res = func(*args, **kwargs) stop = time.time() print(run %s % (stop - start)) return res return wrapper #賬戶登錄驗證函數 def duth(func): def wrapper(*args, **kwargs): name = input(please input your name:) pwd = input(please input your password:) if name == egom and pwd == 123: print(login successful) res = func(*args, **kwargs) return res else: print(your name or password error) return wrapper @timmer @duth #裝飾器將下面函數的函數名當做參數,然後將運行的結果在賦值給原函數index # def index(): time.sleep(1) print(from index) index()

2,有參裝飾器

current_user = {user:None}

def duth(engine=file):
    def outter(func):
        def wrapper(*args,**kwargs):

            #確認current字典內是否有存在的數據
            if current_user[user] is not None:
                res = func(*args,**kwargs)
                return res

            name = input(your name :).strip()
            password = input(your password :).strip()

            #基於‘file‘文件認證
            if engine == file:
                if name == egon and password == 123:
                    print(login successful)
                    current_user[user]=name
                    res=func(*args,**kwargs)
                    return res
                else:
                    print(your name or password error)

            elif engine == mysql :
                print(基於mysql認證)

            elif engine == ldap :
                print(基於ldap認證)

            else:
                print(hello)

        return wrapper
    return outter

3,三元表達式

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)


res=OK if False else No
print(res)

4,生成式

  列表生成式

l=[]
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,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)]

  字典生成器

res={i:i**2 for i in range(10) if i > 3}
print(res)


print({i for i in hello})

 5,匿名函數

裝飾器的補充(疊加多個裝飾器,有參裝飾器,三元表達式,生成式,匿名函數)