python中那些看起來高大上的技術

很多時候python都被人稱為玩具語言,很多人看不起python,覺得它們不如Java,golang,c這些語言的高效,也不如bash這些指令碼語言正統,然而我想說的是,存在即合理,特別是python佔有這麼多的市場份額就足以說明它的使用價值,我們都知道python學起來很簡單,那麼python是不是就沒有複雜的技術需要深入學習了呢?接下來我就談一談python中那些並不簡單的技術。

超程式設計

簡單來說,超程式設計就是可以操作目標語言的語言,比如說,我有一個類,我想要在生成類的時候,獲取到類的資訊,那麼這個過程就是超程式設計。

如果你有了解過反射的話,你會發現這和反射很像,沒錯,反射就是實現超程式設計的一種方法。

在python中,一般透過魔術方法,描述符,元類和eval來實現超程式設計。

GIL

GIL的全稱是global interpreter lock,叫做全域性直譯器鎖。

我們都知道作業系統排程的最小單位是執行緒,而一個程序中可以存在多個執行緒,當多個執行緒併發一起執行的時候,它們可能會修改同一塊記憶體,造成資料的不一致,為了解決這個問題,cpython直譯器會讓每個執行緒去獲取GIL,只有成功獲取到GIL的執行緒才能夠執行,其它的執行緒需要等待,而這就是python的執行緒併發是偽併發的原因。

python中那些看起來高大上的技術

那麼如何更好地利用多核cpu呢,最簡單的辦法就是使用多程序,因為GIL是線上程中獨有的,而程序中不需要獲取它,因此透過執行多個程序就可以實現程式的併發執行。

協程

我們知道作業系統排程的最小單位是執行緒,那麼協程是什麼呢?通俗地講,協程就是使用者態執行緒,也就說,我們封裝了一個執行緒,在這個執行緒中,我們可以自己進行排程,當執行耗時的操作時候,我們讓出執行的任務,去執行其它的任務,也就是讓cpu看到我們的執行緒一直在執行任務而沒有等待。

python中那些看起來高大上的技術

python中透過yield關鍵字進行協程的排程,透過yield可以儲存任務狀態,透過send關鍵字可以函式結果傳遞給另一個函式。

上下文管理器

我們平時在操作檔案或者資料庫的時候,當我們使用之後,都需要手動關閉它們,那麼我們有沒有辦法自動釋放資源呢?答案是可定的,我們可以使用with關鍵字。

with open(‘test。txt’) as f:

print f。readlines()

透過這樣的操作,我們在函式執行之後,就會自動釋放檔案資源。

上下文管理器是如何實現的呢,它的原理就是它的底層實現了__enter__和__exit__方法,這樣在執行函式主體之前,我們可以先執行enter方法,主體執行之後,我們再執行exit方法。

python中透過contextlib裝飾器,可以優雅地實現上下文管理器。

裝飾器

見名思意,裝飾器就是對函式的一個裝飾,它在不修改函式主體內容的時候,對函式進行裝飾,讓它看起來變得不太一樣。

python中那些看起來高大上的技術

python中透過在函式前面加上@符號,可以輕鬆地對函式進行裝飾,很多日誌功能還有授權功能,透過裝飾器的使用都會變得更加優雅。

閉包

閉包是很多語言都會有的概念,在python中,閉包就是函式的巢狀,不過這不是簡單的函式巢狀,它需要滿足幾個條件。

python中那些看起來高大上的技術

外部函式返回值是內部函式的引用

nonlcoal 修改外部引數

python透過閉包的使用,可以更加方便地實現裝飾器。