有很多文章介紹了python中各種很酷的功能(如變數拆包、偏函式、列舉可迭代物件等)。但說到python時,還有很多東西可以談論。今天打算分享我所知道和使用的一些特性,這些我在其他地方很少見人提到過。
整理字串輸入
對使用者輸入進行整理的問題幾乎適用於你編寫的所有程式。通常情況下,將字元轉換為小寫或大寫就足夠了,有時你可以使用regex來完成這項工作,但對於複雜的情況來說,可能有更好的方法:
user_input=
"this\nstring has\tsome whitespaces. .. \r\n"
character_map=
>"
)yield
print
(f""
)with tag(
"h1"):
printc "this is title."
)
上面的**片段使用contextmanager管理器裝飾器實現了內容管理協議。在進入with塊時,tag函式(在yield之前)的第一部分會被執行,然後該with塊被執行,最後,tag函式的其餘部分會被執行。
使用__slots__
節省記憶體
如果你曾經編寫過乙個建立某個類的大量例項的程式,你可能會注意到你的程式會突然需要大量記憶體。這是因為python使用字典來表示類例項的屬性,這使得它的速度很快,但是記憶體效率不高,這通常並不是乙個問題。然而,如果它成為你的程式的乙個問題時,你可以嘗試使用__slots__
:
'''
'''class
person
:_slots_ =
["first_name"
,"last_name"
,"phone"
]def
_init_
(self, first_name,last_name, phone)
: self.first_name = first_name
self.last_name = last_name
self.phone = phone
這裡的情況是,當我們定義了__slots__
屬性時,python會使用小的固定大小的陣列而不是字典來定義屬性,這大大減少了每個例項所需的記憶體。使用__slots__
也有一些缺點——我們不能宣告任何新的屬性,並且我們只能使用在__slots__
上這些屬性。而且,帶有__slots__
的類不能使用多重繼承。
限制cpu和記憶體的使用
如果你不想優化你的程式記憶體或cpu使用,你只想把它限制在某個固定大小的記憶體上,那麼python也有乙個這樣的庫來做到這一點:
import signal
import resource
import os
#to limiecpu time
deftime_exceeded
(signo,frame)
:print
("cpu exceeded..."
)raise systemexit(1)
defset_max_runtime
(seconds)
;#install the signal handler and set a resource limit
soft,hard = resource.getrlimit(resource.rlimit_cpu)
resource.setrlimit(resource.rlimit_cpu,
(seconds,hard)
signal.signal(signal.sigxcpu, time_exceeded)
#to limit memory usage
defset_max_memory
(size)
: soft,hard = resource.getrlimit(resource.rlimit_as)
resource.setrlimit(resource.rlimit_as,
(size, hard)
)
這裡我們可以看到設定最大cpu執行時間和最大記憶體使用限制的兩個選項。對於cpu限制,我們首先獲取特定資源(rlimit_cpu)的軟限制和硬限制,然後使用引數指定的秒數和前面檢索到的硬限制來設定它。最後,我們註冊訊號,如果cpu時間超過限制,該訊號會導致系統退出。對於記憶體,我們再次檢索軟限制和硬限制,並使用帶有大小引數的setrlimit和檢索的硬限制來設定它。
控制什麼可以匯入,什麼不可以匯入
一些語言有非常明顯的匯出成員(變數、方法、介面)的控制機制,例如golang,其中只有以大寫字母開頭的成員會被匯出。另一方面,在python中,所有東西都可以被匯出,除非我們使用__all__
:
'''
'''def
foo():
pass
defbar()
:pass
_all_-=[
"bar"
]
根據上面的**片段,我們知道只有bar函式會被匯出。同樣,我們可以讓__all__
為空,這樣,當我們從這個模組匯入的時候,任何東西都不會被匯出,並且會導致attributeerror。
實現比較運算子的簡單方式
考慮到目前已經有相當多的比較操作符——__lt__
、__le__
、__gt__
或__ge___
,因此,為乙個類實現所有的比較操作符是相當煩人的。但如果有更簡單的方法可以實現呢?unctools.total_ordering
就派上用場了:
from functools import total_ordering
@total_ordering
class
number
:def
_init_
(self, value)
: self.value = value
def_lt_
(self,other)
:return self.value < other.value
def_eq_
(self,other)
:return self.value == other.value
print
(number(20)
> number(3)
)print
(number(1)
< number(5)
print
(number(15)
>= number(15)
)print
(number(10)
<= number(2)
)
那麼,這到底是怎麼工作的呢?total_ordering裝飾器用於簡化實現類例項排序的過程。我們只需要定義__lt__
和__eq__
,它們是剩餘操作的對映所需的最小值,裝飾器就會為我們填充空白。
結論
並不是所有這些特性在日常的python程式設計中都是必需和有用的,但是它們中的一些可能會在某個時刻派上用場,而且它們還可能會簡化那些非常冗長和難以實現的任務。所有這些特性都是python標準庫的一部分,雖然其中的一些看起來不是那麼「標準」。所以當你想用python實現某種功能時,不妨先去標準庫里找找看。(即使標準庫里沒找到,那大概率也會有第三方庫提供。)
git使用中的幾個冷門技巧
有時候,同事推了分支origin test,測試完成後將本地 git branch d test 和遠端的該分支 git push origin delete test 都操作刪除,這時,我們本地使用命令git branch a卻還是能夠看到這個分支,並能成功checkout。但其實你並不希望看到這...
分享幾個小技巧
1,片斷 當我們在visual studio 2008環境下,輸入mbox按 tab 鍵將自動生成以下 system.windows.forms.messagebox.show test 還有更多技巧如輸入 region後按 tab 則將自動生成 region myregion endregion ...
分享PyCharm的幾個使用技巧
pycharm是個十分強大的python編輯器,筆者在日常的工作中學到了很多該ide的使用技巧,有的是從別人那裡學到的,有的是自己學習的。筆者深感自己的開發能力不足,因此希望能夠將這些使用技巧記錄下來,同時也把這些使用技巧分享給讀者,希望能對讀者有所幫助。以下將介紹幾個簡單的pycharm使用技巧。...