天天看點

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

 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子產品。常用正規表達式符号:

常用文法函數: