Python字串及基本操作(入門必看)

2020-07-16 10:04:44
字串的意思就是“一串字元”,比如“Hello,Charlie”是一個字串,“How are you?”也是一個字串。

Python 要求字串必須使用引號括起來,使用單引號也行,使用雙引號也行,只要兩邊的引號能配對即可。

Python字串和跳脫字元

字串的內容幾乎可以包含任何字元,英文字元也行,中文字元也行。

Python 3.x 對中文字元支援較好,但 Python 2.x 則要求在源程式中增加“#coding:utf-8”才能支援中文字元。

字串既可用單引號括起來,也可用雙引號括起來,它們沒有任何區別。例如如下程式:
str1 = 'Charlie'
str2 = "C語言中文網"
print(str1)
print(str2)
但需要說明的是,Python 有時候沒有我們期望的那麼聰明。如果字串內容本身包含了單引號或雙引號,此時就需要進行特殊處理:
  1. 使用不同的引號將字串括起來。
  2. 對引號進行跳脫。

先看第一種處理方式。假如字串內容中包含了單引號,則可以使用雙引號將字串括起來。例如:

str3 = 'I'm a coder'

由於上面字串中包含了單引號,此時 Python 會將字串中的單引號與第一個單引號配對,這樣就會把 'I' 當成字串,而後面的 m a coder' 就變成了多餘的內容,從而導致語法錯誤。

為了避免這種問題,可以將上面程式碼改為如下形式:

str3 = "I'm a coder"

上面程式碼使用雙引號將字串括起來,此時 Python 就會把字串中的單引號當成字串內容,而不是和字串開始的引號配對。

假如字串內容本身包含雙引號,則可使用單引號將字有串括起來,例如如下程式碼:

str4 = '"Spring is here,let us jam!", said woodchuck.'


接下來看第二種處理方式:使用跳脫字元。Python 允許使用反斜線()將字串中的特殊字元進行跳脫。假如字串既包含單引號,又包含雙引號,此時必須使用跳脫字元,例如如下程式碼:

str5 = '"we are scared,Let's hide in the shade",says the bird'

拼接字串

如果直接將兩個字串緊挨著寫在一起,Python 就會自動拼接它們,例如如下程式碼:
s1 = "Hello,"'Charlie'
print(s1)
上面程式碼將會輸出:

Hello,Charlie

上面這種寫法只是書寫字串的一種特殊方法,並不能真正用於拼接字串。Python 使用加號(+)作為字串的拼接運算子,例如如下程式碼:
s2 = "Python "
s3 = "iS Funny"
#使用+拼接字串
s4 = s2 + s3
print(s4)

repr 和字串

有時候,我們需要將字串與數值進行拼接,而 Python 不允許直接拼接數值和字串,程式必須先將數值轉換成字串。

為了將數值轉換成字串,可以使用 str() 或 repr() 函數,例如如下程式碼:
s1 = "這是數位: "
p = 99.8
#字串直接拼接數值,程式報錯
print(s1 + p)
#使用str()將數值轉換成字串
print(s1 + str(p))
#使用repr()將數值轉換成字串
print(s1 + repr(p))
上面程式中直接拼接字串和數值,程式會報錯。

str() 和 repr() 函數都可以將數值轉換成字串,其中 str 本身是 Python 內建的型別(和 int、float 一樣),而 repr() 則只是一個函數。此外,repr 還有一個功能,它會以 Python 表示式的形式來表示值。對比如下程式碼:
st = "I will play my fife"
print (st)
print(repr(st))
上面程式碼中 st 本身就是一個字串,但程式依然使用了 repr() 對字串進行轉換。執行上面程式,可以看到如下輸出結果:

I will play my fife
'I will play my fife'

通過上面的輸出結果可以看出,如果直接使用 print() 函數輸出字串,將只能看到字串的內容,沒有引號;但如果先使用 repr() 函數對字串進行處理,然後再使用 print() 執行輸出,將可以看到帶引號的字串,這就是字串的 Python 的表示式形式。

在互動式直譯器中輸入一個主量或表示式時,Python 會自動使用 repr() 函數處理該變數或表示式。

使用 input 和 raw_input 獲取使用者輸入

input() 函數用於向使用者生成一條提示,然後獲取使用者輸入的內容。由於 input() 函數總會將使用者輸入的內容放入字串中,因此使用者可以輸入任何內容,input() 函數總是返回一個字串。

例如如下程式:
msg = input("請輸入你的值:")
print (type(msg))
print(msg)
第一次執行該程式,我們輸入一個整數,執行過程如下:

請輸入你的值:2
<class 'str'>
2

第二次執行該程式,我們輸入一個浮點數,執行過程如下:

請輸入你的值: 1.2
<class 'str'>
1.2

第三次執行該程式,我們輸入一個字串,執行過程如下:

請輸入你的值:Hello
<class 'str'>
Hello

從上面的執行過程可以看出,無論輸入哪種內容,始終可以看到 input() 函數返回字串,程式總會將使用者輸入的內容轉換成字串。

需要指出的是,Python 2.x 提供了一個 raw_input() 函數,該 raw_input() 函數就相當於 Python 3.x 中的 input() 函數。

而 Python 2.x 也提供了一個 input() 函數,該 input() 函數則比較怪異:要求使用者輸入的必須是符合 Python 語法的表示式。通常來說,使用者只能輸入整數、浮點數、複數、字串等。重點是格式必須正確,比如輸入字串時必須使用雙引號,否則 Python 就會報錯。

使用 Python 2.x 來執行上面程式,假如輸入一個整數,執行過程如下:

請輸入你的值:2
<class 'int'>
2

使用 Python 2.x 來執行上面程式,假如輸入一個複數,執行過程如下:

請輸入你的值: 2+3j
<type 'complex'>
(2+3j)

使用 Python 2.x 來執行上面程式,假如輸入一個字串,執行過程如下:

請輸入你的值:Hello
NameError : name 'Hello' is not defined

上面程式報錯的原因是:Python 2.x 的 input() 函數要求使用者輸入字串時必須用引號把字串括起來。

在 Python 2.x 中應該盡量使用 raw_input() 函數來獲取使用者輸入;Python 2.x 中的 raw_input() 等同於 Python 3.x 中的 input()。

Python長字串

前面介紹 Python 多行註釋時提到使用三個引號(單引號、雙引號都行)來包含多行注釋內容,其實這是長字串寫法,只是由於在長字串中可以放置任何內容,包括放置單引號、雙引號都可以,如果所定義的長字串沒有賦值給任何變數,那麼這個字串就相當於被直譯器忽略了,也就相當於注釋掉了。

實際上,使用三個引號括起來的長字串完全可以賦值給變數,例如如下程式:
s = '''"Let's go fishing", said Mary.
"OK, Let's go", said her brother.
they walked to a lake'''
print(s)
上面程式使用三個引號定義了長字串,該長字串中既可包含單引號,也可包含雙引號。

當程式中有大段文字內容要定義成字串時,優先推薦使用長字串形式,因為這種形式非常強大,可以讓字串中包含任何內容,既可包含單引號,也可包含雙引號。

此外,Python 還允許使用跳脫字元()對換行符進行跳脫,跳脫之後的換行符不會“中斷”字串。例如如下程式碼:
s2 = 'The quick brown fox 
jumps over the lazy dog'
print(s2)
上面 s2 字串的內容較長,故程式使用了跳脫字元()對內容進行了跳脫,這樣就可以把一個字串寫成兩行。

需要說明的是,Python 不是格式自由的語言,因此 Python 程式的換行、縮排都有其規定的語法。所以,Python 的表示式不允許隨便換行。如果程式需要對 Python 表示式換行,同樣需要使用跳脫字元()進行跳脫,程式碼如下:
num = 20 + 3 / 4 + 
    2 * 3
print(num)
上面程式中有一個表示式,為了對該表示式換行,程式需要使用跳脫字元。

Python原始字串

由於字串中的反斜線都有特殊的作用,因此當字串中包含反斜線時,就需要對其進行跳脫。

比如寫一條 Windows 的路徑 G:publishcodes22.4,如果在 Python 程式中直接這樣寫肯定是不行的,需要寫成 G:publishcodes22.4,這很煩人,此時可借助於原始字串來解決這個問題。

原始字串以“r”開頭,原始字串不會把反斜線當成特殊字元。因此,上面的 Windows 路徑可直接寫成 r'G:publishcodes22.4'。

關於原始字串的用法看如下程式:
s1 = r'G:publishcodes22.4'
print(s1)
如果原始字串中包含引號,程式同樣需要對引號進行跳脫(否則 Python 同樣無法對字串的引號精確配對),但此時用於跳脫的反斜線會變成字串的一部分。

例如如下程式碼:
# 原始字串包含的引號,同樣需要跳脫
s2 = r'"Let's go", said Charlie'
print(s2)
上面程式碼會生成如下輸出結果:

"Let's go", said Charlie

由於原始字串中的反斜線會對引號進行跳脫,因此原始字串的結尾處不能是反斜線,否則字串結尾處的引號就被跳脫了,這樣就導致字串不能正確結束。

如果確實要在原始字串的結尾處包含反斜線怎麼辦呢?一種方式是不要使用原始字串,而是改為使用長字串寫法(三引號字串);另一種方式就是將反斜線單獨寫。

例如如下程式碼:
s3 = r'Good Morning' ''
print(s3)
上面程式碼開始寫了一個原始字串 r'Good Morning',緊接著程式使用 '' 寫了一個包含反斜線的字串,Python 會自動將這兩個字串拼接在一起。執行上面程式碼會生成如下輸出結果:

Good Morning