python -- 装饰器/生成器/迭代器

  • 装饰器
- 装饰器的本质:一个闭包函数
- 装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
  • 装饰器的存在是为了实现 开放封闭 原则:
 - 封闭: 已实现的功能代码块不应该被修改
 - 开放: 对现有功能的扩展开放
 - 理解装饰器的三要素:函数的作用域 、高阶函数、闭包
  • 闭包
- 闭包定义 - - 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)

def func1():
    a = 100
    def func2():  			 # 条件一: func2就是内部函数
        print(a)			 # 条件二: 对外部函数变量的引用
    return func2()			 # 结论: 内部函数func2就是一个闭包
func1()	

  • 装饰器的应用 - - 简单装饰器
import time

def func1():
    print('in func1')

def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

func1 = timer(func1)
func1()

  • 装饰器的应用 - - 语法糖 @
import time
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

@timer   #==> func1 = timer(func1)
def func1():
    print('in func1')

func1()

  • 装饰器的应用 - - 带参数装饰器(1)
def timer(func):
    def inner(a):  #为接收的参数 1
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

  • 装饰器的应用 - - 带参数装饰器(2)
import time
def timer(func):
    def inner(*args,**kwargs): 	#匿名参数 或 多个参数
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print('in func1')

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'   # 这是反回值

func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))

  • 装饰器的应用 - - 带返回值的装饰器
import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func2('aaaaaa')
print(func2('aaaaaa'))

  • 装饰器的应用 - - 模型(固定格式)
def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner

  • 装饰器的应用 - - 取消装饰器(标识位)
def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(True)  #判断条件是否满足   条件满足 进入装饰器 不满足不进入
def func():
    print(111)

func()

  • 装饰器的应用 - - 多个装饰器同时装饰一个函数
def wrapper1(func):
    def inner():
        print('wrapper1 ,before func') #第四步
        func()
        print('wrapper1 ,after func') #第六步
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func') # 第二步
        func()
        print('wrapper2 ,after func') #第七步
    return inner

@wrapper2  #第一步 
@wrapper1 #第三步
def f():
    print('in f')  #第五步

f()


  • 生成器
生成器,函数内部有yield就是生成器函数,调用函数则返回一个生成器,循环生成器时,则函数内部代码才会执行。
  • 迭代器
迭代器:对可迭代对象中的元素进行逐一获取,迭代器对象内部都有一个__next__()方法,用于以一个一个获取数据。
可迭代对象: 可以被for循环且此类对象中都有__iter__()方法且要返回迭代器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章