python函數三 (裝飾器)

來源:互聯網
上載者:User

標籤:判斷   log   bsp   其他   closed   實體   opened   blog   傳回值   

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

函數名本質上就是函數的記憶體位址。通俗點就是特殊的普通變數

def func():    print(111)func()print(func)# 結果:# 111# <function func at 0x00000150713F6048>

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

def func():    print(‘in func‘)f = funcf()# 結果:# in func

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

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

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

def func():    print(111)func()def func2():    return funcf = func2()f()# 結果:         從上到下運行,遇見func()後調用函數列印一個111,# 111            之後到f = func2(),調用func2()返回給f一個值func,# 111            最後f()即func()再次調用後列印一個111

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

1.可在運行期建立

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

3.可存入變數的實體。

二。閉包

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

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

         他會在記憶體中開啟一個記憶體空間,不會隨著函數的結束而關閉

from urllib.request import urlopenprint(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 getindex(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()def index():    url = "http://www.xiaohua100.cn/index.html"    def get():        return urlopen(url).read()    return get
耙梳頁(閉包用處)

判斷是否是閉包函數:__closure__

ef func():    name = ‘alex‘    def func2():        print(name)    func2()    print(func2.__closure__)               #含有 cell  就是閉包  None  不是閉包func()# 結果:# alex# (<cell at 0x0000011AD42A75B8: function object at 0x0000011AD6178A60>, <cell at 0x0000011AD42A75E8: str object at 0x0000011AD6177378>)name = ‘alex‘def func():    def func2():        print(name)    func2()    print(func2.__closure__)                #     None   不是閉包func()# 結果:# alex# Nonedef func(x):    def func2():        print(x)    func2()    print(func2.__closure__)                    func(‘alex‘)# 結果:# alex# (<cell at 0x0000029D98CE75B8: str object at 0x0000029D98D77538>,)

 三。在外層函數內部執行內建函式

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

四。裝飾器

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

1.最low的寫法

import timedef func():    print(‘我們都一樣‘)start_time = time.time()time.sleep(0.1)func()end_time = time.time()print(‘------的執行效率%s‘%(end_time-start_time))# 結果:# 我們都一樣# ------的執行效率0.10034990310668945
View Code

2.進階寫法

import timedef func():    print(‘我們都一樣‘)def timmer():    start_time = time.time()    time.sleep(0.1)    func()    end_time = time.time()    print(‘------的執行效率%s‘%(end_time-start_time))timmer()# 雖然也可以運行,但是影響了func()的正常運行,還可以在進階
View Code

3.簡單的裝飾器

import timedef func():    print(‘我們都一樣‘)def timmer(f):    def inner():        start_time = time.time()        time.sleep(0.1)        f()        end_time = time.time()        print(‘------的執行效率%s‘%(end_time-start_time))    return innerfunc = timmer(func)func()# 可以理解為func,timmer,inner通過賦值轉換,加參數,最後只剩一個func,# 這樣就可以運行程式,又可以知道執行效率
View Code

4.帶傳回值的裝飾器(文法糖的用法)

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

import timedef 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@timmerdef func():    return ‘天若有情天亦老,人間正道是滄桑‘# func()         列印傳回值的話不能寫這步,否則函數會在調用一次,多列印一次執行效率print(func())# 結果:# ------執行效率0.1002659797668457# 天若有情天亦老,人間正道是滄桑

5.通用裝飾器

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

 

python函數三 (裝飾器)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.