Sequences(序列)
Python的序列類型具有以下特點:成員元素有序排列,個數有限,可重復 。序列包括: 字符串,列表 和 元組。
不可變序列:
不可變序列類型的對象在創建后不能更改,如果你試圖去修改一個不可變對象Python將會報錯。如果對象包含對其他對象的引用,這些引用不能改變,但是其他對象本身可以是可變的并且可以改變。例如:元組 a = (1, [2, 3, 4], 5),中a[1]是一一個對[2, 3, 4]列表的引用,a[1]這個引用不可以改變,只能指向[2, 3, 4],但是[2, 3, 4]這個列表本身是可以改變的。字符串和元組是不可變序列。
可變序列:
可變序列在創建后可以更改,下標和切片表示法可以用于賦值和del(delete)語句的目標。列表是可變序列。
一、字符串(String)
Python 中的字符串為引號之間的字符序列集合,Python 沒有字符類型。
Python 支持使用成對的單引號或雙引號來創建字符串,他們作用是相同的。之所以這兩種形式都可以使用,是因為你可以不使用反斜杠轉義字符就可以實現在一個字符串中包含其余種類的引號。并且Python傾向于打印所有這些形式的字符串為單引號,除非字符串內有了單引號了。Python自動的在任意的表達式中合并相鄰的字符串常量(中間沒有任何操作符),盡管可以簡單地在它們之間使用 +
操作符來明確的表示這是一個合并操作。在這些字符串之間增加逗號會創建一個元組,而不是一個字符串。
使用索引運算符 [ ]
和切片運算符 [ : ]
可以得到子字符串。
在大部分應用程序里,沒有必要顯式的刪除字符串。定義這個字符串的代碼最終會結束,那時 Python 會自動釋放這些字符串。
1、用轉義序列代表特殊字符
在Python中使用反斜杠符號( \ )來引入特殊的字節編碼(比如 \n 代表著換行符),這就是轉義序列。轉義序列讓我們能夠在字符串中嵌入不容易通過鍵盤輸入或者已作為字符串相關操作符(例如:' ,",\ 符號要在字符串中標識自身需要在前面加上\符號,例如:',",\)的字符。字符串常量中字符 “\”,以及它后面的一個或多個字符,在最終的字符串對象中會被一個單個字符所替代,這個字符通過轉義序列定義了一個對應的二進制值。其中字符 \n 表示一個換行符, \t 表示一個制表符。這個字符串打印時的格式取決于打印的方式。交互模式下(調用repr()函數)是以轉義字符的形式回顯的,但是print()函數(調用str()函數)會將其解釋出來。
Python的轉義字符:
在Python中并不會像C語言那樣使用一個0(空)字符去結束一個字符串,Python沒有字符會結束一個字符串,Python在內存中保存了真個字符串的長度和文本。
雖然這樣可以在字符串中編寫反斜杠常量字符,但是你需要將上述表中的內容都記住。所以我們更建議使用重復的兩個反斜杠或者raw字符串,來在字符串中表示反斜杠字符。
2、使用raw字符串抑制轉義
使用轉義序列來處理嵌入到字符串中的特殊字符是很合適的,但是有時候這種方式也會比較麻煩。有時候新手會使用這樣的文件名參數去嘗試打開一個文件。問題是這里有“\U” 和 “\n”,他們會識別為轉義字符。當然我們可以使用兩個反斜杠字符來在字符串中包留反斜杠,但是我們有更方便的方法。
種情況下使用 raw 字符串就會很方便。如果字符 r
或者 R
出現在字符串的第一個引號的前面,它將會關閉轉義機制。所以在 raw 字符串中 Python 會將反斜杠作為常量字符來保持,而不會匹配后面跟著的字符作為轉義序列。
Python腳本會自動的在Windows和Linux的路徑中使用斜杠 /
表示文件路徑,因為Python是按照可移植的方法來解釋路徑。所以myfile = open(r"C:/User/new/test.txt", "w") 也是有效的。
注意:一個raw字符串不能以單個反斜杠結尾,因為反斜杠會轉義后面的引號。總結來說一個raw字符串不能以奇數個反斜杠結尾。
3、使用三重引號編寫多行字符串塊
使用三引號可以允許一個字符串跨多行書寫,我們有時候稱其為塊字符串。這個形式以三重引號開始(單引號和雙引號都可以),并緊跟任意行數的文本,并且以和開始時同樣的三重引號結尾。Python把所有在三重引號之內的文本收集到一個字符串中,并在代碼換行處嵌入了換行符。這種方式在程序中需要輸入多行文本的任何時候都是很有用的。
三重引號字符串常用于文檔字符串,當它出現在文件的特定地點時,會被當作注釋一樣的字符串常量。我們也經常在開發的過程中使用三重引號來廢除一些代碼。
4、字符串格式化
字符串格式化允許在一個單個的步驟中對一個字符串執行多個特定類型的替換。字符串的格式化可以使用字符串格式化表達式的形式,或者調用字符串的 format()
方法。
(1)表達式形式
Python在對字符串操作的時候自定義了 %
操作符,它提供了簡單的方法對字符串的值進行格式化。
格式化字符串:
- 在
%
操作符的左側放置一個需要進行格式化的字符串,這個字符串帶有一個或多個嵌入的轉換目標(%s
%d
等),都已%
開頭。 - 在
%
操作符的右側放置一個(或多個嵌入到元祖中的)對象,這些對象將會插入到左側想讓Python進行格式化字符串的一個(或多個)轉換目標的位置上去。
轉換目標格式:
% [(name)] [flags] [width] [.precision] typecode
參數說明:
- name : 可選,用于選擇指定的key
-
flags:可選,用于表示對其方式,通常和 width 一起使用,無居中功能
(+:右對齊 -:左對齊 空格:右對齊 。。。) - width:可選,指定占位寬度
- precision : 有用,小數點后保留的位數
-
typecode : 必選,
- %s : 字符串
- %r:同%s,但是用repr,而不是str
- %c:字符
- %i:整數
- %u:無號(整數)
- %%:常量%
- %d:十進制
- %o:八進制
- %x: 十六進制
由于對象的每個類型都可以轉換成字符串(打印時所使用的),每一個與 %s 轉換目標一同參與的對象類型都可以轉換代碼。正因為如此,除非你要做特殊的格式化,一般你只需要記得用 %s 這個代碼來格式化表達式就可以了。
格式化總是返回新的字符串作為結果而不是對左側的字符串進行修改(由于字符串是不可變對象)。(2)format()方法
字符串對象的 format()
方法使用主體字符串作為模板,并且接受任意多個表示要根據模板替換的值的參數。在主體字符串中,花括號通過位置(例如:{1})或關鍵字(例如:{food})指出替換目標及要插入的參數,因為Python的函數和方法的參數可以使用位置或關鍵字名稱來傳遞。
就像 % 表達式和其他字符串方法一樣,format() 創建并返回一個新的字符串對象(因為字符串是不可變對象類型,所以 format() 函數必須創建一個新對象)。
格式化字符串:
對于格式化方法,我們在替換目標的標識之后使用一個冒號,后面跟著可以指定字段大小,對齊方式和一個特定類型編碼的格式化聲明。
轉換目標格式:
{ fieldname ! conversionflag : formatspec }
- fieldname:是指定參數的一個數字或關鍵字,后面跟著可選的 “.name” 或 "[index]" 成分引用。
- conversionflag:可以是r、s、或者a分別是在該值上對repr、str或ascii內置函數的一次調用。
- formatspec:指定了如何表示該值,包括字段寬度、對齊方式、補零、小數點精度等細節,并且以一個可選的數據類型編碼結束。
冒號后面的 formatspec
組成形式上的描述如下(方括號表示可選的組成,并且不能編寫為常量):
[ [ fill ] align ] [ sign ] [ # ] [ 0 ] [ width ] [ .precision ] [ typecode ]
align
可能是<、>、= 或^,分別表示左對齊、右對齊、一個標記字符后的補充或居中對齊。formatspec
也包含嵌套的、只帶有{}的格式化字符串,它從參數列表動態地獲取值(和格式化表達式中的*很相似)。
5、常用字符串內建方法
除了一般的序列操作,字符串還有獨有的一些操作作為方法存在(對象的函數,將會通過一個調用表達式觸發)。盡管序列操作是通用的,但方法不通用(雖然某些類型共享某些方法名,字符串的方法只能用于字符串)。一條簡明的法則是這樣的:可作用于多種類型的通用類型操作都是以內置函數或表達式的形式出現的(例如:len(x),x[0]),但是類型特定的操作是以方法調用的形式出現的(例如:string.upper())。
注意: 想要查找對象的所有內置方法,你可以調用內置的 dir() 函數,他將返回一個列表,其中包含了對象的所有屬性,由于方法是函數屬性,他們也會在這個列表中出現。dir() 函數簡單的給出了方法的名稱。要查詢他們是做什么的,可以將其傳遞給 help() 函數。help() 是一個隨Python一起分發的面向系統代碼的接口。
注意: 由于字符串是不可變對象,所以字符串的內置方法都不會改變原始的字符串,而是會創建一個新的字符串作為結果返回。
(1)去掉字符串中指定位置的指定字符
string.lstrip([obj]) : 截掉 string 左邊的字符(默認為空格)
string.rstrip([obj]) : 刪除 string 末尾的字符(默認為空格)
string.strip([obj]) : 在 string 上執行 lstrip()和 rstrip()
(2)按照指定的字符拆分字符串
string.split(str="", num=string.count(str))
以 str 為分隔符切片 string,如果 num有指定值,則僅分隔 num 個子字符串
(3)按照指定的字符把列表元素拼接在一起
string.join(seq) Merges (concatenates)
以 string 作為分隔符,將 seq 中所有的元素(的字符串表示)合并為一個新的字符串
(4)判斷字符串中是否包含某個字符
(5)將字符串的首字母大寫
string.capitalize()
(6)使用指定的字符串替換字符串中的指定元素
string.replace(str1, str2,num=string.count(str1))
把 string 中的 str1 替換成 str2,如果 num 指定,則替換不超過 num 次。
(7)使用指定的符號填充指定大小的指定位置
string.ljust(width,char=' ')
返回一個原字符串左對齊,并使用使用指定的符號填充至長度 width 的新字符串
string.rjust(width,char=' ')
返回一個原字符串右對齊,并使用使用指定的符號填充至長度 width 的新字符串
string.center(width,char=' ')
把字符串放到指定大小的中間位置,并使用指定的符號填充至長度 width 的新字符串
(8)查找字符串中的指定的字符的位置
string.find(str, beg=0, end=len(string))
檢測 str 是否包含在 string 中,如果 beg 和 end 指定范圍,則檢查是否包含在指定范圍內。如果找到返回開始的索引值,否則返回-1。
string.index(str, beg=0, end=len(string))
跟 find()方法一樣,只不過如果 str 不在 string 中會報一個異常.
(9)判斷字符串是否為數字
string.isdigit()
如果 string 只包含數字則返回 True 否則返回 False.
(10)判斷字符串是否已指定的字符開頭或者結尾
string.startswith(obj, beg=0,end=len(string))
檢查字符串是否以 obj 開頭,是則返回 True,否則返回 False。如果 beg 和 end 指定值,則在指定范圍內是否以 obj 開頭, 如果是, 返回 True,否則返回 False.
string.endswith(obj, beg=0,end=len(string))
檢查字符串是否以 obj 結束,是則返回 True,否則返回 False。如果 beg 和 end 指定值,則在指定范圍內是否以 obj 結束, 如果是, 返回 True,否則返回 False.
(11)把字符串轉換為大寫或者小寫或者翻轉
string.upper() : 轉換 string 中的小寫字母為大寫
string.lower() : 轉換 string 中所有大寫字符為小寫.
string.swapcase() : 翻轉 string 中的大小寫
(12)返回 str 在 string 里面出現的次數
***string.count(str, beg=0, end=len(string)) ***
如果 beg 或者 end 指定則返回指定范圍內 str 出現的次數。
(13)以指定的格式編碼字符串
string.encode(encoding='UTF-8', errors='strict')
以 encoding 指定的編碼格式編碼 string,如果出錯默認報一個ValueError 的異常,除非 errors 指定的是'ignore'或者'replace'
(14)以指定的編碼格式解碼字符串
string.decode(encoding='UTF-8', errors='strict')
以 encoding 指定的編碼格式解碼 string,如果出錯默認報一個ValueError 的 異 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'。
(15) 判斷字符串中的區分大小寫的字符是否全為小寫或者大寫
string.islower()
如果 string 中包含至少一個區分大小寫的字符,并且所有這些(區分大小寫的)字符都是小寫,則返回 True,否則返回 False。
string.isupper()
如果 string 中包含至少一個區分大小寫的字符, 并且所有這些(區分大小寫的)字符都是大寫,則返回 True,否則返回 False。
(16) 判斷字符串中的字符情況
string.isalnum()
如果 string 至少有一個字符并且所有字符都是字母或數字則返回 True,否則返回 False
string.isalpha()
如果 string 至少有一個字符并且所有字符都是字母則返回 True,否則返回 False
string.isdecimal()
如果 string 只包含十進制數字則返回 True 否則返回 False.
string.isnumeric()
如果 string 中只包含數字字符,則返回 True,否則返回 False
string.isspace()
如果 string 中只包含空格,則返回 True,否則返回 False.
(17)ASCII碼轉換 chr() 和 ord()
內建函數ord() 將一個碼點從字符串形式轉換為范圍在0 - 10FFFF之間的一個整數;chr() 將0 - 10FFFF范圍之間的一個整數轉換為對應的長度為1的字符串對象。《Python基礎手冊》系列:
Python基礎手冊 1 —— Python語言介紹
Python基礎手冊 2 —— Python 環境搭建(Linux)
Python基礎手冊 3 —— Python解釋器
Python基礎手冊 4 —— 文本結構
Python基礎手冊 5 —— 標識符和關鍵字
Python基礎手冊 6 —— 操作符
Python基礎手冊 7 —— 內建函數
Python基礎手冊 8 —— Python對象
Python基礎手冊 9 —— 數字類型
Python基礎手冊10 —— 序列(字符串)
Python基礎手冊11 —— 序列(元組&列表)
Python基礎手冊12 —— 序列(類型操作)
Python基礎手冊13 —— 映射(字典)
Python基礎手冊14 —— 集合
Python基礎手冊15 —— 解析
Python基礎手冊16 —— 文件
Python基礎手冊17 —— 簡單語句
Python基礎手冊18 —— 復合語句(流程控制語句)
Python基礎手冊19 —— 迭代器
Python基礎手冊20 —— 生成器
Python基礎手冊21 —— 函數的定義
Python基礎手冊22 —— 函數的參數
Python基礎手冊23 —— 函數的調用
Python基礎手冊24 —— 函數中變量的作用域
Python基礎手冊25 —— 裝飾器
Python基礎手冊26 —— 錯誤 & 異常
Python基礎手冊27 —— 模塊
Python基礎手冊28 —— 模塊的高級概念
Python基礎手冊29 —— 包