閉包函數以及裝飾器

三種名稱空間

  1. 內置名稱空間:隨着python解釋器的啓動而產生

  2. 全局名稱空間:文件級別定義的名字會放入該空間

  3. 局部名稱空間:調用函數時會產生局部名稱空間,只在函數調用時臨時有效

作用域

  1. 全局作用域:內置名稱空間,全局名稱空間

  2. 局部作用域:局部名稱空間

名字查找順序

  • 局部名稱空間--->全局名稱空間--->內置名稱空間

  • 查看全局作用域內的名字:gloabls()

  • 查看局部作用域內的名字:locals()


x=1000def func(y):
    x=2
    print(locals())
    print(globals())
func(1)
locals --> {x:2,y:1}
globals --> x=1000,func
  • 全局作用域:全局有效,在任何位置都能被訪問到,除非del刪掉,否則會一直存活到文件執行完畢

  • 局部作用域的名字:局部有效,只能在局部範圍調用,只在函數調用時纔有效,調用結束就失效

閉包函數

  1. 定義在內部函數

  2. 包含對外部作用域而非全局作用域的引用,該內部函數就稱爲閉包函數

  • 簡單閉包函數

def f1():
        x = 1
        def f2():
            print(x)        return f2
    f=f1()#f1函數返回值爲f2,f=f2
x=1# y=2def f1():
    # x=1
    y=2
    def f2():
        print(x,y)    return f2

f=f1()
print(f.__closure__[0].cell_contents)
__closure__判斷是否爲閉包函數
cell_contents爲閉包函數打印內容

裝飾器

  • 裝飾器:修飾的工具,添加功能,工具值得是函數

  • 裝飾器本身可以是任何可調用的對象,被裝飾器對象也可以是任意可調用對象

  • 爲何使用裝飾器

  1. 開放封閉原則:對修改是封閉的,對擴展是開放的

  2. 裝飾器就是爲了在不修改被裝飾對象的源代碼以及調用方式的前提下,爲其添加新功能

#流程分析無參數裝飾器# import time# def timmer(func):#     def wrapper():#         start_time=time.time()#         func()#         stop_time=time.time()#         print('run time is %s' %(stop_time-start_time))#     return wrapper## @timmer #index=timmer(index)# def index():#     time.sleep(3)#     print('welcome to index')### index() #wrapper()
  • 有參數裝飾器

# import time# def timmer(func):#     def wrapper(*args,**kwargs):#         start_time=time.time()#         res=func(*args,**kwargs)#         stop_time=time.time()#         print('run time is %s' %(stop_time-start_time))#         return res#     return wrapper## @timmer #index=timmer(index)# def index():#     time.sleep(3)#     print('welcome to index')#     return 1## @timmer# def foo(name):#     time.sleep(1)#     print('from foo')### res=index() #wrapper()# print(res)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章