有一段時(shí)間高估了自己听诸,都沒(méi)有認(rèn)真看教程坐求。
現(xiàn)在慘了,得一課課復(fù)習(xí)蛇更!
要吸取教訓(xùn)瞻赶。
以下筆記重點(diǎn)為裝飾器。
返回函數(shù)
注意1:當(dāng)我們調(diào)用lazy_sum()時(shí)派任,每次調(diào)用都會(huì)返回一個(gè)新的函數(shù)砸逊,即使傳入相同的參數(shù):
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False```
f1()和f2()的調(diào)用結(jié)果互不影響。
注意2:函數(shù)內(nèi)函數(shù)的變量可以被外層函數(shù)引用掌逛。
注意3:一種賦值方法
a,b,c = [1,2,3]
a
1
然后來(lái)理解下面的代碼:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()```
每次循環(huán)都創(chuàng)建了一個(gè)新的函數(shù)师逸,一共循環(huán)了三次,但因?yàn)闆](méi)有調(diào)用豆混,所以都只是一個(gè)函數(shù)名f篓像,然后fs = [f,f,f] 动知,這時(shí)候的i= 3,因此f1员辩,f2盒粮,f3賦值的時(shí)候都為f,調(diào)用都為3*3 = 9
而以下代碼中
def count():
def f(j):
g = lambda j:j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))
return fs
f(i)立刻被執(zhí)行奠滑,因此i的當(dāng)前值被調(diào)用
匿名函數(shù)
a = lambda m :b```
相當(dāng)于
def a(m):
return b```
裝飾器
接受一個(gè)函數(shù)作為參數(shù)丹皱,并返回一個(gè)函數(shù),使得原來(lái)函數(shù)功能不變的情況下拓展函數(shù)功能
經(jīng)過(guò)我無(wú)數(shù)次的不同的嘗試以后宋税,有如下的總結(jié)摊崭。
總結(jié)1:當(dāng)裝飾器只有函數(shù)名的時(shí)候,將裝飾器下面的函數(shù)名作為其參數(shù)杰赛,如果裝飾器有函數(shù)名加上參數(shù)呢簸,那么相當(dāng)于一個(gè)帶參數(shù)的函數(shù)返回了一個(gè)函數(shù)后,再將被裝飾的函數(shù)名作為其參數(shù)乏屯。
當(dāng)裝飾器的函數(shù)名不接受參數(shù)的時(shí)候根时,則會(huì)提示錯(cuò)誤:
TypeError: log() takes 0 positional arguments but 1 was given
2.定義函數(shù)中,return作為一個(gè)函數(shù)定義的結(jié)束辰晕,return之后的print都不起作用,return之前的值都屬于函數(shù)的一部分啸箫。調(diào)用的時(shí)候print語(yǔ)句會(huì)直接打印出來(lái),return的儲(chǔ)存在你賦值的變量中伞芹,如果不賦值給變量則沒(méi)有意義忘苛,你用不了它。然后print變量的時(shí)候就會(huì)出來(lái)return的結(jié)果(不包括print后面的結(jié)果)
因此如果要在前后加上東西唱较,只能寫(xiě)在同一行利用占位符扎唾。
def m(x):
print('1')
return 3*x
print('6')
a = m(10) #輸出1
print('分割')
print(a) #輸出30
print('分割')
m(10) #輸出1
print('分割')
print(m(10)) #輸出 1 30
練習(xí):
def log(func):
def wrapper(x):
print('begin call \n %s \n end call' % func(x))
return wrapper
def f(x):
return x*x```
f(10)
begin call
100
end call
另一個(gè)練習(xí)只要用一個(gè)條件判斷即可,不再贅述南缓。