209. 長度最小的子陣列. ①字首和加二分②雙指標
阿新 • • 發佈:2020-06-29
閉包:
閉包簡單來講是指使用了外部環境變數的函式,函式在宣告定義之時在程式碼塊內部的變數屬於locals(),但是如果引用使用了函式程式碼塊外部的變數,那麼就可以實現一些功能,比如我們需要實時瞭解得知一個函式內部某些變數的值,但是在執行完畢或者執行之前函式內部屬於區域性,其中的變數是區域性變數,可能存在無法訪問的情況,或是被垃圾回收機制處理掉。那麼我們可以在函式內部定義一個可以訪問本函式變數的函式成員,然後返回這個函式成員,這樣作為返回值的子函式所訪問到的外部函式的變數就不會被清零引用值,不會被清空記憶體。
舉例子就是:
1 #__closure__#新建閉包函式等於新建函式+附加自由變數2 #函式編譯過程中內部函式會有一個閉包的特殊屬性__closure__(func_closure)。__closure__屬性是一個由cell物件組成的元組,包含了由多個作用域引用的變數 3 def outter(): 4 name='jack'#定義了,被下層函式使用 5 age=24#定義了,被下層函式使用 6 address='BJ'#定義了,被下層函式做返回值 7 hobbie='fishing'#定義了但未被本函式和下層函式使用 8 9 def inner1(): 10 new_name=name[0:3]11 new_age+=age 12 inner1_l=locals() 13 inner1_g=globals() 14 return address,inner1_l#使用outer的 15 return inner1 16 inner1 = outter()
17
這裡通過返回值我們就可以用inner1()返回值來訪問outter()一些區域性變數,所謂閉包,可以看做多做一層包裝。(還記得c++一個返回引用型別的函式的返回值是可以修改的嗎?)
裝飾器:
在已有的函式的基礎上包裝一個能夠接受函式的高階函式,從而新增已有函式的功能同時不改變名字。
使用python的@語法糖來對函式進行修飾。
1 # 使用 @ 語法糖 2 # @是python裝飾器的簡便寫法,是Python的語法糖 3 4 import datetime 5 6 def outer_fun(fun): 7 #do something you want here 8 str1='This is string from outer' 9 10 def inner(): 11 print(2) 12 print(str1) 13 print('from inner to execute:',fun.__name__) 14 print('the',fun.__name__,'result:',fun()) 15 print('extra:',datetime.datetime.now()) 16 17 return inner 18 19 #裝飾器語法糖在要被包裹的函式前宣告。 20 #@後面的函式名,是把下邊函式進行包裹的函式的名字outer_fun 21 @outer_fun#為fun1函式新增一個裝飾器函式叫outer_fun 22 def fun1(): 23 return 'this is fun1 function--' 24 25 @outer_fun#為fun1函式新增一個裝飾器函式,叫outer_fun 26 def fun2(): 27 return 'this is fun2 function--' 28 29 # 裝飾器在Python使用如此方便都要歸因於 30 # Python的函式能像普通的物件一樣能作為引數傳遞給其他函式 31 # 可以被賦值給其他變數,可以作為返回值,可以被定義在另外一個函式內 32 33 #裝飾器是AOP思想的體現。Aspect Oriented Programming(面向切面程式設計) 34 fun1() 35 dd=9 36 print(dd) 37 fun2()
38 def outter(func):
39 print('This is the outside.')
40 func()
41 return func
42 @outter
43 def fun():
44 print("I am the inside one!")
45 return None
方便開發者修改已有的函式功能,且不必要重新改名字。