字串型態


在Python中字串有多種的表示方式。最基本的實字表示方式,就是使用雙引號或單引號來包括字元序列。例如:
>>> "Justin"
'Justin'
>>> 'Justin'
'Justin'
>>> "Just'in"
"Just'in"
>>> 'Just"in'
'Just"in'
>>> 'Just' 'in'
'Justin'

單引號或雙引號的字串表示,在Python中可以交替使用,就像上例中,若要在字串中包括單引號,則使用雙引號包括字元序列,反之亦然。如果有兩個連續的字串實字,Python會自動將之結合為一個字串。

在Python撰寫字串致力於簡潔易讀,字串中若包括\,則會自動轉換為\\,所以可以直接如下撰寫字串:
>>> 'c:\workspace'
'c:\\workspace'
>>> 'c:\\workspace'
'c:\\workspace'
>>>


在Python中,直接撰寫'c:\workspace',就如同你自行撰寫'c:\\workspace',前者在撰寫與可讀性上都比較方便。\\是跳離(Escape)字串表示,另外還有一些常用的跳離(Escape)字串表示:
\\ 反斜線
\' 單引號 '
\" 雙引號 "
\ooo 以8 進位數指定字元,最多三位數
\xhh 以16進 位數指定字元,至少兩位數
\uhhhh 以Unicode 16位元編碼指定字元
\Uhhhh 以Unicode 32位元編碼指定字元
\0 空字元
\n 換行
\r 歸位
\tTab


如果你想要表示跳離字串表示,例如要表示\t,則必須撰寫'\\t'來表示,這有些不方便,這時你可以使用原始字串(Raw String)表示,只要在字串前加上r即可。例如:
>>> print('\t')

>>> print('\\t')
\t
>>> print(r'\t')
\t
>>> print('c:\\workspace')
c:\workspace
>>> print(r'c:\\workspace')
c:\\workspace
>>> '\t'
'\t'
>>> r'\t'
'\\t'
>>> 'c:\\workspace'
'c:\\workspace'
>>> r'c:\\workspace'
'c:\\\\workspace'
>>>


如果你的字串內容必須跨越數行,則可以使用三重引號。例如:
>>> '''Justin is caterpillar!
...    caterpillar is Justin!'''

'Justin is caterpillar!\n   caterpillar is Justin!'
>>> text = '''Justin is caterpillar!
...           caterpillar is Justin!'''
>>> print(text)
Justin is caterpillar!
          caterpillar is Justin!
>>>


你在三重引號之間輸入任何內容,則最後的字串就照單全收,包括換行、縮排等。

如果你想知道字串的長度,則可以使用len()函式。例如:
>>> text = 'Justin'
>>> len(text)
6
>>>


你可以使用for迴圈逐一取出字串中的字元:
>>> for c in 'Justin':
...     print(c, end='-')
...
J-u-s-t-i-n->>>


或者是使用in運算子測試某個字串是否在原字串中:
>>> 'Just' in 'Justin'
True
>>>


可以使用+運算子來串接字串,使用*可以重複字串:
>>> text1 = 'Just'
>>> text2 = 'in'
>>> text1 + text2
'Justin'
>>> text1 * 10
'JustJustJustJustJustJustJustJustJustJust'
>>>


在Python中,字串是不可變動的(Immutable),所以+實際會產生新的字串,在強弱型別的光譜中,Python比較偏強型別,型態較不能自行轉換,例如Python中,不能混合字串與數字進行+運算,你得自己將數字轉為字串,才可以進行字串串接:
>>> 'score: ' + 90
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> 'score: ' + str(90)
'score: 90'
>>>


如上例所示,你可以使用str()類別將數值轉換為字串。如果你想知道某個字元的編碼,則可以使用ord()函式,使用chr()則可以將指定編碼轉換為字元:
>>> ord('元')
20803
>>> chr(20803)
'元'
>>>


在Python3中,每個字串都是Unicode,不使用內部編碼表現,而使用str實例作為代表。如果想將字串轉為指定的編碼實作,可以使用encode()方法取得一個bytes實例,如果有個bytes實例,也可以使用decode()方法指定編碼取得str實例:
>>> '元'.encode('big5')
b'\xa4\xb8'
>>> '元'.encode('utf-8')
b'\xe5\x85\x83'
>>> '元'.encode('big5').decode('big5')
'元'
>>>


字串是由字元序列所組成,如果你想要取得字串中某個字元,則可以使用[]指定索引,索引從0開始。例如:
>>> name = 'Justin'
>>> name[0]
'J'
>>> name[1]
'u'
>>> name[-1]
'n'
>>>


Python中的索引,不僅可指定正值,還可以指定負值,實際上了解索引意義的開發人員,都知道索引其實就是相對第一個元素的偏移值,在Python中,正值索引就是指正偏移值,負值索引就是負偏移值,也就是-1索引就是倒數第一個元素,-2索引就是倒數第二個元素。

[]運算子還可以進行切片(Slice)運算。例如:
>>> name[0:3]
'Jus'
>>> name[3:]
'tin'
>>> name[:4]
'Just'
>>> name[:-1]
'Justi'
>>> name[-5:-1]
'usti'
>>>


上例中指出了切片運算,可以指定起始索引(包括)與結尾索引(不包括)來切出子字串。如果只指定起始索引,不指定結尾索引,則表示切出從起始索引至字串結束間的子字串。如果只指定結尾索引,不指定起始索引,則表示切出從0索引至(不包括)結尾索引間的子字串。起始索引與結尾索引都可以指定負值。([:]則是作淺層複製,只不過對字串這種不可變動的物件沒有實質意義)

切片運算的另一個形式是[i:j:k],意思是切出起始索引i與結尾索引j(不包括)之間,每隔k元素的內容。例如:
>>> name[0:4:2]
'Js'
>>> name[2::2]
'si'
>>> name[:5:2]
'Jsi'
>>> name[::2]
'Jsi'
>>> name[::-1]
'nitsuJ'
>>>


注意最後一個範例,當間隔指定為正時,表示正偏移每k個取出元素,間隔指定為負時,表示負偏移每k個取出元素。[::-1]表示從索引0至結尾,以負偏移1方式取得字串,結果就是反轉字串。

在Python中,非物件專屬的操作,是以函式的方式提供,例如之前的len()函式並不只能用在字串,而可以用在所有的串列物件(只要該物件上有__len__()方法)。物件專屬的操作,則是物件上的方法,例如以下示範幾個字串專屬方法:
>>> name.index('i')
4
>>> name.upper()
'JUSTIN'
>>> name.lower()
'justin'
>>> name.startswith('J')
True
>>>