1. 程式人生 > >Python核心資料型別——字串(1)

Python核心資料型別——字串(1)

實際上,字串是即將學習的從屬於稍大一些的物件類別——序列的第一個代表。要格外留意這裡介紹的序列操作,因為它在今後要學習的其他序列型別(例如列表和元祖)中也同樣適用。

==========================================================================================

單雙引號字串是一樣的

>>> 'shrubbery',"shrubbery"
('shrubbery', 'shrubbery')
可以在一個雙引號字元所包含的字串中嵌入一個單引號字元,反之亦然
>>> 'knight"s',"knight's"
('knight"s', "knight's")
此外,Python自動在任意的表示式中合併相鄰的字串常量,儘管可以簡單地在它們之間增加+操作符來明確表示這是一個合併操作(把這種形式放到圓括號中,就可以允許它跨越多行)
>>> title = "Meaning "'of'" Life"
>>> title
'Meaning of Life'
注意:在這些字串之間增加逗號會建立一個元組,而不是一個字串。並且Python傾向於列印所有這些形式的字串為單引號,除非字串內有了單引號了。也可以通過反斜槓轉義字元去嵌入引號:
>>> 'knight\'s',"knight\"s"
("knight's", 'knight"s')
==========================================================================================

用轉義序列代表特殊位元組

反斜槓用來引入特殊的位元組編碼,是轉義序列

>>> s = 'a\nb\tc'
>>> s
'a\nb\tc'
>>> print(s)
a
b	c
>>> len(s)
5
字串反斜槓字元
轉義 意義
\newline 忽視(連續)
\\ 反斜槓(保留\)
\' 單引號(保留')
\" 雙引號(保留")
\a 響鈴
\b 倒退
\f 換頁
\n 換行
\r 返回
\t 水平製表符
\v 垂直製表符
\N{id} Unicode資料庫ID
\uhhhh Unicode16位的十六進位制值
\uhhhhhhhh Unicode32位的十六進位制值
\xhh 十六進位制值
\ooo 八進位制值
\0 Null(不是字串結尾)
\other 不轉義(保留)

python 以十六進位制顯示非列印的字元,不管是如何指定它們的:
>>> s = '\001\002\x03'
>>> s
'\x01\x02\x03'
如果Python沒有作為一個合法的轉義編碼識別出在'\'後的字元,它就直接在最終的字串中保留反斜槓
>>> x = 'C:\py\code'
>>> x
'C:\\py\\code'
>>> print(x)
C:\py\code
==========================================================================================
raw字串抑制轉義
myfile = open('C:\new\text.dat','w')
這並不會開啟一個在C:\new目錄下的名為text.dat的檔案,問題是這裡有‘\n’,它會識別為一個換行字元,並且'\t'會被一個製表符所替代

使用raw字串:如果字元R或r出現在字串的第一個引號前面,它就會關閉轉義機制。這個結果就是Python會將反斜槓作為常量來保持,就像輸入的那樣,因此為了避免這種檔名的錯誤,記得增加字母r:

myfile = open(r'C:\new\text.dat','w')
還有一種方法:因為兩個反斜槓是一個反斜槓的轉義序列,能過通過簡單地寫兩個反斜槓線去保留反斜槓:
myfile = open('C:\\new\\text.dat','w')
==========================================================================================

三重引號編寫多行字串塊

字串塊:以三重引號開始(單引號和雙引號都可以),並緊跟任意行數的文字,並且以開始時同樣的三重引號結尾。嵌入在這個字串文字中的單引號和雙引號也會,但不是必須轉義——直到Python看到和這個常量開始時同樣的三重引號,這個字串才會結束。例如:

>>> s = '''I have a dream
that
some day
there are '''
>>> s
'I have a dream\nthat\nsome day\nthere are '
三重引號字串在程式中需要輸入多行文字的任何時候都是很有用的。例如,嵌入多行錯誤資訊或在原始檔中編寫HTML或XML程式碼。我們能夠直接在指令碼中嵌入這樣的文字塊,而不需要求助於外部的文字檔案。

實際中,可以利用這個三重引號來註釋多行程式碼,不用一行行地新增‘#’號(黑客風格)

==========================================================================================
字串基本操作

>>> len('abc')
3
>>> 'abc'+'def'
'abcdef'
>>> 'Hi!'*4
'Hi!Hi!Hi!Hi!'
重複最初看起來有些費解,然而有時候卻十分順手。例如,為了列印包含80個橫線的一行,你可以一個一個數到80,或者讓Python幫你數!
可以使用for語句在一個字串中進行迴圈迭代,並使用in表示式操作符對字元和子字串進行成員關係的測試,這實際上是一種搜尋。對於子字串,in很像是str.find()方法,但是,它返回的是一個布林結果而不是子字串的位置:
>>> for c in myjob:print(c,end=' ')

h a c k e r
>>> 'k' in myjob
True
>>> 'z' in myjob
False
>>> 'spam' in 'abcspamdef'
True
==========================================================================================

索引和分片

在Python中,字串中的字元是通過索引(通過在字串之後的方括號中提供所需要的元素的數字偏移量)提取的。

就像C語言一樣,Python的偏移量是從0開始的,並比字串的長度小1.

與C語言不同,Python還支援類似在字串中使用負偏移這樣的方法從序列中獲取元素。

從技術上講,一個負偏移與這個字串的長度相加後得到這個字串的正的偏移值。能夠將負偏移看做是從結束處反向計數。

>>> s = 'spam'
>>> s[0],s[-2]
('s', 'a')
>>> s[1:3],s[1:],s[:-1]
('pa', 'pam', 'spa')
概括如下:

【1】索引(s[i])獲取特定偏移的元素:
第一個元素的偏移為0
負偏移索引意味著從最後或右邊反向進行計數
 s[0]獲取了第一個元素
s[-2]獲取了倒數第二個元素(就像s[len(s)-2]一樣)

【2】分片(s[i:j])提取對應的部分作為一個序列:
上邊界並不包含在內
分片的邊界預設為0和序列的長度,如果沒有給出的話,舉例如下:
s[1:3]獲取了從偏移為1的元素,直到但不包括偏移為3的元素
s[1:]獲取了從偏移為1直到末尾(偏移為序列長度)之間的元素
s[:3]獲取了從偏移為0直到但是不包括偏移為3之間的元素
 s[:-1]獲取了從偏移為0直到但是不包括最後一個元素之間的元素
s[:]獲取了從偏移0到末尾之間的元素,這有效地實現了頂層s拷貝

==========================================================================================

擴充套件分片:第三個限制值

在Python2.3中,分片表示式增加了一個可選的第三個索引,用作步進(有時稱為是stride)。完整的分片形式現在變成了X[I:J:K]。這表示“索引X物件中的元素,從偏移為I直到偏移為J-1,每隔K元素索引一次”。第三個限制K,預設為1,這也就是通常在一個切片從左至右提取每一個元素的原因。如果定義了一個明確的值,那麼能夠使用第三個限制去跳過某些元素或反向排列他們的順序。

>>> x = 'abcdefghijklmn'
>>> x[::2]
'acegikm'
如同往常,第一個和第二個限制值預設為0以及序列的長度,所以,x[::2]會取出序列從頭到尾、每隔一個元素的元素。

也可以使用負數作為步進。例如,分片表示式“hello”[::-1]返回一個新的字串“olleh”,步進-1表示分片將會從右至左進行而不是通常的從左至右。因此,實際效果就是將序列進行反轉:

>>> S = 'hello'
>>> S[::-1]
'olleh'
通過一個負數步進,兩個邊界的意義實際上進行了反轉。也就是說,分片S[5:1:-1]以反轉的順序獲取從2到5的元素(結果是偏移為5、4、3和2的元素)
>>> S = 'abcdefg'
>>> S[5:1]
''
>>> S[5:1:-1]
'fedc'
像這樣使用三重限制的列表來跳過或者反序輸出是很常見的情況。
==========================================================================================

為什麼要在意【分片】

如果在系統命令列中啟動Python程式,有時會新增引數,這使用了內建的sys模組中的argv屬性:

#File echo.py
import sys
print(sys.argv)

%python echo.py -a -b -c
['echo.py','-a','-b','-c']
通常只對跟隨在程式後邊的引數感興趣。這就是一個分片的典型應用:一個分佈表示式能夠返回除了第一項之外的所有元素的列表。這裡,sys.argv[1:]返回所期待的列表['-a','-b','-c']。

分片也常常用作清理輸入檔案的內容。如果知道一行將會以行終止字元(\n換行符標識)結束,你就能夠通過一個簡單的表示式,例如,line[:-1],把這行除了最後一個字元之外的所有內容提取出來。
不過,值得注意的是,為了去掉換行字元常常推薦採用line.rstrip方法,因為這個呼叫將會留下沒有換行字元那行的最後一個字元。