閉包內容:
匿名函數:能夠完成簡單的功能,傳遞這個函數的引用,只有功能
普通函數:能夠完成復雜的功能,傳遞這個函數的引用,只有功能
閉包:能夠完成較為復雜的功能,傳遞這個閉包中的函數以及數據,因此傳遞是功能+數據
對象:能夠完成最復雜的功能,傳遞很多數據+很多功能,因此傳遞的是數據+功能
———————————————————
對全局函數進行修改:在函數當中加global,在閉包中外邊中的變量加nonlocal
閉包定義:有兩個函數嵌套使用,里面的函數可以使用外面函數所傳輸的參數,最后可傳遞的是里面函數的結構與數據(個人理解)。
最后閉包可以在python中引申出裝飾器 ———————————————————
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def closure(): # 在函數內部再定義一個函數, # 并且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為閉包 def closure_in(x): print ( '---------我是打不死的%s--------' % x) return closure_in ? x = closure() x( '小強' ) ? print ( '*' * 20 ) # -----加餐--------- def closure_1(a,b,c): def closure_on(x): print ( '-----%s加餐-------' % b) print (a * x + c) return closure_on ? demo = closure_1( 2 , '小強' , 3 ) #傳closure_1函數 demo( 4 ) #傳clsure_on函數 ? #注:函數不加括號,調用的是函數本身【function】;函數加括號,調用的是函數的return結果。 |
裝飾器內容:
代碼要遵守‘開放封閉'原則;對已經寫好的函數遵守封閉,對功能擴展遵守開放;
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 裝飾器的作用:為了對原來的代碼上進行擴展 def decoration(func): def call_func(): print ( '-------正在裝飾 -------' ) func() return call_func ? #@decoration #--->demo_new = decoration(demo) def demo(): print ( 'demo----' ) ? demo_new = decoration(demo) demo_new() |
使用裝飾器來測試一個函數的運行時:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import time def set_func(func): def call_func(): start_time = time.time() func() stop_func = time.time() print (‘alltimes is % f' % (stop_func - start_fun)) return call_func @set_func def test1(): print (‘—— - test1———') test1() ? #等價于: @set_func = = test1 = set_func(test1) |
1. 沒有參數,沒有返回值的函數進行裝飾:
1
2
3
4
5
6
7
8
9
10
|
def set_func(func): def call_func(): print (‘———test2—— - ') print (‘——— - test3——') func() return call_func @set_func def test1(): print (‘——test1—— - ') |
2. 對有參數無返回值的函數進行裝飾:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def set_func(func): def call_func(a): #變 print (‘———test2—— - ') print (‘——— - test3——') func(a) #變 return call_func @set_func def test1(num): print (‘——test1—— - % d ' % num) ? test1( 100 ) — - >call_func( 100 ) test1( 200 )——>call_func( 200 ) |
復現裝飾器原理:
————————————————————————-
只要遇到@函數 裝飾器(這句話),在程序中就已經執行了!!
3. 不定長參數的函數裝飾:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def set_func(func): def call_func( * args, * * kwargs): #變 print (‘———test2—— - ') print (‘——— - test3——') func( * args, * * kwargs) #(拆包)將元祖拆開,每個進行傳輸; #func(args,kwargs)—>不行,相當于傳遞了兩個參數:一個元祖,一個字典。 return call_func @set_func def test1(num, * args, * * kwargs): print (‘——test1—— - % d ' % num) print (‘——test1—— - ' , args) print (‘——test1—— - ' ,kwargs ) test1( 100 ) test1( 100 , 200 ) test1( 100 , 200 , 300 ,mm = 100 ) |
注意:*args保存不定長參數,以元祖保存,**kwargs保存字典形式(mm=...)
4.對應的返回值參數進行裝飾、通用裝飾器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#通用裝飾器 def set_func(func): print (“開始進行裝飾——— - ”) def call_func( * args, * * kwargs): #變 print (‘———test2—— - ') print (‘——— - test3——') return func( * args, * * kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。 #func(args,kwargs)—>不行,相當于傳遞了兩個參數:一個元祖,一個字典。 return call_func @set_func def test1(num, * args, * * kwargs): print (‘——test1—— - % d ' % num) print (‘——test1—— - ' , args) print (‘——test1—— - ' ,kwargs ) return ‘ok' #—-返回給上面的func(),然后return func—ret ret = test1( 100 ) |
5. 多個裝飾器對同一個函數進行裝飾:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def add_qx(func): print (“——開始進行裝飾權限 1 ——— - ”) def call_func( * args, * * kwargs): #變 print (‘這是權限驗證 1 ') return func( * args, * * kwargs) return call_func ? def add_xx(func): print (“——開始進行裝飾xx功能——— - ”) def call_func( * args, * * kwargs): #變 print (‘這是xx權限驗證') return func( * args, * * kwargs) return call_func @add_qx @add_xx def test1(): print (‘——test1—— - ') test1() |
首先執行第一個,但是第一個裝飾器下面不是函數(裝飾器原則:下面必須是函數,否則不執行),所以第一個函數先等待,等第二個裝飾器執行后形成函數在交給第一個裝飾器;所以運行結果是:
開始進行裝飾xx的功能,
開始進行裝飾權限1,
這是權限驗證1,
這是xx權限驗證,
——-test1——-,
——————裝飾器練習—————- 輸出格式:<td><h1>haha</h1></td>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def set_func_1(func): def call_func(): return ‘<h1> ' + func() + ' < / h1>' return call_func ? def set_func_2(func): def call_func(): return ‘<td> ' + func() + ' < / td>' return call_func @set_func_1 () @set_func_2 () def get_str(): return ‘haha' print (get_str()) 最后執行的效果: <h1><td>haha< / td>< / h1> |
6. 用類對函數進行裝飾(了解):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Test( object ): def __init__( self ,func): self .func = fun def __call__( self ): print (‘這里是裝飾器的功能。。。。') return self .func() @Test def get_str(): return ‘haha' print (get_str()) |
以上就是裝飾器與閉包的全部內容
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/xbhog/p/13194954.html