有很多介紹python中各種很酷的功能(如變數拆包、偏函式、列舉可迭代物件)的文章,但說到python時,還有很多東西可以談論,這裡我將嘗試展示我所知道和使用的一些特性,我還沒有在其他地方看到有人提到過它們。我們開始吧。
1.清理字串輸入
對使用者輸入進行清理的問題幾乎適用於您編寫的所有程式。通常情況下,將字元轉換為小寫或大寫就足夠了,有時您可以使用regex來完成這項工作,但對於複雜的情況來說,可能有更好的方法:
在本例中,您可以看到空白字元「\n」和「\t」已被單個空格替換,而「\r」已被完全刪除。這是乙個簡單的例子,但是我們可以更進一步,使用unicodedata包和它的combining()函式來生成並進行對映,從而生成更大的重新對映表,我們可以使用它來刪除字串中的所有重音。
2.對迭代器進行切片
如果您嘗試對乙個迭代器進行切片,您會得到乙個typeerror,這說明生成器物件是不可下標訪問的,但有乙個簡單的解決方案可以解決這個問題:
使用itertools.islice我們可以建立乙個islice物件,它是乙個會生成所需項的迭代器。需要注意的是,這將消耗slice開始之前的所有生成器項,以及islice物件中的所有項。
3.跳過可迭代物件的開始部分
有時您必須處理那些以您不想要的可變數量的行(如注釋)開始的檔案。itertools再次為這個問題提供了簡單的解決方案:
這**段只生成初始注釋部分之後的行。如果我們只想在可迭代物件的開頭丟棄一些專案(本例中是一些行),並且不知道有多少個專案,那麼這種方法是很有用的。
4.只帶有關鍵字引數(kwargs)的函式
在使用以下這樣的函式時,建立只接受關鍵字引數的函式來提供(強制)更多的清晰性是很有幫助的:
正如您所看到的,這可以通過在關鍵字引數之前放置單個*引數來輕鬆解決。如果我們把位置引數放在*引數之前,位置引數顯然也會存在。
5.建立支援with語句的物件
例如,我們都知道如何使用with語句來開啟檔案或獲取鎖,但是我們可以實現自己的with語句嗎? 當然,我們可以使用__enter__和__exit__方法來實現上下文管理協議:
這是在python中實現上下文管理最常見的方法,但是還有更簡單的實現方法:
上面的**片段使用contextmanager管理器裝飾器實現了內容管理協議。在進入with塊時,tag函式(在yield之前)的第一部分會被執行,然後該with塊被執行,最後,tag函式的其餘部分會被執行。
6.使用__slots__節省記憶體
如果您曾經編寫過乙個建立某個類的大量例項的程式,您可能會注意到您的程式會突然需要大量記憶體。這是因為python使用字典來表示類例項的屬性,這使得它的速度很快,但是記憶體效率不高,這通常並不是乙個問題。然而,如果它成為您的程式的乙個問題時,您可以嘗試使用__slots__:
這裡的情況是,當我們定義了__slots__屬性時,python會使用小的固定大小的陣列而不是字典來定義屬性,這大大減少了每個例項所需的記憶體。使用__slots__也有一些缺點——我們不能宣告任何新的屬性,並且我們只能使用在__slots__上這些屬性。而且,帶有__slots__的類不能使用多重繼承。
7.限制cpu和記憶體的使用
如果您不想優化您的程式記憶體或cpu使用,您只想把它限制在某個固定大小的記憶體上,那麼python也有乙個這樣的庫來做到這一點:
這裡我們可以看到設定最大cpu執行時間和最大記憶體使用限制的兩個選項。對於cpu限制,我們首先獲取特定資源(rlimit_cpu)的軟限制和硬限制,然後使用引數指定的秒數和前面檢索到的硬限制來設定它。最後,我們註冊訊號,如果cpu時間超過限制,該訊號會導致系統退出。對於記憶體,我們再次檢索軟限制和硬限制,並使用帶有大小引數的setrlimit和檢索的硬限制來設定它。
8.控制什麼可以匯入,什麼不可以匯入
一些語言有非常明顯的匯出成員(變數、方法、介面)的控制機制,例如golang,其中只有以大寫字母開頭的成員會被匯出。另一方面,在python中,所有東西都可以被匯出,除非我們使用__all__:
根據上面的**片段,我們知道只有bar函式會被匯出。同樣,我們可以讓__all__為空,這樣,當我們從這個模組匯入的時候,任何東西都不會被匯出,並且會導致attributeerror。
9.實現比較運算子的簡單方式
考慮到目前已經有相當多的比較操作符——__lt__ 、__le__ 、 __gt__ 或 __ge___,因此,為乙個類實現所有的比較操作符是相當煩人的。但如果有更簡單的方法可以實現呢?functools.total_ordering就派上用場了:
那麼,這到底是怎麼工作的呢?total_ordering裝飾器用於簡化實現類例項排序的過程。我們只需要定義__lt__和__eq__,它們是剩餘操作的對映所需的最小值,裝飾器就會為我們填充空白。
結論並不是所有這些特性在日常的python程式設計中都是必需的和有用的,但是它們中的一些可能會不時地派上用場,而且它們還可能會簡化那些在其他情況下會非常冗長和難以實現的任務。我也想說明的是,所有這些特性是python標準庫的一部分,而其中的一些在我看來就像標準庫中所具有的相當不標準的東西,所以當您想使用python實現某些東西的時候,您首先應該去標準庫中尋找它,如果您不能找到它,那麼您可能還是不夠努力(如果真的沒有,那它肯定在一些第三方庫中)。
python變數在使用前 必須先
python程式設計中經常遇到一些莫名其妙的錯誤,其實這不是語言本身的問題,而是我們忽略了語言本身的一些特性導致的,今天就來看下使用python變數時導致的3個不可思議的錯誤,以後在程式設計中要多多注意。1 可變資料型別作為函式定義中的預設引數 new links page.search for l...
Python變數前 和 的作用
在python的在形參前加 和 表示動態形參 在形參前加 表示可以接受多個實參值存進陣列 def f a,b print a print b f 1,2,3 1 2,3 對於在形參前加 表示表示接受引數轉化為字典型別 def f a print a f x 1,y 2 混合運用 def f a,b,...
在python中合法的變數 在python中的變數
當為乙個值起名字的時候,它將會儲存在記憶體中,我們把這塊記憶體稱為變數 variable 在大多數語言中,把這種行為稱為 給變數賦值 或 把值儲存在變數中 不過,python與大多數其他計算機語言的做法稍有不同,它並不是把值儲存在變數中,而更像是把名字 貼 在值的上邊。所以,有些 python 程式...