*與**都可以用在形參中,用在形參中他們是彙總的意思。
*是把多餘的位置實參給彙總成元組的形式,賦值給args
*與**在是實參中,打散(彙總與打散互為逆過程)
舉例說明:
def index(*args,a=1,b=1):
print(*args,a,b)
index(*args,**kwargs) #將args打散 index(*(1,2,3,4,5),**) 打散成index(1,2,3,4,5,a=1,b=2)
命名空間的「巢狀」關係是在函式定義階段,即檢測語法的時候確定的
巢狀關係決定了找名字的時候,是在當前位置找,沒有去外層找,再沒有再去外層找,再沒有再去外層找......
函式物件:可以將函式當做變數去用,可以賦值、可以當做引數傳入,可以當做返回值返回,可以當做容器型別的元素
在這裡將用到,把函式當做引數傳入,不要加括號,傳入函式的記憶體位址
把函式當做返回值,不要加括號,返回函式的記憶體位址
例如:def index(x):
print(x)
def foo(func):
return func
c = foo(index) #將函式作為引數傳入時,不加括號,傳入的是函式的記憶體位址
c(2)
在乙個函式內,可以再包乙個函式
例如:def outter():
pass
閉函式:表示它在乙個函式內定義的函式
包函式:表示它訪問的乙個變數不是在它定義的範圍內,而是引用外層的變數
滿足兩者稱為閉包函式
補充:如果開始是全域性範圍下的函式,將他閉包後,如何讓他回到全域性的地位上呢?
方法:return 函式名
舉例:開始的warpper
def warpper():
print(x)
成為閉包函式的warpper
def outter():
x = 111
def warrper():
print(x)
return warrper
warrper = outter() #此時的warrper已經不是原來的warrper,現在的warrper是在outter定義的空間內,之前的warpper是在全域性。當函式內的名字被其他作用域所引用著時,那麼這個函式的記憶體空間不會被釋放(**)。
warrper()
print(x)
def outter(x):
print(x)
器指的是工具,可以定義成函式
裝飾指的是為其他事物新增額外的東西點綴
合到一起的解釋:
裝飾器指的的定義乙個函式,該函式是用來為其他函式的新增額外功能
開放封閉原則
開放:指的是對擴充套件功能是開放的
封閉:指的是對修改源**是封閉的
滿足開放封閉原則,在不修改源**的情況下拓展函式的功能
現實情況中在不修改原始功能的情況下拓展功能,最好不要修改源**
裝飾器就是在==不修改被裝飾器物件源**以及呼叫方式==的前提下,為被裝飾物件新增新功能
舉例: 需求在不修改index函式的源**以及呼叫方式的前提下為其新增統計執行時間的功能
import time
def index(x,y):
time.sleep(3)
print('index %s %s' % (x,y))
index(111,222)
無參裝飾器:
def timmer(func):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print('執行時間為:%f' %stop - start)
return res
補充:==語法糖==:在被裝飾物件正上方單獨一行寫@裝飾器名字即可
@timmer
def index(x,y):
time.sleep(3)
print('index %s %s' % (x,y))
index(111,222)
==總結無參裝飾器模板==
def outter(func):
#1、呼叫原函式
#2、增加新功能
res = func(*args,**kwargs)#引數要寫活
return res
python學習筆記 day17 初識遞迴
從前有座山,山上有座廟,廟裡有個老和尚,老和尚再給小和尚講故事 從前有座山,山上有座廟.這其實就是乙個遞迴的例子,只不過這是只遞不歸,再比如這段 def story print 從前有座山 story story 呼叫story 會不斷地執行裡面的 不斷又呼叫story 我們都知道當呼叫函式的時候,...
day17學習筆記(物件導向)
1 類屬性 定義在類中的變數 類屬性的值不會因為物件的不同而不同 2 物件屬性 通過 self.屬性名 值 定義在 init 函式中的屬性 物件屬性的值會因為物件不同而不同 物件.屬性 獲取物件指定屬性的值 getattr 物件,屬性名 獲取物件指定屬性的值 getattr 物件,屬性名,預設值 獲...
力扣學習筆記day17
編寫乙個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 char 的形式給出。不要給另外的陣列分配額外的空間,你必須原地修改輸入陣列 使用 o 1 的額外空間解決這一問題。你可以假設陣列中的所有字元都是 ascii 碼表中的可列印字元。eg 輸入 h e l l o 輸出 o l l e h...