python笔记09-----装饰器,生成器,迭代器 1.装饰器

定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能

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

   2.不能修改被装饰的函数的调用方式

实现装饰器的知识储备:

  1.      函数即“变量”

  2.      高阶函数

           a.      把一个函数名当做实参传给另一个函数(在不修改被装饰函数源代码的情况下为期添加功能)

           b.      返回值中包含函数名(不修改函数的调用方式)

  3.      嵌套函数

  4.      高阶函数+嵌套函数=装饰器

1.1 实现简单的装饰器

 1 def outer(fun):
 2     def warper():
 3         print("outer 1")
 4         fun()                  #相当于把下边两个函数当参数传入进来
 5         print("outer 3")
 6     return warper
 7 
 8 @outer
 9 def test1():
10     print("test1 2")
11 @outer
12 def test2():
13     print("test2 2")           
14 test1()
15 test2()
-----------------结果----------------- 16 outer 1 17 test1 2 18 outer 3 19 outer 1 20 test2 2 21 outer 3

1.2 装饰器传参

简单难度的传参

 1 def outer(fun):
 2     def warper(*args,**kwargs):
 3         print("加的第一个功能在函数之前")
 4         fun(*args,**kwargs)
 5         print("加的第二个功能在函数之后")
 6     return warper
 7 
 8 @outer
 9 def test1(*args,**kwargs):
10     print(args,kwargs)
11     return
12 
13 
14 test1(123,"waa","yyy",name="wsy",Age=18)
15 ----------------结果----------------------
16 加的第一个功能在函数之前
17 (123, 'waa', 'yyy') {'name': 'wsy', 'Age': 18}
18 加的第二个功能在函数之后

中等难度的传参

加入time模块记录执行时间

import time

def timer(func):

    def deco(*args,**kwargs):
        start = time.time()
        print("装饰器:功能1")
        func(*args,**kwargs)
        print("装饰器:功能2")
        end = time.time()
        print("func run time is %s" %(end - start))
    return deco

@timer
def test1():
    time.sleep(1)
    print("in the test1")
@timer
def test2(*args,**kwargs):
    time.sleep(1)
    print("in the test1",args,kwargs)

test1()
test2(1,2,3,4,name="wsy",age=20)
--------------------结果------------------------
装饰器:功能1
in the test1
装饰器:功能2
func run time is 1.0000572204589844
装饰器:功能1
in the test1 (1, 2, 3, 4) {'name': 'wsy', 'age': 20}
装饰器:功能2
func run time is 1.0000572204589844

多重认证  第一个页面认证成功直接进入其他两个页面

 1 user,passwd = "wsy","123"
 2 def auth(auth_type):
 3     print("auth func:",auth_type)
 4     def outer_wrapper(func):
 5         def wrapper(*args,**kwargs):
 6             print("wrapper func args:", *args,**kwargs)
 7             if auth_type == "local": # 如果装饰器参数是local 就
 8                 username = input("Username:").strip() # 输入用户名
 9                 password = input("Password:").strip() # 输入密码
10                 if user == username and passwd == password: # 判断如果正确
11                     print("