喜歡小之的文章的可以關注公眾號「WeaponZhi」持續關注動態
這是「AI 學習之路」的第 3 篇,「Python 學習」的第 3 篇
Python 字串使用和 C 語言比較類似,但還有一些我們值得注意的地方需要關注,用這篇文章來幫助大家掌握 Python 的字串吧!
編碼
不論什麼語言,我們都需要考慮一下這個語言的編碼問題。「ASCII」編碼是我們最熟悉的編碼,但它只有 127 個字元被編碼到計算機裡面了,顯然,像中日韓這類國家,語言文字比較特殊,就需要自己來指定編碼格式。
比如,中國自己就制定了「GB2312」編碼,韓文則是「EUC_KR」,俄語是「KOI8-R」,顯然,如果每一個國家都需要製作一個適配的編碼,那我們的計算機世界就要亂套了,不同國家之間資訊的傳輸將變的寸步難行。如果電腦裡沒有某個語言的編碼,那就會產生亂碼衝突,這是相當麻煩的。
所以,大家商量了一下,就做出了「Unicode」這麼個編碼格式,它乾脆把所有的編碼都統一了,只要你用 Unicode 它就能保證沒有亂碼問題。
但 Unicode 也有缺點。比如如果一個檔案是純英文來寫的,那所有的字元實際上都可以用過 ASCII 的 8 位二進位制來表示。我們知道 Unicode 是通過補 0 來表示一些低位數的字元的,這樣,為了保持相容性,你實際上白白浪費了兩倍的空間。
UTF-8 就是為了解決這樣一個問題而出現的。它是一個**「可變長編碼」**,你不是嫌空間浪費嗎,那麼現在只要你用了 UTF-8,從此以後英文字母我們就可以用 1 個位元組來儲存了,如果遇到像中文這種「高大上」但又比較複雜的字型,我們靈活對待,用三個位元組來表示,實在有某些更加變態而複雜的字型,那最多可以擴充到用 6 個位元組來儲存。總之,這樣下去,既解決了相容性問題,又可以節約資源,資源問題迎刃而解了。
Python 中的字串是用 Unicode 編碼的,所以 Python 可以支援多語言,當我們儲存的時候,我們需要把 Unicode 轉換為 UTF-8,使用的時候,再從檔案中轉換 UTF-8 到 Unicode 到記憶體中。
通過編碼的這種演進過程,我們是不是會有所啟發呢?
**你會發現,一切技術的產生和發展,都是為了解決問題而出現的。**大家如果細細的思考一下,不論是語言、技術、設計模式、架構,實際上他們的發展過程並不是一個憑空的技術升級行為,而是為了解決某種問題而誕生的。
「GB2312」是為了解決 ASCII 沒有中文而才創造出來的,「Unicode」是因為各國語言不相容而創造出來的。而 Unicode 對於資源的浪費又促成了 UTF-8 的產生。最典型的問題驅動技術,就是設計模式了,設計模式的產生實際上就是各種為解決某些特定問題而總結出來的方案。
所以在技術上,遇到問題並不可怕,問題恰恰是最能幫助自己提升的,問題是創造力的源頭之一。我們同時在平時看書的時候,也要抱著解決問題的角度來學習,如果你單純的去讀一本技術書,這本書又只有理論和程式碼,你會覺得很枯燥。如果書裡可以結合一些案例和問題,從這裡展開講解,然後再介紹一些解決方案和程式碼,這種教學方式效果就會特別好。比如我之前看過的一本書「Android 原始碼設計模式」,它就是用這種方式來進行展開的說明設計模式的場景,看完了這本書後,以後面對某種場景,我就特別容易回想起之前書中寫過的一些場景,從而產生記憶聯想。
不僅如此,如果想的再深一點,你就會突然醒悟,實際上人類社會好像也是以這種形式來發展的…
是不是有點扯遠了?我們還是來看看字串吧。
字串
Python 的字串和 C 語言有些類似。我們簡單的把常用的用法介紹一下即可,平時只要多寫幾次,就能比較熟練的掌握了(此節引用廖雪峰教程示例,作了簡化)。
ord() 和 chr()
使用 ord() 獲取字元的整數表示,chr() 則是把編碼轉化為字元:
>>> ord(`A`)
65
>>> ord(`中`)
20013
>>> chr(66)
`B`
>>> chr(25991)
`文`
複製程式碼
bytes
用帶「b」字首的單引號或者雙引號字元來表示「bytes」型別的資料,非常方便
x = b`ABC`
encode() 和 decode()
複製程式碼
開發的時候,經常要把 str 和 bytes 進行相互轉換, str 通過 encode() 轉化為 bytes,bytes 通過 decode() 轉化為 str
>>> `ABC`.encode(`ascii`)
b`ABC`
>>> `中文`.encode(`utf-8`)
b`xe4xb8xadxe6x96x87`
>>> `中文`.encode(`ascii`)
Trace back (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError
>>> b`ABC`.decode(`ascii`)
`ABC`
>>> b`xe4xb8xadxe6x96x87`
`中文`
>>> b`xe4xb8xadxff`.decode(`utf-8`)
Tradeback(most recent call last):
...
UnicodeDecodeError
複製程式碼
這裡要注意容錯,encode 不能轉化超過引數編碼範圍的字元,而如果 bytes 中包含編碼格式無法解析的字元,decode() 也會報錯。
len()
通過 len 計算字串的字元數或者 bytes 的位元組數
>>> len(`ABC`)
3
>>> len(`中文`)
2
>>> len(b`ABC`)
3
>>> len(b`xe4xb8xadxe6x87`)
6
>>> len(`中文`.encode(`utf-8`))
6
複製程式碼
從輸出結果發現,中文佔 3 個位元組,英文佔 1 個位元組
宣告編碼格式
如果希望 Python 直譯器可以按 UTF-8 編碼來讀取 .py 檔案,需要在檔案中宣告
#1 /usr/bin/env python3
# -*- coding: utf-8 -*-
複製程式碼
第一行只對 Linux/OS X 有效,它告訴系統這是一個 Python 可執行程式。第二行則告訴 Python 直譯器,這個檔案要按照 UTF-8 編碼。如果不這樣寫,中文輸出會有亂碼。
字串格式化
格式化和 C 有點像,用「%」實現
>>> `Hello,%s` % `world`
`Hello , world`
>>> `你好%s,你有 ¥%d 嗎` % (`小之`,50)
`你好小之,你有 ¥50 嗎`
複製程式碼
佔位符中,%d 代表整數,%f 代表浮點數,%s 代表字串,%x 代表十六進位制整數,佔位符要和 % 號後面的變數或者值一一對應,如果只有一個佔位符,% 號後不需要括號。
佔位符還可以控制空格、小數點和補 0 的位數。比如:
>>> print(`%2d-%02d` % (5,1))
5-01
>>> print(`%.2f` % 3.1415)
3.14
複製程式碼
注意,「5-01」中,5 的前面是有兩個空格的。
如果你需要使用 % 這個字元顯示在字串中,那麼就需要轉義了,%% 表示一個 %
>>> `小之公眾號的點贊率竟然超過了 %d%%` % 50
`小之公眾號的點贊率竟然超過了 50%`
複製程式碼
歡迎關注我的公眾號