Python學習之路-裝飾器&生成器&正則表達式
阿新 • • 發佈:2017-09-18
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學習之路-裝飾器&生成器&正則表達式