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__()方法且要返回迭代器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章