1. 程式人生 > >函數之裝飾器

函數之裝飾器

python ret from object 全局 rst 技術 print app

---恢復內容開始---

一。函數名(學名:第一類對象)

函數名本質上就是函數的內存地址。通俗點就是特殊的變量.

def my():
print(666)
print(my) # 函數名my在內存的地址
print(id(my)) #變量my在內存的地址

結果:

技術分享圖片

1.可以被引用(即可以賦值給其他變量)

def func():
    print(666)
f = func   #將func賦值給f
f()      #相當於func()

結果:

技術分享圖片

2.可以被當作容器類型的元素

def func():
    print(111)
def func2():
    print
(222) def func3(): print(333) li = [func(),func2(),func3()] for i in li: i

結果;

技術分享圖片

3.可以當作函數的參數和返回值

def func():
    print(111)
def func2():
    return func  #當作返回值
f = func2()
f()         #當作參數

結果:

技術分享圖片

第一類對象(first-class object)指

1.可在運行期創建

2.可用作函數參數或返回值

3.可存入變量的實體。

二。閉包

閉包的定義:內層函數,對外層函數(非全局)的變量的引用,叫做閉包

閉包的用處:如果說你內存函數是個閉包,python內部有一個機制,遇到閉包

內存會在內存中開啟一個內存空間,不會隨著函數的結束而關閉,避免多次開關內存.

簡單應用

from urllib.request import urlopen
print(urlopen(http://www.cnblogs.com/jin-xin/articles/8259929.html).read())

def index(url):
    content = urlopen(url).read()
    def get():
        with open(爬蟲,a) as f1:
            f1.write(content.decode(
utf-8)) return get index(http://www.cnblogs.com/jin-xin/articles/8259929.html)()

結果;

技術分享圖片

判斷函數是否是閉包.__closure__

def func():
    name = alex
    def func2():
        print(name)
    func2()
    print(func2.__closure__)               #引用幾個變量就有幾個cell  這個函數就是閉包  不引用就是None  函數不是閉包
func()

結果:

技術分享圖片

三,在外層函數內部執行內部函數

def func():
    def func2():
        print(111)
    func2()
func()

def func():
    def func2():
        print(111)
    return func2
func()()

結果:

技術分享圖片

四。裝飾器

1.比如計算一個函數的執行效率

import time
def func():
    print(666)
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print(------的執行效率%s%(end_time-start_time))

結果:

技術分享圖片

2.進階寫法

import time
def func():
    print(666)
def timmer():
    start_time = time.time()
    time.sleep(0.1)
    func()
    end_time = time.time()
    print(------的執行效率%s%(end_time-start_time))
timmer()

結果;

技術分享圖片

3.簡單的裝飾器

import time
def func():
    print(我們都一樣)
def timmer():
    start_time = time.time()
    time.sleep(0.1)
    func()
    end_time = time.time()
    print(------的執行效率%s%(end_time-start_time))
timmer()

結果;

技術分享圖片

4.帶返回值的裝飾器(語法糖的用法)

@timmer 相當於 #func = timmer(func) 即待求的函數名 = 新函數名(待求的函數名)

import time
def timmer(func):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        ret = func(*args,**kwargs)
        end_time = time.time()
        print(------執行效率%s%(end_time-start_time))
        return ret
    return inner

@timmer
def func():
    return 666
print(func())
結果:

技術分享圖片

5.通用裝飾器

def wrapper(func):
    def inner(*args,**kwargs):
        ‘‘‘執行函數前的操作‘‘‘
        ret = func(*args,**kwargs)
        ‘‘‘執行函數後的操作‘‘‘
        return ret
    return inner

@wrapper
def func():
    print(111)
func()


函數之裝飾器