python能做什麼效果 十大Python開發技巧

2021-10-10 19:16:17 字數 3928 閱讀 4915

python開發指南, 超級實用足以讓您震撼

時不時地,當我了解python的新功能時,或者我發現其他一些人不知道該功能時,我會記下它。

在過去的幾周中,我最近了解或實現了一些有趣的功能-stack overflow

這裡有十個精巧的python開發技巧,我敢肯定您從未見過。 快速瀏覽其中一些功能,以及每個功能的概要。

01.如何在執行狀態下檢視源**?

檢視該函式的源**,我們通常使用ide來完成。

例如,在pycharm中,您可以使用ctrl +滑鼠輸入功能的源**。

如果沒有ide怎麼辦?

· 當我們想使用乙個函式時,我們如何知道該函式需要接收哪些引數?

· 當我們在使用函式時遇到問題時,如何通過閱讀源**來解決問題?

目前,我們可以使用inspect而不是ide來幫助您完成這些事情

inspect.getsource:返回物件源**的文字。

檢查模組提供了幾個有用的功能,以幫助獲取有關活動物件的資訊,例如模組,類,方法,函式,回溯,框架物件和**物件

此模組提供的四種主要服務:

· 型別檢查,

· 獲取源**,

· 檢查類和功能

· 檢查直譯器堆疊。

02.檢視包路徑的最快方法

當使用import匯入軟體包或模組時,python將在某些目錄中查詢,並且這些目錄具有優先順序順序,通常我們將使用sys.path進行檢視。

有沒有更快的方法?

在這裡我想介紹一種比上面更方便的方法,可以解決一行命令

從輸出中,您可以發現此列的路徑將比sys.path(包含使用者環境的目錄)更完整。

03.將巢狀的迴圈寫為一行

我們經常使用以下巢狀的迴圈**

這裡只有三個for迴圈,在實際編碼中,可能會有更多的層。

這樣的**可讀性很差,人們不想編寫它,並且有一種更好的編寫方法。

在這裡,我介紹一種常用的編寫方法,該方法使用itertools庫實現更優雅和可讀的**。

04.如何使用列印輸出日誌

許多人喜歡使用列印來除錯**並記錄程式的執行過程。

但是,列印只會將內容輸出到終端,而不能保留到日誌檔案中,這不利於故障排除。

如果您熱衷於使用列印來除錯**(儘管這不是最佳實踐),請記錄執行程式的過程,那麼下面描述的列印用法可能對您有用。

在python 3中將其列印為函式,因為它可以接收更多引數,所以函式本身變得更強大

**如下所示:

05.如何快速計算功能執行時間

計算乙個函式的執行時間,你可以這樣

您會看到編寫了幾行**來計算函式的執行時間。

有沒有一種方法可以更方便地計算執行時間? 是的,使用稱為timeit的內建模組

只需一行**即可使用

結果如下

2222210.020059824

06.使用內建的快取機制來提高效率

快取是一種儲存定量資料以滿足後續採集需求的方法,旨在加快資料採集的速度。

資料生成過程可能需要諸如計算,正則化和遠端獲取之類的操作。 如果同一資料需要多次使用,則每次重新生成都將浪費時間。

因此,如果將通過諸如計算或遠端請求之類的操作獲得的資料進行快取,則將加速後續的資料獲取需求。

為了達到這個要求,python 3.2+為我們提供了一種易於實現的機制,而無需您編寫這樣的邏輯**。

該機制是在functool模組的lru_cache裝飾器中實現的。

引數解釋:

· maxsize:此函式呼叫最多可以快取多少個結果,如果為none則沒有限制,設定為2的冪時,效能最佳

· 型別:如果為true,則將分別快取不同引數型別的呼叫。

例如輸出如下,您可以看到第二個呼叫不執行函式主體,而是直接將結果返回到快取中

calculating: 1 + 233

calculating: 2 + 35

以下是經典的斐波那契數列,當您指定較大的n時,會有很多重複的計算

現在可以將第6點中介紹的timeit用於測試可以提高多少效率。

如果不使用lru_cache,則執行時間為31秒

使用lru_cache後,執行速度過快,因此我將n的值從30調整為500,但是即使這樣,執行時間也只有0.0004秒。 速度的提高非常顯著。

07.在程式退出之前執行**的提示

使用內建模組atexit,您可以輕鬆註冊和退出功能。

無論您在**導致程式崩潰,它都會執行您已註冊的功能。 例子如下

結果如下:

如果clean()函式具有引數,則可以在不使用修飾符的情況下呼叫atexit.register(clean_1,引數1,引數2,引數3 =" ***")。

也許您還有其他方法可以處理這種需求,但是與不使用atexit相比,它更優雅,更方便,並且易於擴充套件。

但是使用atexit仍然有一些限制,例如:

· 如果程式被尚未處理的系統訊號殺死,則註冊的功能將無法正常執行。

· 如果發生嚴重的python內部錯誤,則無法正常執行您註冊的函式。

· 如果手動呼叫os._exit(),則無法正常執行註冊的功能。

08.如何關閉異常關聯上下文?

當您處理異常時,由於處理不當或其他問題,當引發另乙個異常時,丟擲的異常還將攜帶原始異常資訊。

再次閱讀它,您現在一定會理解:)

像這樣。

您可以從輸出中看到兩條異常訊息

如果在異常處理程式或finally塊中引發異常,則預設情況下,異常機制將隱式工作,以將先前的異常附加為新異常的__context__屬性。

這是python預設情況下啟用的自動關聯異常上下文。

如果要自己控制此上下文,則可以新增乙個from關鍵字(from的限制是第二個表示式必須是另乙個異常類或例項。)以指示哪個異常導致了您的新異常。

輸出如下

當然,您也可以使用with_traceback()方法設定異常的__context__屬性,這也可以在回溯中更好地顯示異常資訊。

最後,是否要完全關閉這種自動關聯異常上下文的機制? 我們還能做什麼?

可以使用引發…從無,從下面的示例,沒有原始異常

09.實施類似延遲的呼叫

golang中有一種延遲通話的機制。 關鍵字為defer,如下所示

myfunc的呼叫將在函式返回之前完成,即使您在函式的第一行上編寫了myfunc的呼叫,這也是延遲的呼叫。 輸出如下,

ab那麼python中有這種機制嗎?

當然有,但是沒有golang這麼簡單。

我們可以使用python上下文管理器來達到這種效果

輸出如下

ab10.如何流式讀取大檔案

使用with…open…可以從檔案中讀取資料,這是所有python開發人員都非常熟悉的操作。

但是,如果使用不當,也會造成很大的麻煩。

例如,當您使用讀取功能時,python會將檔案內容一次全部載入到記憶體中。 如果檔案具有10 gb或更多,則計算機將消耗的記憶體非常大。

對於此問題,您可能會考慮使用readline作為生成器來逐行返回。

但是,如果此檔案的內容在一行中,則每行10 gb,您仍將一次讀取所有內容。

最優雅的解決方案是使用read方法指定一次只讀取固定大小的內容。 例如,在下面的**中,一次僅返回8kb。

上面的**在功能上沒有問題,但是**看起來還是有點腫。

使用部分函式和迭代函式,您可以像這樣優化**

總結一下

· 我們可以使用inspect在執行狀態下檢視源**

· 如果巢狀迴圈,可以使用itertools.product

· 隨時間使用timeit模組來計算功能或**段的執行時間

· 使用functool.lru_cache可以加快**速度。 旨在加快資料採集速度

· 使用atexit模組註冊您的功能,以便在導致程式崩潰的任何地方,它將執行您已註冊的那些功能

· 通過將大檔案分成固定大小的塊來讀取它

這是github自述檔案的鏈結,以檢視和分析每個技巧

是的 現在就像小min一樣享受,我們做到了最後。 希望您學習新東西並對這些有效的開發技巧有一些基本的了解

Python 能做什麼?

python 能做什麼?python具有簡單 易學 免費 開源 可移植 可擴充套件 可嵌入 物件導向等優點,我所關注的是網路爬蟲方面,2018即將到來,我準備步入python的世界。hello,world!一 web應用開發 伺服器端程式設計,具有豐富的web開發框架,如django和turboge...

python語言能做什麼 python語言能做什麼

python語言可以用來做許多事,常見的一般有web開發 爬蟲開發 人工智慧以及遊戲開發和構建桌面軟體等等 python是乙個非常好用的程式語言而且開發速度快,語法簡單通俗易懂,容易上手。非常適合初學者是乙個非常好用的程式語言,開發的速度非常快,而且語法簡單,通俗易懂,很容易上手,很適合初學者學習。...

python能做什麼 揭秘python都能做什麼?

python作為一種功能強大,並井且簡單易學的程式語言而廣受好評,那麼python都能做麼?概據起來有以下幾個方面。大資料處理隨著近幾年大資料的興起,python也得到了前所未有的爆發。python借助第三方的大資料處,大資料處理,隨著近幾年大資料的興起,python也得到了前所未有的爆發。pyth...