關於 Python你一定沒讀過的8個技巧

介紹 Python 功能和小技巧的文章網上有無數篇,比如變量解壓縮,partial 偏函數,枚舉可迭代對象... 但關於 Python 我們能說的還有很多。

所以今天我將向大家展示一些我知道和有使用過的特性,這些特性在其它文章或博客中很少被提及:

關於 Python你一定沒讀過的8個技巧

消毒字符串輸入:

對用戶輸入內容進行消毒幾乎適用於你寫的每一個程序。

通常來說轉換字符大小寫的操作就足夠了,有時候用 Regex 正則表達式就能完成,但對於比較複雜的情況,我們有更好的辦法:

關於 Python你一定沒讀過的8個技巧

在這個例子中我們可以看到空格子字符"\\n"和"\\t"已被單個空格代替,而"\\r"已經被刪除。

這是一個很簡單的示例,但我們可以更進一步,並使用unicodedata包和它的 combining() 函數來重新生成映射。

迭代器切片:

如果嘗試對 Iterator 進行切片,則會出現 TypeError和"generator object is not subscriptable"的報錯,但我們有一個簡單的解決辦法

關於 Python你一定沒讀過的8個技巧

通過使用 itertools.islice我們可以創建一個 islice對象.

該對象是產生所需項目的迭代器。不過這裡需要注意的是,它會消耗所有的生成器項直到切片的開始為止,而且還會消耗 islice對象中的所有項。

跳過可迭代對象的開始部分:

有時候你不得不去處理這樣一些文件,它們的開頭是毫無用處的行,比如註釋之類的。

itertools再一次地能在這裡派上用場:

關於 Python你一定沒讀過的8個技巧

這個代碼片段只會生成文件開始註釋之後的部分。

如果我們只想丟棄可迭代對象開頭的某些項(比如這個例子中的註釋部分),但不確定這個項的大小,這個方法很實用。

大家想必都知道如何用 with聲明來打開文件或者獲取鎖,但我們能實現自己的 with聲明嗎?是的,實際上通過使用enter和exit我們就可以實現一個上下文管理器協議:

關於 Python你一定沒讀過的8個技巧

這是 Python 中實現上下文管理最常見的方法,但其實還有一種更簡單的方法:

關於 Python你一定沒讀過的8個技巧

上面的代碼片段使用 contextmanager管理器裝飾器實現了內容管理協議 。

進入 with塊時,執行 tag()的第一部分(在 yield之前),然後再執行該塊,最後執行 tag()剩下的部分。

用 slots節省內存:

如果在你編寫的程序中會創建某個類的大量實例,那麼你肯定已經注意到你的程序會佔用大量內存。

這是因為 Python 使用 Dictionary 來表示類實例的屬性,雖然它速度很快但內存效率卻很低。

大部分情況下這個問題並不那麼嚴重,但如果它對你的程序來說是一個大問題,你可以嘗試使用slots.

關於 Python你一定沒讀過的8個技巧

所以這裡的情況就是當我們定義slots的屬性時,Python 使用的是小型的固定大小的數組,而不是 dictionary,這就大大減少了每個實例所需的內存。

使用slots也有缺點——我們無法聲明任何新屬性,並且只能在slots上使用它們。

同樣,帶有slots的類不能使用多重繼承。

限制 CPU 和內存使用:

如果你不是想通過優化程序來降低它的 CPU 和內存使用率,而是想簡單粗暴地直接限制它為某個數字,那麼 Python 中有一個庫可以做到:

關於 Python你一定沒讀過的8個技巧

這裡我們看到了兩種限制最大 CPU 運行時間和最大內存使用的方法。

對於 CPU 限制,我們首先獲得該特定資源( RLIMIT_CPU)的軟限制與硬限制,然後使用參數指定的描述和閒錢獲取的硬限制來設置它。

最後,如果 CPU 時間被超出,我們將註冊導致系統退出的信號。

至於內存方面,我們再次獲取軟限制與硬限制,並使用帶有 size 參數的 setrlimit和獲取的硬限制對其進行設置。

控制可導入和不可導入的內容:

有些語言對於到處成員變量,方法和接口有著非常明確的機制,比如 Golang,在 Go 中僅有以大寫字母開頭的成員才能被導出。

另一方面,在 Python 中,所有內容都可以到處,除非我們使用all:

關於 Python你一定沒讀過的8個技巧

根據上面的代碼片段,我們可以看出只有 bar()會被導出。

另外,我們可以將all保留為空,並且從此模塊導入時,不會輸出任何 AttributeError。

比較運算符的簡便方法:

Python 中有很多比較運算符:lt , le , gt 和 ge,但有沒有更容易的方法呢?

functools.total_ordering就可以辦到:

關於 Python你一定沒讀過的8個技巧

那麼它實際上是怎麼工作的呢?total_ordering裝飾器用於簡化為我們的類實現實力順序的過程。

只需要定義 lt 和 eq,這也是映射剩餘操作所需的最低要求,也是裝飾器的工作——它為我們填補了這個空缺。

總結:

上述的特性與操作都不一定是你在日常 Python 編程中常用到的,但其中一些時不時會讓你感到頭疼。

上面所提供的解決方案大多簡化了很多任務,這些任務用較為常見的方法處理都會比較冗長無聊。

另外要指出的一點是,所有的這些功能都是 Python 標準庫的一部分。

在我看來,其中一些功能類似於“標準庫中的非標準功能”,因此每當你想要在 Python 中實現某些功能時.

首先去標準庫裡找一找,如果沒有這個功能,那肯定是你找得不夠仔細,如果實在是沒有,再去找相關的第三方庫.

最後小編幫助大家整理了一套python教程,下面展示了部分,希望也能幫助對編程感興趣,想做數據分析,人工智能、爬蟲或者希望從事編程開發的小夥伴,畢竟python工資也還可以,如果能幫到你請點贊、點贊、點贊。

關於 Python你一定沒讀過的8個技巧

關於 Python你一定沒讀過的8個技巧

關於 Python你一定沒讀過的8個技巧

關於 Python你一定沒讀過的8個技巧

關於 Python你一定沒讀過的8個技巧

PS:如果你喜歡python,並覺得這篇文章對你有益的話,麻煩多多點贊關注支持!!!!


分享到:


相關文章: