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...