python 嵌套函數、閉包裝飾器、裝飾器例子

十、python 嵌套函數、閉包裝飾器、裝飾器例子

python的函數可以嵌套定義

閉包:能夠保留函數定義時的環境信息

嵌套函數的定義:

內部函數用到咯外部函數中的變量

外部函數返回內部函數

def outer():

def inner():

...

return inner

----------------------------------------------------------

#閉包,一定是嵌套函數(函數也是對象)

def f(x):

    y = 100

    def inner(z):

        return x * y + z

    return inner

a10 = f(10)

a20 = f(20)

 

print a10(29),a20(29)

------------------------------------------------

 

裝飾器

不帶參數裝飾器:

decorator(f)(*args,**kwags)

 

@decorator

def f():

...

 

帶參數裝飾器:

decorator(name)(f)(*args,**kwags)

 

@decorator(name)

def f():

...

 

-----------------------------裝飾器例子--------------------

-----------------------------日誌裝飾器----------------------------

import time

#想打印方法被調用的詳細信息日誌(開始時間、結束時間等)

 

def f(x,y):

    return x+y

 

def f1(x,y):

    print 'calling f2',x,y

    start = time.clock()

    z = x+y  #相當於把方法中的業務拿下來,修改很麻煩,難適合任意函數

    end = time.clock()

    print 'start at:',start,'end at:',end

    return z

print f(10,20)

print f1(10,20)

 

#使用裝飾器來做。裝飾器是用閉包來做的

def log(func): #func是被裝飾函數的名稱。無參數的裝飾器

    def wrapper(*args, **kwargs): #裝飾器要適用所有的函數所以參數定義用任意的

        print '~' * 40

        start = time.clock()

        res = func(*args,**kwargs)

        end = time.clock()

        print 'calling', func.__name__

        print 'start at:',start,' end at:',end

        return res

    return wrapper

def logEx(name):   ##帶參數的裝飾器,三層嵌套。

    def wrapper(func):

        def wrapper1(*args,**kwargs):

            print '~' * 40

            start = time.clock()

            res = func(*args, **kwargs)

            end = time.clock()

            print name, ' calling ', func.__name__, args

            print 'start at:', start, ' end at:', end

            return res

        return wrapper1

    return wrapper

 

@log   #裝飾器一定要在使用函數之前調用;同時這個是不帶參數的裝飾器

def f(x,y):

    return x+y

 

@logEx('aidon')

def f2(x,y):

    return x*y

 

print f(20,30)

print f2(20,30)

---------------------------------------------------------------

 

-------------------------------------------------

##身份認證裝飾器

def authorize(func):

    def wrapper(*args,**kwargs):

        if True:

            print 'welcome'

            return func(*args,**kwargs)

        else:

            print 'faild'

    return wrapper

 

@logEx('aidon')

@authorize

def f2(x,y):

    return x*y

 

print f2(20,30)

 

---------------------------------------------------

發佈了49 篇原創文章 · 獲贊 60 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章