python中函數(shù)總結(jié)之裝飾器閉包詳解
1、前言
函數(shù)也是一個對象,從而可以增加屬性,使用句點來表示屬性。
如果內(nèi)部函數(shù)的定義包含了在外部函數(shù)中定義的對象的引用(外部對象可以是在外部函數(shù)之外),那么內(nèi)部函數(shù)被稱之為閉包。
2、裝飾器
裝飾器就是包裝原來的函數(shù),從而在不需要修改原來代碼的基礎(chǔ)之上,可以做更多的事情。
裝飾器語法如下:
@deco2 @deco1 def func(arg1,arg2...): pass
這個表示了有兩個裝飾器的函數(shù),那么表示的含義為:func = deco2(deco1(func))
無參裝飾器語法如下:
@deco def func(): pass
表示的含義為func = deco(func)
有參裝飾器語法如下:
@deco(deco_args) def func(): pass
表示的含義為:func = deco(deco_args)(func)
多個裝飾器有的有參數(shù)有的沒參數(shù),語法如下:
@deco2(arg1,arg2) @deco1 def func(): pass
表示的含義為foo = deco2(arg1,arg2)deco1(func)
裝飾器實際上就是函數(shù),接受的也是函數(shù)對象。
在執(zhí)行函數(shù)之前,可以運行預(yù)備代碼,也可以在執(zhí)行代碼后做一些清理工作。
看見裝飾器的時候,很可能在里面找到一些代碼,它定義了某個函數(shù),并在定義內(nèi)的某處嵌入了對目標(biāo)函數(shù)的調(diào)用或者至少一點引用。
3、裝飾器作用
裝飾器的作用如下:
引入日志;增加計時邏輯來檢測性能;給函數(shù)加入了事物的能力
以下例子表示為引入了計時的邏輯來檢測性能,如下:
#!/usr/bin/env python
from time import ctime,sleep
def tsfunc(func): #裝飾器函數(shù)接受的是一個函數(shù)對象
def wrappedFunc():
print '[%s] %s() called' % (ctime(),func.__name__)
return func() #在這里調(diào)用了函數(shù)對象,也就是表示裝飾器是裝飾了原來的函數(shù),從而在原來函數(shù)的基礎(chǔ)上進(jìn)行了一些操作
return wrappedFunc
@tsfunc #裝飾器
def foo():
pass
foo()
sleep(4)
for i in range(2):
sleep(1)
foo()
執(zhí)行結(jié)果如下:
[root@python 420]# python deco.py [Tue Apr 19 16:15:01 2016] foo() called [Tue Apr 19 16:15:06 2016] foo() called [Tue Apr 19 16:15:07 2016] foo() called
在裝飾器函數(shù)中,增加了時間戳并且調(diào)用了目標(biāo)函數(shù),裝飾器的返回值是一個包裝了函數(shù)。
4、閉包
如果在一個內(nèi)部函數(shù)里,對在外部作用于(但不是全局作用域)的變量進(jìn)行引用,那么內(nèi)部函數(shù)被認(rèn)為是閉包closure,定義在外部函數(shù)內(nèi)的但由內(nèi)部函數(shù)引用或者使用的變量稱之為自由變量。
閉包的主要作用如下:
安裝計算;隱藏狀態(tài);在函數(shù)對象和作用域中隨意的切換。
回調(diào)就是函數(shù),閉包也是函數(shù),但是能攜帶一點額外的作用域。
#!/usr/bin/env python
def counter(start_at=0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
count= counter(5)
print count()
print count()
在上面的例子可以看到,函數(shù)內(nèi)部的函數(shù)incr引用了外部的變量count,并且每次進(jìn)行加一,從而這個變量count稱之為自由變量。
以上這篇python中函數(shù)總結(jié)之裝飾器閉包詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pytorch之tensorboard無法啟動和顯示問題及解決
這篇文章主要介紹了Pytorch之tensorboard無法啟動和顯示問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
PyTorch如何利用parameters()獲取模型參數(shù)
這篇文章主要介紹了PyTorch如何利用parameters()獲取模型參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
使用Python將xmind腦圖轉(zhuǎn)成excel用例的實現(xiàn)代碼(一)
這篇文章主要介紹了使用Python將xmind腦圖轉(zhuǎn)成excel用例的實現(xiàn)代碼(一),本文給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Python學(xué)習(xí)之線程池與GIL全局鎖詳解
本文我們將學(xué)習(xí)線程池的創(chuàng)建與全局鎖。線程池的創(chuàng)建于進(jìn)程池的原理是相同的;關(guān)于GIL全局鎖,暫時沒有代碼上的練習(xí),而是對其概念進(jìn)行一個簡單的啟蒙,感興趣的可以了解一下2022-04-04
利用Python實現(xiàn)原創(chuàng)工具的Logo與Help
這篇文章主要給大家介紹了關(guān)于如何利用Python實現(xiàn)原創(chuàng)工具的Logo與Help的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考借鑒,下面來一起看看吧2018-12-12
詳解pandas DataFrame的查詢方法(loc,iloc,at,iat,ix的用法和區(qū)別)
這篇文章主要介紹了詳解pandas DataFrame的查詢方法(loc,iloc,at,iat,ix的用法和區(qū)別),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

