裝飾器
通俗的講,裝飾器就是在不改變源代碼基礎上,給源代碼增加新功能。
不改變函數的源代碼、調用方式、傳回值等,給函數增加新功能。
經典案例:登入裝飾器,def login_decorator(func):
def inner():
if USER_TEMP["status"] == False:
print("\033[31;1m使用者未登入,請先登入\033[0m")
login_atm()
func()
return inner
@login_decorator
def withdrawals():
print("取款函數。。。。")
說白了,給函數增加新功能,就是把這個函數當作參數傳到另一個函數裡面。
生成器
通過清單生成式,我們可以直接建立一個清單。但是,受到記憶體限制,清單容量肯定是有限的。而且,建立一個包含100萬個元素的清單,不僅占用很大的存儲空間,如果我們僅僅需要通路前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。
是以,如果清單元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,進而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
要建立一個generator,有很多種方法。第一種方法很簡單,隻要把一個清單生成式的[]改成(),就建立了一個generator:>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
at 0x1022ef630>
建立L和g的差別僅在于最外層的[]和(),L是一個list,而g是一個generator。
如果要一個一個列印出來,可以通過next()函數獲得generator的下一個傳回值:>>> next(g)
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "", line 1, in
StopIteration
如果生成器中沒有更過元素時,調用next(g)會抛出StopIteration的錯誤
是以,我們建立了一個generator後,基本上永遠不會調用next(),而是通過for循環來疊代它,并且不需要關心StopIteration的錯誤:>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
...
1
4
9
16
25
36
49
64
81
正規表達式
re子產品。常用正規表達式符号:
常用文法函數: