1. 程式人生 > >Python學習之路-裝飾器&生成器&正則表達式

Python學習之路-裝飾器&生成器&正則表達式

python 生成器 裝飾器 正則表達式

裝飾器


通俗的講,裝飾器就是在不改變源代碼基礎上,給源代碼增加新功能。

不改變函數的源代碼、調用方式、返回值等,給函數增加新功能。

經典案例:登錄裝飾器,

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
<generator object <genexpr> at 0x1022ef630>

創建L和g的區別僅在於最外層的[]和(),L是一個list,而g是一個generator。

如果要一個一個打印出來,可以通過next()函數獲得generator的下一個返回值:

>>> next(g)
0
>>> 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 "<stdin>", line 1, in <module>
StopIteration

如果生成器中沒有更過元素時,調用next(g)會拋出StopIteration的錯誤

所以,我們創建了一個generator後,基本上永遠不會調用next(),而是通過for循環來叠代它,並且不需要關心StopIteration的錯誤:

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81


正則表達式


re模塊。常用正則表達式符號:


‘.‘ 默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行‘^‘ 匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)‘$‘ 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以‘*‘ 匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 結果為[‘abb‘, ‘ab‘, ‘a‘]‘+‘ 匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果[‘ab‘, ‘abb‘]‘?‘ 匹配前一個字符1次或0‘{m}‘ 匹配前一個字符m次‘{n,m}‘ 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果‘abb‘, ‘ab‘, ‘abb‘]‘|‘ 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果‘ABC‘‘(...)‘ 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c ‘\A‘ 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的‘\Z‘ 匹配字符結尾,同$‘\d‘ 匹配數字0-9‘\D‘ 匹配非數字‘\w‘ 匹配[A-Za-z0-9]‘\W‘ 匹配非[A-Za-z0-9]‘s‘ 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 ‘\t‘


常用語法函數:

re.match 從頭開始匹配re.search 匹配包含re.findall 把所有匹配到的字符放到以列表中的元素返回re.splitall 以匹配到的字符當做列表分隔符re.sub 匹配字符並替換



Python學習之路-裝飾器&生成器&正則表達式