你知道怎麼用Python來解釋閉包是什麼?

你知道怎麼用Python來解釋閉包是什麼?

自己給Python小白,正準備轉行Python的朋友提供了一個學習交流的平臺,我會給大家提供一套Python基礎資料給大家,不過你覺得你是Python大神也可以進來帶著大家一起學習,大家去加下面就可以了!大家可以點擊文章最後面【 瞭解更多 】,這是一個免費學習直播網站,進去鏈接點擊 【免費報名】或者【免費點閱】,在每天的晚上八點鐘有直播課,供大家學習,強烈推薦!

你知道怎麼用Python來解釋閉包是什麼?

--------------

在 Python 尤其是 Python2 中,編碼問題是困擾開發者尤其初學者的一大問題。什麼 Unicode/UTF-8/str,又是 decode/encode 的,搞得人頭都大了。其實不然,這有點類似 Java 中 http://java.io 包一樣,看似龐大難懂,但是可以非常精細地定製需求。

編碼

計算機只可以存儲和處理二進制數據,所以從文字到計算機可以識別的二進制之間需要一道對應關係。於是便有了 ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼),ASCII 使用 7 位二進制數標記了 128(2**7) 字符(符號、字母、控制符等),由於1byte=8bit,所以乾脆最高位補個 0 ,湊夠 8 位以方便計算和處理。

接著,拉丁語系的技術宅們發現,這 128 個字符的高位空著的,那麼幹脆用來表示拉丁語系的主要符號吧,還是使用單字節,但是可以表示的字符數量增加了一倍。這套編碼叫做 latin-1(iso-8859-1)。

這些宅男們沒有想到,區區一個字節 256 個符號,對於東亞國家來講,簡直呵呵了。拿中文為例,僅常用字符就幾千個,於是中國國家標準總局制定了一套中文編碼——GB2312。GB2312 通過兩個字節表示一個漢字,且最高位為 0 的部分兼容 ASCII,最高位為 1 的部分則通過連續的兩個字節表示一箇中文字。後來又出現了兼容 GB2312 的 GBK 編碼。

到這裡,依然面臨了一個問題:GB2312 或者 GBK 編碼中,僅可以表示漢字和英文字符,無法做到多語言文字同時表示。這時候,Unicode (又稱萬國碼)出現了。Unicode 採用 32 位二進制( 4 字節)表示一個字符,這樣便可以一套編碼對應多種不同語言。Unicode 是一種編碼,它的作用是指定字符到二進制數之間的對應關係。但是對於存儲和傳輸,Unicode 有幾種不同的實現,比較常用的是 UTF-8、UTF-16、UTF-32。UTF-32 中,每個字符固定佔 4 字節,按照 Unicode 編碼完全映射。而 UTF-8 和 UTF-16 則屬於變長編碼,分別使用最少 1 個 ( UTF-8 ) 或 2 個 ( UTF-16 ) 字節到最多 4 個字節來編碼。

Python 源碼的編碼

Python2 中,如果在源碼首行(或在指定 sha-bang 時的第二行)不顯式指定編碼,則無法在源碼中出現非 ASCII 字符。這是由於 Python 解釋器默認將源碼認作 ASCII 編碼格式。PEP263 (點擊這裡查看)中約定,可以通過如下方式之一來聲明源碼的編碼格式:

# coding=<coding> # or # -*- coding: <encoding> -*- # or # vim: set fileencoding=<encoding> :/<encoding>/<encoding>/<coding>

Python 中的編碼

Python 中有兩個常用的由 basestring 派生出來的表示字符串的類型:str, unicode。其中,str 類似於 C 中的字符數組或者 Java 中的 byte 數組,事實上你可以將它理解為一個存儲二進制內容的容器,str 不存儲編碼信息,如果對 str 類型的字符串迭代的話,則會按照其在內存中的字節序依次迭代,意味著如果這個字符串存儲的是多字節字符(Unicode/GBK等),則會截斷這個字符,演示如下:

而對於 unicode 類型,Python 在內存中存儲和使用的時候是按照 UTF-8 格式,在代碼中的表示為字符串前加 u,如:

而 unicode 與 str 之間的轉換,則用到了 encode 和 deocde 方法。decode 表示將一個 (str) 字符串按照給定的編碼解析為 unicode 類型,encode 則表示將一個 unicode 字符串按照指定編碼解析為字節數組 (str):

文件讀寫

內置的 open 函數打開文件時,read 方法讀取的是一個 str (私以為叫做字節數組更合適),如果讀取的是其它編碼的文字,則需要 decode 之後再做使用。

對於使用 open 函數打開文件之後的寫操作(多字節編碼的字符串),則需要將需要寫入的字符串按照其編碼 encode 為一個 str ,如果直接寫入,則會引發如下錯誤(如果在代碼中加入了 encoding 聲明,則會按照聲明的編碼格式 encode 後寫入):

除此以外,codecs 模塊也提供了一個 open 函數,可以直接指定好編碼打開一個文本文件,那麼讀取到的文件內容則直接是一個 unicode 字符串。對應的指定編碼後的寫入文件,則可以直接將 unicode 寫到文件中。通過 codecs.open 可以避免很多編碼問題:

建議

對於 Python 代碼中避免遇到編碼問題,有一些小建議:

字符編碼聲明:在代碼開頭聲明編碼格式

使用 codecs 的 open 函數處理文本文件

儘可能使用 unicode 而不是 str


分享到:


相關文章: