Python核心資料型別——字串(1)
實際上,字串是即將學習的從屬於稍大一些的物件類別——序列的第一個代表。要格外留意這裡介紹的序列操作,因為它在今後要學習的其他序列型別(例如列表和元祖)中也同樣適用。
==========================================================================================
單雙引號字串是一樣的
>>> 'shrubbery',"shrubbery"
('shrubbery', 'shrubbery')
可以在一個雙引號字元所包含的字串中嵌入一個單引號字元,反之亦然此外,Python自動在任意的表示式中合併相鄰的字串常量,儘管可以簡單地在它們之間增加+操作符來明確表示這是一個合併操作(把這種形式放到圓括號中,就可以允許它跨越多行)>>> 'knight"s',"knight's" ('knight"s', "knight's")
>>> 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方法,因為這個呼叫將會留下沒有換行字元那行的最後一個字元。