1、 lru_cache
成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)建站一個(gè)展示的機(jī)會(huì)來證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。
這個(gè)裝飾器來自functools模塊。該模塊包含在標(biāo)準(zhǔn)庫中,非常易于使用。它還包含比這個(gè)裝飾器更酷的功能,但這個(gè)裝飾器是非常受人喜歡的。此裝飾器可用于使用緩存加速函數(shù)的連續(xù)運(yùn)行。當(dāng)然,這應(yīng)該在使用時(shí)記住一些關(guān)于緩存的注意事項(xiàng),但在通用使用情況下,大多數(shù)時(shí)候這個(gè)裝飾器都是值得使用的。
2、JIT
JIT是即時(shí)編譯的縮寫。通常每當(dāng)我們?cè)赑ython中運(yùn)行一些代碼時(shí),發(fā)生的第一件事就是編譯。這種編譯會(huì)產(chǎn)生一些開銷,因?yàn)轭愋捅环峙淞藘?nèi)存,并存儲(chǔ)為未分配但已命名的別名,使用即時(shí)編譯,我們?cè)趫?zhí)行時(shí)才進(jìn)行編譯。
在很多方面,我們可以將其視為類似于并行計(jì)算的東西,其中Python解釋器同時(shí)處理兩件事以節(jié)省時(shí)間。Numba JTI編譯器因?qū)⑦@一概念提到Python中而聞名,可以非常輕松地調(diào)用此裝飾器,并立即提高代碼的性能。Numba包提供了JIT裝飾器,它使運(yùn)行更密集的軟件變得更加容易,而不必進(jìn)入C。
3、do_twice
do_twice裝飾器的功能與它的名字差不多。此裝飾器可用于通過一次調(diào)用運(yùn)行兩次函數(shù),對(duì)調(diào)試特別有用。它可以用于測量兩個(gè)不同迭代的功能。
4、count_calls
count_calls裝飾器可用于提供有關(guān)函數(shù)在軟件中使用多少次的信息。與do_twice一樣,對(duì)調(diào)試也特別有用。
5、dataclass
為了節(jié)省編寫類的時(shí)間,推薦使用dataclass裝飾器。這個(gè)裝飾器可用于快速編寫類中常見的標(biāo)準(zhǔn)方法,這些方法通常會(huì)在我們編寫的類中找到。
6、singleton
singleton是一個(gè)單例裝飾器。通常,單例裝飾器是由用戶自己編寫的,實(shí)際上并不是導(dǎo)入的。
7、use_unit
在科學(xué)計(jì)算中經(jīng)常派上用場的一種裝飾器是use_unit裝飾器。此裝飾器可用于更改返回結(jié)果的表示單位。這對(duì)于那些不想在數(shù)據(jù)中添加度量單位但仍希望人們知道這些單位是什么的人很有用。這個(gè)裝飾器可不是在任何模塊中真正有用,但它是非常常見的,對(duì)科學(xué)應(yīng)用程序非常有用。
裝飾器是通過裝飾器函數(shù)修改原函數(shù)的一些功能而不需要修改原函數(shù),在很多場景可以用到它,比如① 執(zhí)行某個(gè)測試用例之前,判斷是否需要登錄或者執(zhí)行某些特定操作;② 統(tǒng)計(jì)某個(gè)函數(shù)的執(zhí)行時(shí)間;③ 判斷輸入合法性等。合理使用裝飾器可以極大地提高程序的可讀性以及運(yùn)行效率。本文將介紹Python裝飾器的使用方法。
python裝飾器可以定義如下:
輸出:
python解釋器將test_decorator函數(shù)作為參數(shù)傳遞給my_decorator函數(shù),并指向了內(nèi)部函數(shù) wrapper(),內(nèi)部函數(shù) wrapper() 又會(huì)調(diào)用原函數(shù) test_decorator(),所以decorator()的執(zhí)行會(huì)先打印'this is wrapper',然后打印'hello world', test_decorator()執(zhí)行完成后,打印 'bye' ,*args和**kwargs,表示接受任意數(shù)量和類型的參數(shù)。
裝飾器 my_decorator() 把真正需要執(zhí)行的函數(shù) test_decorator() 包裹在其中,并且改變了它的行為,但是原函數(shù) test_decorator() 不變。
一般使用如下形式使用裝飾器:
@my_decorator就相當(dāng)于 decorator = my_decorator(test_decorator) 語句。
內(nèi)置裝飾器@functools.wrap可用于保留原函數(shù)的元信息(將原函數(shù)的元信息,拷貝到對(duì)應(yīng)的裝飾器函數(shù)里)。先來看看沒有使用functools的情況:
輸出:
從上面的輸出可以看出test_decorator() 函數(shù)被裝飾以后元信息被wrapper() 函數(shù)取代了,可以使用@functools.wrap裝飾器保留原函數(shù)的元信息:
輸出:
裝飾器可以接受自定義參數(shù)。比如定義一個(gè)參數(shù)來設(shè)置裝飾器內(nèi)部函數(shù)的執(zhí)行次數(shù):
輸出:
Python 支持多個(gè)裝飾器嵌套:
裝飾的過程:
順序從里到外:
test_decorator('hello world') 執(zhí)行順序和裝飾的過程相反。
輸出:
類也可以作為裝飾器,類裝飾器主要依賴__call__()方法,是python中所有能被調(diào)用的對(duì)象具有的內(nèi)置方法(python魔術(shù)方法),每當(dāng)調(diào)用一個(gè)類的實(shí)例時(shí),__call__()就會(huì)被執(zhí)行一次。
下面的類裝飾器實(shí)現(xiàn)統(tǒng)計(jì)函數(shù)執(zhí)行次數(shù):
輸出:
下面介紹兩種裝飾器使用場景
統(tǒng)計(jì)函數(shù)執(zhí)行所花費(fèi)的時(shí)間
輸出:
在使用某些web服務(wù)時(shí),需要先判斷用戶是否登錄,如果沒有登錄就跳轉(zhuǎn)到登錄頁面或者提示用戶登錄:
--THE END--
任何的序列(或者可迭代對(duì)象)可以通過一個(gè)簡單的賦值語句解壓并賦值給多個(gè)變量。
唯一的前提就是變量的數(shù)量必須跟序列元素的數(shù)量是一樣的
使用Python的星號(hào)(*)解決這個(gè)問題
解壓出來的變量永遠(yuǎn)是列表類型
使用collections.deque
使用heapq模塊的兩個(gè)函數(shù),nlargest()和nsmallest()
當(dāng)要查找的元素個(gè)數(shù)相對(duì)比較小的時(shí)候,heapq.nsmallest()和heapq.nlargest()是很合適的
如果只是想找唯一的最大或最小就使用max()和min()函數(shù)
如果N的大小和集合大小接近的時(shí)候,則使用切片操作會(huì)更快一點(diǎn)sorted(items)[:N]或者sorted(items)[-N:]
使用heapq模塊的heappush()和heappop()
一個(gè)字典就是一個(gè)鍵對(duì)應(yīng)一個(gè)單值的映射。
如果你想要一個(gè)值映射多個(gè)值,需要這多個(gè)值放到另外的容器中
使用collections模塊OrderedDict類
在迭代的時(shí)候保存元素被插入時(shí)的順序
注意,3.6 的 dict 是有序的,在此版本之前皆是無序
直接使用max函數(shù),是對(duì)字典的key值進(jìn)行操作
可以使用zip函數(shù)將鍵和值反轉(zhuǎn)過來
注意:zip()函數(shù)創(chuàng)建的是一個(gè)只能訪問一次的迭代器
可以簡單的使用字典的keys()或者items()方法返回結(jié)果上執(zhí)行集合操作
字典的keys()方法返回一個(gè)展現(xiàn)鍵集合的鍵視圖對(duì)象
字典的items()方法返回一個(gè)包含(鍵,值)對(duì)的元素視圖對(duì)象
匿名函數(shù): 將創(chuàng)建好的匿名函數(shù)通過一個(gè)變量去接收,使用變量去調(diào)用函數(shù)
簡單使用set()方法構(gòu)建一個(gè)集合,也可以實(shí)現(xiàn)消除重復(fù)元素,但是元素位置會(huì)被打亂