分享幾個冷門Python技巧

2021-10-22 13:43:14 字數 3827 閱讀 5639

有很多文章介紹了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使用技巧。...