<1>什麼是「閉包」?
如果在⼀個內部函式⾥,對在外部作⽤域(但不是在全域性作⽤域)的變數進⾏引⽤,那麼
內部函式就被認為是閉包(closure).
(即:閉包=函式塊+引⽤環境)。
示例:
def
outer
(n):
num = n
definner()
:return num+
1return inner
print
(outer(3)
())# 4
print
(outer(5)
())# 6
輸出結果:46
<2>裝飾器
下面的**執行順序是:首先因@cal_time,函式demo被當成引數傳入到cal_time函式中,並開始執行函式內部**語句,執行結束時會返回inner內部函式物件,但是不會自動呼叫inner函式;緊接著,使用者輸入demo()這時呼叫的不再是原來的demo函式了,而是inner內部函式,因為第乙個步驟把demo函式當成引數傳入cal_time函式中返回了inner,使用者在有@cal_time的情況下輸入demo等同於inner();所以,最後開始執行inner函式內部的**語句,inner函式裡頭fn()相當於demo(),再一次呼叫了原來的demo函式。
import time #匯入time模組
defcal_time
(fn)
:#必要的裝飾器語法
print
("我是外部函式"
)def
inner()
:#必要的修飾器語法
start=time.time(
) fn(
) end=time.time(
)print
("**執行耗時為{}秒"
.format
(end - start)
)#列印**執行耗費時間
return inner #必要的裝飾器語法
@cal_time #必要的裝飾器語法
defdemo()
: s=
0for i in
range(1
,19900000):
s*=i
print
(s)
demo(
)#此時的demo()不再是指呼叫原來的demo函式了,而是呼叫了inner函式
輸出結果:
我是外部函式
0**執行耗時為1.0775115489959717秒
<3>模組
⼀個py⽂件就是⼀個模組。
匯入模組時,系統會把模組裡所有的**都執行一遍。
匯入模組的五種方法:
import time #直接匯入time模組
from random import randint #從random模組中匯入方法或者變數
from math import
*#從模組中匯入所有的方法和變數,和上面的區別是,這種在使用的時候不需要寫「模組名.方法」
import datetime as dt #匯入模組並給模組取別名
from copy import deepcopy as dp #從模組中匯入方法或者變數並重新起別名
自定義模組實際上就是自己寫乙個py檔案,自定義模組一定要遵守命名規則才可以被匯入使用。《由數字、字母和下劃線組成,數字不能作為開頭!>
import pandans 與 from pandans import * 的區別如下:
前者:使用模組的變數和方法時需要以「模組名.變數名(或方法名)」才可使用
後者:使用模組的變數和方法時直接寫變數名(或方法名)即可;本質是讀取模組裡的__all__屬性,只能使用__all__裡面的變數和方法。
以乙個下劃線開始的變數,建議只在原來的模組中使用,別的模組不要使用。這些變數或者函式一般是原來模組的中間變數或者中間函式,強行呼叫有可能出錯。
例如datatime模組中的_is_leap(year)是用於datatime模組中使用的。如果原來的模組裡做了del 變數名或者函式名的話,即使模組被匯入後,裡面被del的都不能被呼叫。
Python 裝飾器記錄
在這裡,我們先不用理解實現裝飾器需要的幾個python特性,以及裝飾器的內在原理。我們僅僅先了解函式裝飾器的基本作用,以及怎麼實現乙個具備基本作用的函式裝飾器。函式裝飾器的基本作用 字面理解,裝飾函式用的。其作用也不是很高大上,不過是裝飾器,可以對其裝飾的函式物件,做一些這個函式執行前的準備工作,以...
python學習 裝飾器
def w1 func def inner print 正在驗證 func 閉包 return inner def f1 print f1 def f2 print f2 f1 w1 f1 呼叫的 f1 發生改變 f1 在沒有修改 f1 引用的前提下,完成對 f1 的擴充套件 執行結果 在很多情況下...
python裝飾器學習
1 裝飾器的本質 閉包函式 2 裝飾器的作用 在不改變原函式的呼叫方式情況下,給原函式增加其他功能。3 開發原則 開放封閉原則。4 語法 裝飾器函式名 閉包函式 巢狀函式,內部函式呼叫外部函式的變數。def outer arg1 def inner print arg1 return inner i...