1. 程式人生 > >乾貨 | python進階系列(三)--序列

乾貨 | python進階系列(三)--序列

點選上方“中興開發者社群”,關注我們

每天讀一篇一線開發者原創好文

640?wx_fmt=png&wxfrom=5&wx_lazy=1

前面兩篇我們分別介紹了python中的裝飾器多繼承,瞭解了一些平時容易踩到的坑以及沒能深入理解原理的常見語法。本節我們來介紹一個更基礎也更加頻繁使用的內容:python的序列。

所謂序列,就是指有序佇列(sequence),是程式設計中常用到的資料儲存方式。python常用的序列資料型別主要有三種:字串(string)、元組(tuple)、列表(list),大家在python編碼過程中肯定經常接觸。但是最基礎的內容往往容易被忽略,序列這幾個最基礎的資料型別中有一些特性需要我們注意,本節主要結合我自己在工作過程中遇到過的問題,來給大家提個醒,避免以後犯類似的錯誤。

1.索引

序列可以根據變數的下標來定位元素,這是最基礎的知識。python所不同的是,支援從序列尾部來進行索引。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

從程式碼中可以看出,我們將函式foo作為物件賦值給變數b,此時變數b也可以作為一個新的函式來呼叫。

在python中,所有的物件都包含三個最基本的元素:標識(id)、型別(type)、值(value,即物件本身),我們可以通過列印這三個要素來分析某一個物件的具體內容。

我們知道對於一個函式來講,他的入參和出參必須是一個物件,既然python中一切皆為物件,那我們就可以用另一個函式來作為某個函式的引數,也可以為一個函式返回另一個函式。可能聽起來有點暈,沒關係,我們來看下面這個例子。

640?wx_fmt=png

簡單起見,我將fuu這個函式作為變數傳遞給foo()呼叫,foo再將fuu作為返回值返回給變數a。此時變數a可以當做函式來直接呼叫。我們先暫時記住python中這種將函式作為物件的相關操作,後面我們還會看到。

2.函式閉包

在電腦科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是指引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。python是支援函式閉包的語言之一,我們結合下面這個例子來了解到底什麼是閉包函式。

640?wx_fmt=png

這就是一個函式閉包的例子,我們把函式addNum稱作閉包函式。

3.裝飾器

現在我們考慮這樣一個場景,你的某個專案中用到了日誌列印模組,這個模組包括了頭資訊(時間戳、程式碼位置、日誌級別等)和尾部資訊(簽名、處理時長等),而你會多處呼叫這個日誌列印函式,每次呼叫都會在頭資訊和尾部資訊之間執行本體呼叫函式的操作。剛剛我們有了解了函數出入參和閉包概念,那我們可以這麼來設計這個模組。

640?wx_fmt=png

我們利用logger這個函式,將所需要用到日誌模組的其他函式再次封裝成一個新的函式,然後再呼叫,這樣一來日誌模組就獨立出來,其他呼叫模組也就無需處處維護頭資訊和尾部資訊了。其中 f1 = logger(fun1)這句賦值語句,就是python語法中的裝飾器。說到這裡,大家可能會有疑問,為何這裡講到的裝飾器和我們平時的不一樣呢?別急,我們接著往下看。

640?wx_fmt=png

這個例子中將裝飾過的新函式命名和原來的一致,對呼叫者來講看不到區別,此時就是一個完全的裝飾器實現。由於這種寫法不夠優雅,python專門定義了新的語法規則來表明一個裝飾過得函式,即使用@字元來提示一個裝飾過的類。

640?wx_fmt=png

這就是我們在python見到過的裝飾器,他僅僅是一個語法糖,等價於函式定義完成後利用裝飾器類的再次定義函式。

4.python內建裝飾器

通常來講,我們定義自己需要的裝飾器來滿足不同的需求。但是python本身也內建了三個裝飾器,分別是@staticmethod、@classmethod、@property。這三個裝飾器應用比較廣泛,分別是將函式宣告為靜態方法、類方法、屬性方法。本篇就不再細述這幾個裝飾器的作用,後繼再來講述。

5.小結

裝飾器,本質就是一個函式,用來裝飾其他函式,為其他函式新增附加功能。實現裝飾器時要求不能修改被裝飾函式的原始碼,也不能修改被裝飾函式的呼叫方法。有了裝飾器,我們可以抽離出大量與函式本身無關的重複程式碼,減輕開發和維護的成本,也可以在不改變已有函式結構的基礎上對已實現的功能做擴充套件。

640?wx_fmt=png