0基礎學Python之六:字元串(下)

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

Hi 大家好,我是王可樂。上一節課里,可樂和大家一起學習了字元串的概念,以及字元和它們在計算機中的數字表示,知道了什麼是 ASCII 編碼和 Unicode 編碼。今天的課程里,可樂來帶領大家看一下 Python 中是如何使用字元串的。

上一節課我們已經看到過,使用單引號或者雙引號可以創建一個字元串,引號內書寫合法的字元或者轉義字元即可。字元串可以作為值被賦予給變數,例如我們定義變數 greeting,並賦值為字元串 Hello。

>>> greeting=Hello

我們知道,字元串是前後相連的一串字元,那麼自然地字元串有長度的概念。可以用內置函數 len() 來計算字元串的長度,例如:我們輸入 len(greeting),回車。可以看到這個字元串的長度為 5 個字元,我們看到 Hello 確實由五個字元組成。

>>> len(greeting)>>> 5

我們可以通過下標來引用字元串中的字元,下標也就是字元在字元串中的位置,在計算機的世界裡,我們以 0 開頭來計數。例如 Hello[0],就是字元 H;

>>> Hello[0]>>> H

代碼中更常見的是使用變數名,我們來看一下:greeting[0],回車,是 H;greeting[1],回車,是 e;greeting[4],回車,是 o。這個字元串有五個字元,因此下標最多到 4,如果下標寫太大了呢?我們來看一下,輸入:greeting[5],回車。Python 告訴我們出現了一個 IndexError,下標超出了允許的範圍。

>>> greeting[0]>>> H>>> greeting[1]>>> e>>> greeting[4]>>> o>>> greeting[5]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: string index out of range

在 Python 中還允許使用負數下標,作用是從後向前來訪問字元。例如我們輸入 greeting[-1],回車,結果是 o;greeting[-2] 是 l;greeting[-5] 是大寫 H;而如果輸入 greeting[-6],同樣 Python 告訴我們出現了 IndexError,這裡負數下標最多到 -5,而 -6 超出了允許的範圍。

>>> greeting[-1]o>>> greeting[-2]l>>> greeting[-5]H>>> greeting[-6]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: string index out of range

了解了下標的用法,我們來看一下字元串截取,也就是從字元串中截取出來一部分,得到一個新的字元串。實際上我們使用單獨的下標來取出單個字元,就 是一種特殊的字元串截取,截取出來的也是一個新字元串,只是長度為一。我們也可以來截取長一點的新字元串,例如:輸入 greeting[1:4],回車,我們得到的新字元串為 ell。

>>> greeting[1:4]ell

字元串截取時,我們使用兩個數字,第一個數字是開頭,就是 Hello 的 1 號,也就是第二個字元 e;而第二個數字則是結尾加一,我們看到 Hello 的 4 號,也就是第五個字元是 o,新截取出來的字元不包含這個 o,而是只到前一位的 l。換句話說,字元串截取用的下標是個前閉後開的區間。

截取字元串也可以使用負數下標,例如我們輸入 greeting[1:-1],回車,仍然得到了 ell。規則還是一樣的,截取範圍從前一個數字下標所在的字元開始,到後一個下標所在的字元之前。如果前後兩個數字下標指向同一個字元,例如(輸入) greeting[2:2],那麼我們只能截取到一個空字元串;或者後一個下標指向的字元比前一個下標指向的字元還要靠前,例如(輸入) greeting[2:1],也是只能得到一個空字元串。

>>> greeting[1:-1]ell>>> greeting[2:2]>>> greeting[2:1]

截取字元串時,冒號前後的兩個數字可以省略。例如我們輸入 greeting[1:],省略後面的下標,那麼 Python 會為我們一直截取到最後一個字元;如果省略前一個下標,例如 greeting[:4],意思是從字元串開頭開始截取,於是我們得到了 Hell;按照這個規則,我們試一下 greeting[:],不使用下標,回車,最後得到的就是整個字元串了。

>>> greeting[1:]ello>>> greeting[:4]Hell>>> greeting[:]Hello

此外,截取字元串使用的下標還有可能超出字元串長度範圍。例如冒號後面的下標大於字元串長度時,greeting[1:100],Python 就幫我們截取到字元串的最後一個字元為止,也就是 ello;再例如冒號前面的下標小於負數最小的下標時,greeting[-100:4],Python 只能從字元串開頭來截取,我們還是得到 Hell 這個新字元串。

>>> greeting[1:100]ello>>> greeting[-100:4]Hell

在 Python 語言中,也有一些操作字元串的操作符。例如 + 號,我們知道,對於 Python 中的數字,+ 號表示將前後兩個數字相加,得到一個新的數字,例如 1 + 1 回車,得到數字 2;而對於字元串,我們也可以使用 + 號操作符,只是對於字元串來說,+ 號的功能是將前後兩個字元串連接起來生成一個新的字元串。例如我們輸入 Hello + Python,回車,就能得到一個新的字元串 HelloPython。

>>> Hello+PythonHelloPython

類似的,* 號操作符也可以用於字元串操作。和數字乘法不同,* 號操作符用於字元串時,前面是一個字元串,後面則必須是一個 int 類型的整數。例如我們輸入 Hello * 3,就能得到一個新的字元串 HelloHelloHello,也就是重複了 3 遍的 Hello。

>>> Hello*3HelloHelloHello

另外還有一個我們還沒有見過的操作符,叫做 in。in 是 Python 的關鍵字,在很多地方都有特殊的含義,因此不能使用 in 作為變數名字哦。用在字元串上,in 操作符用於判斷前面的字元串是否是後面字元串的子串。例如我們輸入 H in Hello,回車,得到 True;類似的輸入 a in Hello,回車,得到的是 False;in 前面的字元串不一定必須是單個字元,例如輸入 ll in Hello,也是返回 True;而輸入 Ho in Hello,儘管 H 和 o 都在字元串 Hello 裡面,但是 Ho 卻不是 Hello 的子串,因此返回 False。

>>> H in HelloTrue>>> a in HelloFalse>>> ll in HelloTrue>>> Ho in HelloFalse>>> H in HelloTrue

類似的還可以使用操作符 not in,它和 in 的用法一樣,只是返回結果相反。例如 H not in Hello,回車,返回 False,因為 H 是 Hello 的字串,因此 not in 不成立。

除了操作符,Python 還提供了豐富的標準函數來操作字元串。這些函數非常多,可樂建議大家在課後查閱一下 Python 的文檔,了解一下都有哪些操作可以使用。下面可樂先給大家介紹幾個常用的標準函數。

我們已經見過如何獲得一個字元串的長度,它使用內置函數 len(),例如 len(Hello),我們得到結果是 5。

>>> len(Hello)5

另一組有用的函數是 startswith() 和 endswith(),它們和 len() 略有不同。實際上,len() 是 Python 的內置函數,而 startswith() 和 endswith() 則是方法。不過你現在不用擔心什麼是函數或者什麼是方法,只需要知道存在這樣的一些操作即可。在後面的課程中,可樂還會為你深入的講解,讓你能夠更深刻地理解這些概念。

我們還是用實例演示一下,輸入 Hello.startswith(He),回車,返回 True;輸入 Hello.startwith(H),還是返回 True;輸入 Hello.startwith(o),這次返回 False。在這裡,startswith() 用來判斷括弧裡面的字元串是否是點號前面字元串的開頭;endswith() 的用法也是類似的,只是它用來判斷括弧里的字元串是否是前面字元串的結尾。當然,這兩個函數還有其他的用法,等你學習了可樂後面的課程,理解了函數的概念,就可以從 Python 的文檔中解讀出來這些函數的用法了。

>>> Hello.startswith(He)True>>> Hello.startswith(H)True>>> Hello.startswith(o)False

我們再來看一個函數 count()。先演示一下,輸入 Hello.count(l),回車,得到 2。它的意思是在 Hello 這個字元串里,l 這個字元串出現了兩次;再比如我們輸入 Hello.count(He),你應該可以猜到,結果是 1;而如果括弧里的字元串並沒有在前面的字元串里出現過,例如 Hello.count(a),如你所見,結果就是 0 了。

>>> Hello.count(l)2>>> Hello.count(He)1>>> Hello.count(a)0

我們再來看一個函數 join()。這個函數複雜一點,我們還是從例子入手:輸入 ;.join([a, b, c]),回車,我們得到了一個新的字元串,就是以分號分隔的 a, b 和 c。在這個語句里,函數的圓括弧裡面是一個叫做列表的東西,我們會在後面的課程里為大家介紹它。現在你只需要知道列表裡包含了三個字元串 a, b 和 c,而 join() 函數則將它們連接起來,並且在中間插入點號前面指定的字元串作為分隔符。

>>> ;.join([a,b,c])a;b;c

最後,可樂再為大家介紹另一個函數 format()。還是先看一個例子:輸入 生命、宇宙以及一切的終極答案是 {}。.format(42),回車。可以看到,Python 用 42 替換了前面字元串里的一對 {},得到了一個新的字元串。這種操作叫做格式化字元串,簡單說就是將括弧里的內容,也叫參數,替換到 {} 所在的位置。不過,format() 的功能遠遠不止這麼簡單,我們再看一個例子:

>>> 生命、宇宙以及一切的終極答案是 {}。.format(42)生命、宇宙以及一切的終極答案是 42。

首先我們定義三個變數,輸入 a = 2, b = 3, c = 7,然後輸入 {0}, {2} and {1}.format(a, b, c),回車,我們得到字元串 2, 7 and 3。可以看到,我們在 format() 的括弧里使用了變數作為參數,而且可以使用任意多個參數;此外,在 format() 前面字元串的 {} 里,我們用編號來指定了這個位置應該放入第幾個參數。

>>> a=2>>> b=3>>> c=7>>> {0}, {2} and {1}.format(a, b, c)2, 7 and 3>>> {first}, {second} and {third}.format(first=a, second=c, third=b)2, 7 and 3

除了使用編號,還可以使用名字來指定要替換的參數,例如:輸入 {first}, {second} and {third}.format(first=a, second=c, third=b),回車。我們得到了和上面一樣的結果。

除了指定替換的參數,花括弧里還可以指定替換參數所使用的格式。例如,控制浮點數的小數點位數:輸入 a = 74 / 13,回車,我們得到了一個很長的小數;然後,輸入 答案是 {:.2f}.format(a),回車,可以看到,輸出的結果中小數點後只保留了兩位。在這裡,{} 內的 :.2f 控制了變數 a 在最終字元串中的展示方式。

>>> a = 74 / 13>>> 答案是 {:.2f}.format(a)答案是 5.69

format() 函數支持非常豐富和精細的格式控制,大家在我們後面的課程中還會看到,要了解比較全面的格式控制方法,大家也可以自行查閱 Python 文檔。

好了,本節課的內容我們就先介紹到這裡。看完本節課的內容,可樂希望大家在 Python 的文檔中查找一下字元串操作相關的標準函數。除了 可樂提到過的之外,建議大家了解一下例如 find(), index(), isalnum(), isalpha(), isdigit(), isnumeric(), isdecimal(), strip(), replace(), translate() 等常用的函數。此外,大家還可以從文檔中查找一下 format() 函數的其他用法,以及字元串格式化的另一種方法——使用 %,作為對本節課內容的補充。那麼,這節課的內容就到這裡,我們下期見咯。


推薦閱讀:

零基礎學板繪源頭
水彩入門|管彩、固彩、液體水彩顏料的區別
零基礎學水彩|色彩的基礎知識(一)
零基礎西班牙語語音學習知識點
零基礎的人能學好英語嗎?

TAG:Python | 零基礎 | 編程 |