1. 程式人生 > >python 裝飾器相關 從後往前看

python 裝飾器相關 從後往前看

import time
def timmer(func): #func=test
    def wrapper():
        start_time=time.time()
        res=func() #就是在執行test()
        stop_time = time.time()
        print('執行時間是%s' %(stop_time-start_time))
        return res
    return wrapper

@timmer #test=timmer(test)
def test():
    time.sleep(3)
    print('test函式執行完畢')
    return '這是test的返回值'

res=test()  #就是在執行wrapper
print(res)
import time
def timmer(func): #func=test1
    def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}
        start_time=time.time()
        res=func(*args,**kwargs) #就是在執行test()         func(*('linhaifeng'),**{'age':18})
        stop_time = time.time()
        print('執行時間是%s' %(stop_time-start_time))
        return res
    return wrapper

# @timmer #test=timmer(test)
def test(name,age):
    time.sleep(3)
    print('test函式執行完畢,名字是【%s】 年齡是【%s】' %(name,age))
    return '這是test的返回值'

@timmer
def test1(name,age,gender):
    time.sleep(1)
    print('test1函式執行完畢,名字是【%s】 年齡是【%s】 性別【%s】' %(name,age,gender))
    return '這是test的返回值'

# res=test('linhaifeng',age=18)  #就是在執行wrapper
# # print(res)
# test1('alex',18,'male')

test1('alex',18,'male')


















# def test2(name,age,gender): #test2(*('alex',18,'male','x','y'),**{})
#     #name,age,gender=('alex',18,'male','x','y')
#     print(name)
#     print(age)
#     print(gender)
#
# def test1(*args,**kwargs):
#     test2(*args,**kwargs)  #args=('alex',18,'male','x','y') kwargs={}
#
# # test2('alex',18,gender='male')
#
# test1('alex',18,'male')
user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]
current_dic={'username':None,'login':False}

def auth(auth_type='filedb'):
    def auth_func(func):
        def wrapper(*args,**kwargs):
            print('認證型別是',auth_type)
            if auth_type == 'filedb':
                if current_dic['username'] and current_dic['login']:
                    res = func(*args, **kwargs)
                    return res
                username=input('使用者名稱:').strip()
                passwd=input('密碼:').strip()
                for user_dic in user_list:
                    if username == user_dic['name'] and passwd == user_dic['passwd']:
                        current_dic['username']=username
                        current_dic['login']=True
                        res = func(*args, **kwargs)
                        return res
                else:
                    print('使用者名稱或者密碼錯誤')
            elif auth_type == 'ldap':
                print('鬼才特麼會玩')
                res = func(*args, **kwargs)
                return res
            else:
                print('鬼才知道你用的什麼認證方式')
                res = func(*args, **kwargs)
                return res

        return wrapper
    return auth_func

@auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一個auth_type  --->index=auth_func(index)
def index():
    print('歡迎來到京東主頁')

@auth(auth_type='ldap')
def home(name):
    print('歡迎回家%s' %name)
#
@auth(auth_type='sssssss')
def shopping_car(name):
    print('%s的購物車裡有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))

# print('before-->',current_dic)
# index()
# print('after--->',current_dic)
# home('產品經理')
shopping_car('產品經理')

裝飾器預演

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time = time.time()
        print('函式執行時間是%s' %(stop_time-start_time))
        return res
    return wrapper













@timmer
def cal(l):
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    return res

res=cal(range(20))
print(res)

裝飾器

import time
def cal(l):
    start_time=time.time()
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    stop_time = time.time()
    print('函式的執行時間是%s' %(stop_time-start_time))
    return res



print(cal(range(100)))


def index():
    pass

def home():
    pass

裝飾器實現

import time
def timmer(func): #func=test
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在執行test()
        stop_time = time.time()
        print('執行時間是%s' %(stop_time-start_time))
    return wrapper

@timmer #test=timmer(test)
def test():
    time.sleep(3)
    print('test函式執行完畢')
test()

# res=timmer(test)  #返回的是wrapper的地址
# res()  #執行的是wrapper()

# test=timmer(test)  #返回的是wrapper的地址
# test()  #執行的是wrapper()

#  @timmer  就相當於 test=timmer(test)

生成器相關的yield

# age=10
# res=True if age > 10 else False
#
# l=['a' for i in range(10)]
# g_l=('a' for i in range(10))



def test():
    for i in range(4):
        yield i
t=test()


# for i in t:
#     print(i)
#
# t1=(i for i in t)
# print(list(t1))

# t1=(i for i in t)
# t2=(i for i in t1) #這裡為空 因為生成器一次就完蛋了 他並會儲存裡面的值
# print(list(t1))
# print(list(t2))