0基礎學Python之五:字元串(上)

https://www.zhihu.com/video/960212270013513728

Hi 大家好,我是王可樂。前面的課程里,可樂帶領大家熟悉了 Python 中的數字、運算和變數,大家應該已經學會了使用 Python Shell 來和這些數學運算打交道。今天的課程里,我們暫時告別這些數學知識,來學習一下編程時另一個經常用到的概念——字元串。

在第二課的猜數字遊戲里,我們已經用了幾個中文字元串來提示用戶輸入、提醒用戶猜的數字是大了還是小了或者是猜中了。簡單地說,字元串就是一串字元,我們一起來打開 Python Shell 看一下:

輸入 (單引號)Hello, world!(嘆號)(後引號),回車。這裡,引號裡面的內容就是一個字元串。我們來看一下它的類型,輸入 type(Hello, World!),回車,可以看到 Python 中的字元串的類型叫做 str。在 Python 中,以及很多編程語言中,字元串都要用引號來包裹起來,引號裡面的內容才是字元串的內容。

>>>Hello World!Hello World!>>>type(Hello World!)<class str>>>>

字元串中可以是任意的內容,如果需要在字元串中使用引號自己,那我們就應該讓Python解釋器明白,這個引號並不是字元串的結尾。具體做法是,用 (反斜線) 符號把字元串內部的引號標記出來,這個過程叫做轉義。例如我們看一下這個例子:

輸入 Im feeling very depressed.,回車。這個字元串中包含一個單引號,因此我們需要用反斜線把這個單引號轉義。如果不對字元串內的引號轉義,那 Python 就認為這個字元串到 I 就結束了,而後面出現的 m 等這些字元 Python 表示無法理解,會給我們彙報一個語法錯誤。

Python 允許使用單引號和雙引號來包裹字元串,它們用起來幾乎是一樣的,只有一點:在單引號包裹的字元串中如果有雙引號,那麼雙引號不用轉義;反過來也一樣,用雙引號包裹的字元串里就可以自由地使用單引號了。例如上面的例子:"Im feeling very depressed." 用雙引號的話,寫起來就方便多了。

>>> Im feeling very depressed."Im feeling very depressed.">>> "Im feeling very depressed.""Im feeling very depressed."

使用單引號或雙引號書寫的字元串通常都不會太長,一般也不會跨多行。如果要在 Python 中直接輸入較長並且跨多行的字元串,可以使用三個引號連用的辦法,例如:

輸入 README(回車,我們看到 Shell 的 >>> 變成了 ...,提示我們繼續輸入,我們輸入)

Line 1(回車)

Line 2(回車)

Line 3(回車,最後我們用三引號結束這個字元串)

,回車。

可以看到,使用三引號可以很方便的輸入大段大段的字元串內容。不過為什麼我們的字元串顯示成了下面這個奇怪的樣子呢?我們的換行去哪裡了?

>>> README... Line 1... Line 2... Line 3... README
Line 1
Line 2
Line 3

實際上,我們剛才一直在使用 Python Shell 來查看字元串的內容,而更標準的做法則是使用內置函數 print(),來將字元串列印在屏幕上。例如我們輸入:print(Hello, world!) 回車,可以看到 print() 函數列印的字元串沒有了引號,只有字元串本身的樣子。

>>> print(Hello, world!)Hello, world!

我們再試試輸入 print(README(回車,然後)

Line 1(回車)

Line 2(回車)

Line 3(回車,然後結束字元串,並且補上右括弧)

),回車。

可以看到 Python 正確列印了我們輸入的字元串。對比一下,我們發現 Shell 給我們展示的字元串裡面雖然沒能正確展示換行,但該換行的位置上都有一個
。實際上,這裡的
就代表了換行符號,用 print() 函數來列印字元串才能直觀地看到使用它們的效果。

>>> print(README... Line 1... Line 2... Line 3... )READMELine 1Line 2Line 3

在理解換行符號之前,可樂先帶大家來理解一下字元。所謂的字元串,實際上就是字元連成的串而已。那麼什麼是字元呢?我們上面的例子里,H, e, l, l, o, 逗號, 空格, w, o, r, l, d, 嘆號,這些都是字元;此外我們的猜數字遊戲代碼里,使用到的這些漢字、標點也都是字元。

概括的說,字元包括英文字母、數字、標點符號,以及其他語言字母、符號、漢字、假名等,甚至還有大名鼎鼎的 Emoji,它們也都是字元;除了這些看得見的字元,還有空白符、製表符、換行符、回車符等等看起來只是空白的字元;此外還有很多根本看不見的字元,它們被稱作控制字元。

在計算機的世界裡,字元實際上都是用數字表示的,字元和對應的數字之間的映射關係稱作編碼。世界上最著名的編碼之一當然要數 ASCII 了。ASCII 編碼經常以表格的形式展示,稱作 ASCII 碼錶。ASCII 是美國信息交換標準代碼的英文縮寫,當前版本的 ASCII 編碼中包含 128 個字元,而其中只有 95 個字元是可見字元,還有 33 個不可見的控制字元,它們多數都已經被廢棄。

在 ASCII 編碼中,每個字元對應一個 0 ~ 127 總共 128 個數字。例如大寫字母 A 對應的 ASCII 編碼是十進位數字 65,也就是十六進位 0x41,或者二進位數字 0b01000001。Python 提供了兩個內置函數 ord() 和 chr() 來進行字元和編碼之間的轉換,我們在 Python Shell 里試一下:

輸入 ord(A),回車,結果是 65;

輸入 chr(65),回車,Python 幫我們找到了大寫字母 A;

輸入 ord(0),回車,結果是 48,也就是字元 0 在計算機中用數字 48 來表示;

我們再來看一下空白字元。輸入空格 ord( ),回車,結果是 32;輸入反斜線字母n ord(
),回車,結果是 10。這裡,
是一個單獨的字元,代表換行,除了它還有 表示橫向製表符,
表示回車符等其他空白字元,和前面我們見到的 類似,都是轉義字元。由於 用於標記轉義,所以如果要在字元串中表示 本身,就得輸入 \;如果要表示兩個 \,那就需要輸入 \\。

如果字元串本身包含很多這樣的 ,輸入起來可能會很不方便。Python 提供了一種叫做 RAW 字元串的寫法,在 RAW 字元串中出現的 不會被認作是轉義符,例如:我們輸入:r\
,前面多了一個 r,這就是一個 RAW 字元串,它表示三個 和一個 n。回車,我們看到 Python 將它轉換成了普通字元串的寫法,裡面的每一個 都需要用兩個 來表示。

>>> ord(A)65>>> chr(65)A>>> ord(0)48>>> ord( )32>>> ord(
)10>>> r\
\\\n

ASCII 的 95 個可見字元顯然是個很小的集合,ASCII 編碼裡面塞進去英文大小寫字母、數字以及一些標點符號之後,就已經滿了。我們上面已經看到 Python 還能顯示漢字和漢字標點,這世界上還有西歐字母、假名、阿拉伯字母等等許多符號,ASCII 編碼對於表示這些字元就無能為力了。

早些時候存在很多其他的編碼表來表示各種額外字元,多數都是對 ASCII 的擴充,但基本互相不兼容,於是就出現了一些混亂。例如用一種編碼來編碼一篇文章,也就是把這篇文章的字元對應的數字一一存儲在電腦上;之後必須還用這個編碼來解碼,才能把數字翻譯成正確的字元顯示出來;如果用錯了編碼,同樣的數字序列就可能被翻譯成亂七八糟的樣子了,這就叫做亂碼。

經過了數年混亂,我們現在已經非常幸運地擁有了「全宇宙統一的編碼」(哈哈,這當然是個開玩笑的說法),它就是 Unicode 編碼。這個 Unicode 很厲害,它除了兼容了 ASCII 編碼之外,還把世界上大部分的文字系統都擴充了進來,甚至還有可愛的 Emoji。更加幸運的是,Python 3 默認就使用 Unicode 編碼來編碼內部的字元串,因此在 Python 3 中可以直接輸入和使用世界上絕大多數文字,甚至你都可以用漢字來命名變數,但是可樂強烈不建議你這麼做。

和 ASCII 一樣,Unicode 編碼是從字元到數字的映射關係,並且 Unicode 還兼容 ASCII。也就是說在 ASCII 編碼裡面 65 代表大寫字母 A,在 Unicode 里也是如此;而大於 127 的數字在 ASCII 編碼里沒有使用,Unicode 則用這些數字定義了更多的字元。前面我們講到的 ord() 和 chr() 兩個內置函數也可以用於 Unicode 字元和其編碼數字的轉換,例如:

輸入 ord(王),回車,我們看結果是 29579;而輸入 chr(29579),回車,我們又能找到這個數字對應的 Unicode 字元是王可樂的王。

>>> ord(王)29579>>> chr(29579)王

既然字元串在計算機內部是用數字表示的,那麼比較字元串大小就很方便了。比較字元串的需求在生活中也很常見,我們需要對字典里的單詞排序,需要對客戶名單進行排序,對用戶出生日期進行排序等。

字元串比較的基礎是字元比較,而字元的比較就是比較代表字元的數字編碼。例如大寫 A 的編碼是 65,而大寫 B 的編碼是 66,那麼我們說 A < B。在 Python Shell 里驗證一下,我們輸入 A < B 回車,結果為 True。

比較字元串的規則也很簡單,就是從前往後逐一對比字元的大小,直到分出勝負,或者一方沒有字元了為止。例如我們比較 abcde 和 abdce 兩 個字元串,從前往後看,前兩位 a, b 都是一樣的,到了第三位 c < d,因此我們說 abcde < abdce;再如我們比較 abcde 和 abcd,前面四位都是一樣的,而前者第五位是 e,後者已經沒有更多字元了,因此我們說 abcde > abcd。

>>> A < BTrue>>> abcde < abdceTrue>>> abcde > abcdTrue

因為 ASCII 表中西文字母都是按照順序排列的,因此這種字元串比較得到的順序也就是字典序。由於漢字這種字元沒有字母這種天然的順序,因此對漢字的這種排序並不常見。

好了,本節課的內容我們就先介紹到這裡。通過這節課的內容,我們了解了字元串的概念,並且了解了字元和字元在計算機中的表示方法,知道了 ASCII 和 Unicode 這兩個重要的字元編碼。

可樂希望大家能夠在課後自行搜索一下 ASCII 和 Unicode 相關的知識,閱讀更多關於字元編碼的資料,如果有什麼問題,歡迎在我們的可樂編程公眾號後台留言哦。

在下一節課程中,可樂會帶領大家繼續了解字元串,學習如何在 Python 中使用、修改和格式化字元串,下期見咯。

推薦閱讀:

Leetcodes Solution 43 Multiply Strings
加工中心切削刀具及應用知識,必備!
分治法,動態規劃及貪心演算法區別
python的各種推導式(列表推導式、字典推導式、集合推導式)
Vim Clutch | 面向腳踏板編程……

TAG:Python | 零基礎 | 編程 |