python 基础篇 第十节课

装饰器

  本质就是函数

  功能:为其他函数添加附加功能

  原则:1不修改被修饰函数的源代码

     2不修改被修改函数的调用方式

  装饰器的知识储备:

     装饰器=高阶函数+函数嵌套+闭包

  高阶函数:

     1函数接受参数时一个函数名

     2函数的返回值是一个函数名

     3满足上述任意一个都可称之为高阶函数

函数嵌套:

def father(name):
    print("from father %s" %name)
    def son():
        print("from son")
        def grandson():
            print("from grandson")
        grandson()
    son()
father("孔令月")

#输出
# from father 孔令月
# from son
# from grandson

装饰器的架子:

import  time
def timmer(func):
    def wrapper():
        start_time = time.time()
        res= func()
        func()
        stop_time = time.time()
        print("运行时间%s" %(stop_time-start_time))
        return res
    return wrapper
@timmer
def test():
    time.sleep(2)
    print("test函数运行完毕")
    return"这就是返回值"
res = test()
print(res)

#输出
# test函数运行完毕
# test函数运行完毕
# 运行时间4.001586198806763
# 这就是返回值

加上参数

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 test(name,age):
    time.sleep(2)
    print("test函数运行完毕,名字是[%s],年龄是[%s]"%(name,age))
    return"这就是test的返回值"
res = test("孔令月", "18")
print(res)

@timmer
def test1(name,age,gender):
    time.sleep(1)
    print("test函数运行完毕,名字是[%s],年龄是[%s],性别是[%s]"%(name,age,gender))
    return"这就是test的返回值"
res1 = test1("alex",18,"male")
print(res1)
#输出
# test函数运行完毕,名字是[孔令月],年龄是[18]
# 运行时间2.0000550746917725
# 这就是test的返回值
# test函数运行完毕,名字是[alex],年龄是[18],性别是[male]
# 运行时间1.0000779628753662
# 这就是test的返回值

解压序列:

  a,b,c=(1,2,3)

  a----->1

  b----->2

  c----->3

  l=[1,3,5,98,6,14,6,6,2]

  a,_*,c=l

  a------->1

  c------->2

   a,_*d,c=l

   d------->[3,5,98,6,14,6,6]

 

闭包函数为函数加上认证功能

def auth_func(func):
    def wrapper(*args,**kwargs):
        username = input("请输入用户名:")
        passwd = input("请输入密码:")
        if username == "孔令月" and passwd == "951753":
            res = func(*args,**kwargs)
            return res
        else:
            print("用户名或密码错误")
    return wrapper

@auth_func
def index():
    print("欢迎来到淘宝")

@auth_func
def home(name):
    print("欢迎%s回家" %name)

@auth_func
def shopping_car(name):
    print("%s购物车里有[%s,%s,%s]"% (name,"iphone","篮球鞋",""))

index()
home("孔令月")
shopping_car("孔令月")

不用重复输入用户名和密码

user_dic = {"username":None,"login":False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if user_dic["username"] and user_dic["login"]:
            res = func(*args,**kwargs)
            return res
        username = input("请输入用户名:").strip()
        passwd = input("请输入密码:").strip()
        if username == "孔令月" and passwd == "951753":
            user_dic["username"]=username
            user_dic["login"]=True
            res = func(*args,**kwargs)
            return res
        else:
            print("用户名或密码错误!")
    return wrapper

@auth_func
def index():
    print("欢迎来到淘宝")

@auth_func
def home(name):
    print("欢迎%s回家" %name)

@auth_func
def shopping_car(name):
    print("%s购物车里有[%s,%s,%s]"% (name,"iphone","篮球鞋",""))

index()
home("孔令月")
shopping_car("孔令月")
user_list = [{"name":"孔令月","passwd":"123"},{"name":"科比","passwd":"123"},{"name":"韦德","passwd":"123"}]

user_dic = {"username":None,"login":False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if user_dic["username"] and user_dic["login"]:
            res = func(*args,**kwargs)
            return res
        username = input("请输入用户名:").strip()
        passwd = input("请输入密码:").strip()
        for a in user_list:
            if username == a["name"] and passwd == a["passwd"]:
                user_dic["username"]=username
                user_dic["login"]=True
                res = func(*args,**kwargs)
                return res
        else:
                print("用户名或密码错误!")
    return wrapper

@auth_func
def index():
    print("欢迎来到淘宝")

@auth_func
def home(name):
    print("欢迎%s回家" %name)

@auth_func
def shopping_car(name):
    print("%s购物车里有[%s,%s,%s]"% (name,"iphone","篮球鞋",""))

index()
home("就想把这个用户名调用到这儿怎么就这么难")
shopping_car("就想把这个用户名调用到这儿怎么就这么难")

带参数验证功能装饰器

未完成

posted @ 2018-09-22 00:10  Lune23333  阅读(78)  评论(0)    收藏  举报