Python核心編程(2)——序列:字符串、列表和元組

1.序列python

序列類型有着相同的訪問模式:它的每個元素能夠經過指定一個偏移量的方式獲得。而多個元素能夠經過切片操做的方式一次獲得。下標偏移量是從0 開始到 總元素數-1 結束 -- 之因此要減一是由於咱們是從0 開始計數的。git

 

序列類型操做符
序列操做符 做用
seq[ind] 得到下標爲ind 的元素
seq[ind1:ind2] 得到下標從ind1 到ind2 間的元素集合
seq * expr 序列重複expr 次
seq1 + seq2 鏈接序列seq1 和seq2
obj in seq 判斷obj 元素是否包含在seq 中
obj not in seq 判斷obj 元素是否不包含在seq 中

成員關係操做符 (in, not in):成員關係操做符使用來判斷一個元素是否屬於一個序列的。in/not in 操做符的返回值通常來說就是True/False,知足成員關係就返回True,不然返回False。該操做符的語法以下:obj [not] in sequenceweb

鏈接操做符(+):這個操做符容許咱們把一個序列和另外一個相同類型的序列作鏈接。語法以下:sequence1 + sequence2。該表達式的結果是一個包含sequence1 和sequence2 的內容的新序列。正則表達式

重複操做符(*):當你須要須要一個序列的多份拷貝時,重複操做符很是有用,它的語法以下:sequence * copies_int。該操做符返回一個新的包含多份原對象拷貝的對象。算法

切片操做符([],[:],[::]):所謂序列類型就是包含一些順序排列的對象的一個結構。你能夠簡單的用方括號加一個下標的方式訪問它的每個元素,或者經過在方括號中用冒號把開始下標和結束下標分開的方式來訪問一組連續的元素。數據庫

序列類型是其元素被順序放置的一種數據結構類型,這種方式容許經過指定下標的方式來得到某一個數據元素,或者經過指定下標範圍來得到一組序列的元素.這種訪問序列的方式叫作切片,咱們經過切片操做符就能夠實現咱們上面說到的操做。訪問某一個數據元素的語法以下:sequence[index]。sequence 是序列的名字,index 是想要訪問的元素對應的偏移量。偏移量能夠是正值,範圍從0 到偏移最大值(比序列長度少一),用len()函數,能夠獲得序列長度,實際的範圍是 0 <= inde <= len(sequece)-1 。另外,也可使用負索引,範圍是 -1 到序列的負長度,-len(sequence), -len(sequence) <= index <= -1。正負索引的區別在於正索引以序列的開始爲起點,負索引以序列的結束爲起點。編程

由於Python 是面向對象的,因此你能夠像下面這樣直接訪問一個序列的元素(不用先把它賦值給一個變量):api

>>> print ('Faye', 'Leanna', 'Daylen')[1]
Leanna數組

若想一次獲得多個元素呢?只要簡單的給出開始和結束的索引值,而且用冒號分隔就能夠了,其語法以下:sequence[starting_index:ending_index]。經過這種方式咱們能夠獲得從起始索引到結束索引(不包括結束索引對應的元素)之間的一"片"元素.起始索引和結束索引都是可選的,若是沒有提供或者用None 做爲索引值,切片操做會從序列的最開始處開始,或者直到序列的最末尾結束。序列的最後一個切片操做是擴展切片操做,它多出來的第三個索引值被用作步長參數。安全

內建函數list(),str()和tuple()被用作在各類序列類型之間轉換。

序列類型轉換工廠函數
函數 含義
list(iter) 把可迭代對象轉換爲列表
str(obj) 把obj 對象轉換成字符串(對象的字符串表示法)
unicode(obj) 把對象轉換成Unicode 字符串(使用默認編碼)
basestring()

抽象工廠函數,其做用僅僅是爲str 和unicode 函數提供父類,因此不能被
實例化,也不能被調用(

tuple(iter) 把一個可迭代對象轉換成一個元組對象

 

序列類型可用的內建函數
函數名 功能
enumerate(iter)

接受一個可迭代對象做爲參數,返回一個enumerate 對象(同時也是一個迭代器),該對象生成由iter 每一個元素的index 值和item 值組成的元組(PEP 279)

len(seq) 返回seq 的長度

max(iter,key=None) 

0r max(arg0,arg1……,key=None)

返回iter 或(arg0,arg1,...)中的最大值,若是指定了key,這個key 必須是一個能夠傳給sort()方法的,用於比較的回
調函數.

min(iter,key=None)

or min(arg0,arg1……,key=None)

返回iter 裏面的最小值;或者返回(arg0,arg2,...)裏面

的最小值;若是指定了key,這個key 必須是一個能夠傳給
sort()方法的,用於比較的回調函數.

reversed(seq) 接受一個序列做爲參數,返回一個以逆序訪問的迭代器(PEP 322)
sorted(iter,func=None,key=None,reverse=False)

接受一個可迭代對象做爲參數,返回一個有序的列表;可選參數func,key 和reverse 的含義跟list.sort()內建函數的參數含義一
樣.

sum(seq,init=0)

返回seq 和可選參數init 的總和, 其效果等同於reduce(operator.add,seq,init)

zip([it0,it1,……itN])

返回一個列表,其第一個元素是it0,it1,...這些元素的第一個元素組成的一個元組,第二個...,類推.

2.字符串

字符串類型是Python 裏面最多見的類型.咱們能夠簡單地經過在引號間包含字符的方式建立它。Python 裏面單引號和雙引號的做用是相同的。字符串是不可變類型,就是說改變一個字符串的元素須要新建一個新的字符串.字符串是由獨立的字符組成的,而且這些字符能夠經過切片操做順序地訪問。

建立一個字符串就像使用一個標量同樣簡單,在字符串後用方括號加一個或者多於一個索引的方式來得到子串。經過給一個變量賦值(或者重賦值)的方式「更新」一個已有的字符串.新的值可能與原有值差很少,也可能跟原有串徹底不一樣。跟數字類型同樣,字符串類型也是不可變的,因此你要改變一個字符串就必須經過建立一個新串的方式來實現。也就是說你不能只改變一個字符串的一個字符或者一個子串,然而,經過拼湊一箇舊串的各個部分來獲得一個新串是被容許的。

字符串是不可變的,因此你不能僅僅刪除一個字符串裏的某個字符,你能作的是經過賦一個空字符串或者使用del 語句來清空或者刪除一個字符串。

3.字符串和操做符

正向索引時,索引值開始於0,結束於總長度減1(由於咱們是從0 開始索引的)。在這個範圍內,咱們能夠訪問任意的子串。用一個參數來調用切片操做符結果是一個單一字符,而使用一個數值範圍(用':')做爲參數調用切片操做的參數會返回一串連續地字符。再強調一遍,對任何範圍[start:end],咱們能夠訪問到包括start 在內到end(不包括end)的全部字符,換句話說,假設x 是[start:end]中的一個索引值,那麼有: start<= x < end。

在進行反向索引操做時,是從-1 開始,向字符串的開始方向計數,到字符串長度的負數爲索引的結束(-len(str))。若是開始索引或者結束索引沒有被指定,則分別以字符串的第一個和最後一個索引值爲默認值。

:起始/結束索引都沒有指定的話會返回整個字符串。

成員操做符(in ,not in):成員操做符用於判斷一個字符或者一個子串(中的字符)是否出如今另外一個字符串中。出現則返回True,不然返回False。

注:成員操做符不是用來判斷一個字符串是否包含另外一個字符串的,這樣的功能由find()或者index()(還有它們的兄弟:rfind()和rindex())函數來完成。

鏈接符( + ):運行時刻字符串鏈接。經過鏈接操做符來從原有字符串得到一個新的字符串。

編譯時字符串鏈接,Python 的語法容許你在源碼中把幾個字符串連在一塊兒寫,以此來構建新字符串。能夠在一行裏面混用兩種引號,這種寫法的好處是你能夠把註釋也加進來。

若把一個普通字符串和一個Unicode 字符串作鏈接處理,Python 會在鏈接操做前先把普通字符串轉化爲Unicode 字符串。

重複操做符建立一個包含了原有字符串的多個拷貝的新串。

4.只適用於字符串的操做符

格式化操做符(%):只適用於字符串類型。ex:print("str %s %d" % (name,20))   =》str name 20

字符串格式化符號
格式化字符 轉換方式
%c 轉換成字符(ASCII 碼值,或者長度爲一的字符串)
%r 優先用repr()函數進行字符串轉換
%s 優先用str()函數進行字符串轉換
%d   %i 轉成有符號十進制數
%u 轉成無符號十進制數
%o 轉成無符號八進制數
%x   %X

(Unsigned)轉成無符號十六進制數(x/X 表明轉換後的十六進制字符的大小寫)

%e   %E 轉成科學計數法(e/E 控制輸出e/E)
%f    %F 轉成浮點數(小數部分天然截斷)
%g   %G %e 和%f/%E 和%F 的簡寫
%% 輸出%

格式字符串既能夠跟print 語句一塊兒用來向終端用戶輸出數據,又能夠用來合併字符串造成新字符串,並且還能夠直接顯示到GUI(Graphical User Interface)界面上去。

格式化操做符輔助指令
符號 做用
* 定義寬度或者小數點精度
- 用作左對齊
+ 在正數前面顯示加號( + )
<sp> 在正數前面顯示空格
#

在八進制數前面顯示零('0'),在十六進制前面顯示'0x'或者'0X'(取決於用的是'x'仍是'X')

0 顯示的數字前面填充‘0’而不是默認的空格
% '%%'輸出一個單一的'%'
(var) 映射變量(字典參數)
m.n m 是顯示的最小總寬度,n 是小數點後的位數(若是可用的話)

Template 對象有兩個方法,substitute()和safe_substitute()。前者更爲嚴謹,在key 缺乏的狀況下它會報一
個KeyError 的異常出來,然後者在缺乏key 時,直接原封不動的把字符串顯示出來。

原始字符串操做符(r/R):在原始字符串裏,全部的字符都是直接按照字面的意思來使用,沒有轉義特殊或不能打印的字符。正則表達式是一些定義了高級搜索匹配方式的字符串,一般是由表明字符,分組、匹配信息、變量名、和字符類等的特殊符號組成。這個'r'能夠是小寫也能夠是大寫,惟一的要求是必須緊靠在第一個引號前。

Unicode字符串操做符(u/U):把標準字符串或者是包含Unicode 字符的字符串轉換成徹底地Unicode 字符串對象。Unicode 操做符必須出如今原始字符串操做符前面

5.內建函數

cmp():同比較操做符同樣,內建的cmp()函數也根據字符串的ASCII 碼值進行比較。

len():內建函數len()返回字符串的字符數。

max() and min(): 對於string 類型它們能很好地運行,返回最大或者最小的字符,(按照ASCII 碼值排列)。

enumerate():>>> s = 'foobar'

>>> for i, t in enumerate(s):
... print i, t
...
0 f
1 o
2 o
3 b
4 a
5 r

zip():>>> s, t = 'foa', 'obr'

>>> zip(s, t)
[('f', 'o'), ('o', 'b'), ('a', 'r')]

raw_input():內建的raw_input()函數使用給定字符串提示用戶輸入並將這個輸入返回。

str() and unicode():str()和unicode()函數都是工廠函數,就是說產生所對應的類型的對象。它們接受一個任意類型的對象,而後建立該對象的可打印的或者Unicode 的字符串表示。它們和basestring 均可以做爲參數傳給isinstance()函數來判斷一個對象的類型。

chr(),unichr(), and ord():chr()函數用一個範圍在range(256)內的(就是0 到255)整數作參數,返回一個對應的字符。unichr()跟它同樣,只不過返回的是Unicode 字符,ord()函數是chr()函數(對於8 位的ASCII 字符串)或unichr()函數(對於Unicode 對象)的配對函數,它以一個字符(長度爲1 的字符串)做爲參數,返回對應的ASCII 數值,或者Unicode數值,若是所給的Unicode 字符超出了你的Python 定義範圍,則會引起一個TypeError 的異常。

6.字符串內建函數

字符串類型內建方法
方法 描述
string.capitalize() 把字符串的第一個字符大寫
string.center(width)

返回一個原字符串居中,並使用空格填充至長度width 的新字符串

string.count(str, beg=0,
end=len(string))

返回str 在string 裏面出現的次數,若是beg 或者end 指定則返回指定範圍內str 出現的次數

string.decode(encoding='UTF-8',errors='strict')

以encoding 指定的編碼格式解碼string,若是出錯默認報一個ValueError 的異常, 除非errors 指定的是'ignore' 或者'replace'

string.encode(encoding='UTF-8',errors='strict')

以encoding 指定的編碼格式編碼string,若是出錯默認報一個
ValueError 的異常,除非errors 指定的是'ignore'或者'replace'

string.endswith(obj, beg=0,
end=len(string))

檢查字符串是否以obj 結束,若是beg 或者end 指定則檢查指
定的範圍內是否以obj 結束,若是是,返回True,不然返回False.

string.expandtabs(tabsize=8)

把字符串string 中的tab 符號轉爲空格,默認的空格數tabsize 是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 中會報一個異常.
string.isalnum()

R 若是string 至少有一個字符而且全部字符都是字母或數字則返回True,不然返回False

string.isalpha()

若是string 至少有一個字符而且全部字符都是字母則返回True,
不然返回False

string.isdecimal() 若是string 只包含十進制數字則返回True 不然返回False.
string.isdigit() 若是string 只包含數字則返回True 不然返回False.
string.islower()

若是string 中包含至少一個區分大小寫的字符,而且全部這些(區分
大小寫的)字符都是小寫,則返回True,不然返回False

string.isnumeric() 若是string 中只包含數字字符,則返回True,不然返回False
string.isspace() 若是string 中只包含空格,則返回True,不然返回False.
string.istitle() 若是string 是標題化的(見title())則返回True,不然返回False
string.isupper()

若是string 中包含至少一個區分大小寫的字符,而且全部這些(區分
大小寫的)字符都是大寫,則返回True,不然返回False

string.join(seq)

Merges (concatenates)以string 做爲分隔符,將seq 中全部的元素
(的字符串表示)合併爲一個新的字符串

string.ljust(width) 返回一個原字符串左對齊,並使用空格填充至長度width 的新字符串
string.lower() 轉換string 中全部大寫字符爲小寫
string.lstrip() 截掉string 左邊的空格
string.partition(str)

有點像find()和split()的結合體,從str 出現的第一個位置起,把字符串string 分紅一個3 元素的元組(string_pre_str,str,string_post_str),若是string 中不包含str 則string_pre_str == string.

string.replace(str1, str2,
num=string.count(str1))

把string 中的str1 替換成str2,若是num 指定,則替換不超過num 次.

string.rfind(str, beg=0,end=len(string))

相似於find()函數,不過是從右邊開始查找.

string.rindex( str, beg=0,end=len(string)) 相似於index(),不過是從右邊開始.
string.rjust(width) 返回一個原字符串右對齊,並使用空格填充至長度width 的新字符串
string.rpartition(str) 相似於partition()函數,不過是從右邊開始查找.
string.rstrip() 刪除string 字符串末尾的空格.
string.split(str="", num=string.count(str))

以str 爲分隔符切片string,若是num有指定值,則僅分隔num 個子字符串

string.splitlines(num=string.count('\n'))

按照行分隔,返回一個包含各行做爲元素的列表,若是num 指定則僅切片num 個行.

string.startswith(obj, beg=0,end=len(string))

檢查字符串是不是以obj 開頭,是則返回True,不然返回False。若是beg 和end 指定值,則在指定範圍內檢查.

string.strip([obj]) 在string 上執行lstrip()和rstrip()
string.swapcase() 翻轉string 中的大小寫
string.title()

返回"標題化"的string,就是說全部單詞都是以大寫開始,其他字母均爲小寫(見istitle())

string.translate(str, del="")

根據str 給出的表(包含256 個字符)轉換string 的字符,
要過濾掉的字符放到del 參數中

string.upper() 轉換string 中的小寫字母爲大寫
string.zfill(width)

返回長度爲width 的字符串,原字符串string 右對齊,前面填充0

7. 字符串的獨特特性

除了一般用的特殊字符,好比換行符(\n),tab 符(\t)以外,也能夠直接用ASCII 碼值來標示特殊字符:\000 或者\xXX,分別對應字符的八進制和十六進制ASCII 碼值。

反斜槓開頭的轉義字符
/X 八進制 十進制 十六進制 字符 說明
\0 000 0 0x00 NUL 空字符Nul
\a 007 7 0x07 BEL 響鈴字符
\b 010 8 0x08 BS 退格
\t 011 9 0x09 HT 橫向製表符
\n 012 10 0x0A LF 換行
\v 013 11 0x0B VT 縱向製表符
\f 014 12 0x0C FF 換頁
\r 015 13 0x0D CR 回車
\e 033 27 0x1B ESC 轉義
\" 042 34 0x22 " 雙引號
\' 047 39 0x27 ' 單引號
\\ 134 92 0x5C \ 反斜槓
\000 八進制值(範圍是000 到0177)
\xXX x 打頭的十六進制值(範圍是0x00 到0xFF)
\ 連字符,將本行和下一行的內容鏈接起來.

控制字符的一個做用是用作字符串裏面的定界符,在數據庫或者web 應用中,大多數的可打印字符都是被容許用在數據項裏面的,就是說可打印的字符不適合作定界符。一個一般的解決方案是,使用那些不常用的,不可打印的ASCII 碼值來做爲定界符,它們是很是完美的定界符,這樣一來諸如冒號這樣的可打印字符就能夠解脫出來用在數據項中了。

Python 的三引號容許一個字符串跨多行,字符串中能夠包含換行符、製表符以及其餘特殊字符。三引號的語法是一對連續的單引號或者雙引號(一般都是成對的用)。

8.Unicode

Unicode 術語
名詞 意思
ASCII 美國標準信息交換碼
BMP 基本多文種平面(第零平面)
BOM 字節順序標記(標識字節順序的字符)
CJK/CJKV 中文-日文-韓文(和越南語)的縮寫
Code point

相似於ASCII 值,表明Unicode 字符的值,範圍在range(1114112)或者說0x000000 到0x10FFFF.

Octet 八位二進制數的位組
UCS 通用字符集
UCS2 UCS 的雙字節編碼方式(見UTF-16)
UCS4 UCS 的四字節編碼方式.
UTF Unicode 或者UCS 的轉換格式.
UTF-8 八位UTF 轉換格式(無符號字節序列, 長度爲一到四個字節)
UTF-16 16 位UTF 轉換格式(無符號字節序列,一般是16 位長[兩個字節],見UCS2)

在Unicode 以前,用的都是ASCII,ASCII 碼很是簡單,每一個英文字符都是以七位二進制數的方式存貯在計算機內,其範圍是32 到126。內建的str()函數和chr()函數並無升級成能夠處理Unicode。它們只能處理常規的ASCII 編碼字符串,若是一個Unicode 字符串被做做爲參數傳給了str()函數,它會首先被轉換成ASCII 字符串而後在交給str()函數。新的內建函數unicode()和unichar()能夠當作Unicode 版本的str()和chr().Unicode()函數能夠把任何Python 的數據類型轉換成一個Unicode 字符串,若是是對象,而且該對象定義了__unicode__()方法,它還能夠把該對象轉換成相應的Unicode 字符串。

codec 是COder/DECoder 的首字母組合,它定義了文本跟二進制值的轉換方式。

 只要你遵照如下的規則,處理Unicode 就是這麼簡單:

􀁺 程序中出現字符串時必定要加個前綴 u.

􀁺 不要用 str()函數,用unicode()代替.

􀁺 不要用過期的 string 模塊 -- 若是傳給它的是非ASCII 字符,它會把一切搞砸。

􀁺 不到必須時不要在你的程序裏面編解碼 Unicod 字符。只在你要寫入文件或數據庫或者網絡時,才調用encode()函數;相應地,只在你須要把數據讀回來的時候才調用decode()函數。

Python 標準庫裏面的絕大部分模塊都是兼容Unicode 的.除了pickle 模塊!pickle 模塊只支持ASCII 字符串。

爲了支持Unicode,你必須確保如下方面對Unicode 的支持:
􀁺 數據庫服務器(MySQL,PostgreSQL,SQL Server,等等)
􀁺 數據庫適配器(MySQLdb 等等)
􀁺 Web 開發框架(mod_python,cgi,Zope,Plane,Django 等等)

例如:說MySQLdb,它並非默認就支持Unicode 模式,你必須在connect()方法裏面用一個特殊的關鍵字use_unicode來確保你獲得的查詢結果是Unicode 字符串。mod_python 裏面開啓對Unicode 的支持至關簡單,只要在request 對象裏面把text-encoding 一項設成"utf-8"就好了,剩下的mod_python 都會替你完成,Zope 等其餘複雜的系統可能須要更多的工做來支持Unicode。

現實教訓總結:使應用程序徹底支持Unicode,兼容其餘的語言自己就是一個工程。

Python 的 Unicode支持

內建函數unicode()函數,它接受一個string 作參數,返回一個Unicode 字符串;

內建的decode()/encode()方法,decode()和encode()內建函數接受一個字符串作參數返回該字符串對應的解碼後/編碼後的字符串。decode()和encode()均可以應用於常規字符串和Unicode 字符串。decode()方法是在Python2.2 之後加入的;

Unicode 類型,Unicode 字符串對象是basestring 的子類、用Unicode()工廠方法或直接在字符串前面加一個u 或者U 來建立實例。支持Unicode 原始字符串,只要在你的字符串前面加一個ur 或者UR就能夠了;

強制類型轉換,混合類型字符串操做須要把普通字符串轉換成Unicode 對象;

異常,UnicodeError 異常是在exceptions 模塊中定義的,ValueError 的子類.全部關於Unicode編解碼的異常都要繼承自UnicodeError。

經常使用Unicode 編輯碼
編碼 描述
utf-8 變量長度爲8 的編碼(默認編碼)
utf-16 變量長度爲16 的編碼(大/小端)
utf-16-le 小端UTF-16 編碼
utf-16-be 大端UTF-16 編碼
ascii 7-bit 7 位ASCII 碼錶
iso-8859-1 ISO 8859-1 (Latin-1) 碼錶
unicode-escape (定義見Python Unicode 構造函數)
raw-unicode-escape (定義見Python Unicode 構造函數)
native Python 用的內部格式

字符串格式化操做符:對於Python 的格式化字符串的操做符,%s 把Python 字符串中的Unicode 對象執行了str(u)操做,因此,輸出的應該是u.encode(默認編碼)。若是格式化字符串是Unicode 對象,全部的參數都將首先強制轉換成Unicode 而後根據對應的格式串一塊兒進行格式轉換。數字首先被轉換成普通字符串, 而後在轉換成Unicode。Python 字符串經過默認編碼格式轉化成Unicode。Unicode 對象不變,全部其餘格式字符串都須要像上面這樣轉化,如u"%s %s" % (u"abc", "abc")   u"abc abc"。

9.相關模塊

與字符串類型有關的模塊
模塊 描述
string 字符串操做相關函數和工具,好比Template 類.
re 正則表達式:強大的字符串模式匹配模塊
struct 字符串和二進制之間的轉換
c/StringIO 字符串緩衝對象,操做方法相似於file 對象.
base64 Base 16,32,64 數據編解碼
codecs 解碼器註冊和基類
crypt 進行單方面加密
difflib 找出序列間的不一樣
hashlib 多種不一樣安全哈希算法和信息摘要算法的API
hma HMAC 信息鑑權算法的Python 實現
md5 RSA 的MD5 信息摘要鑑權
rotor 提供多平臺的加解密服務
sha NIAT 的安全哈希算法SHA
stringprep 提供用於IP 協議的Unicode 字符串
textwrap 文本打包和填充
unicodedata Unicode 數據庫

核心模塊: re
正則表達式(RE)提供了高級的字符串模式匹配方案。經過描述這些模式的語法,你能夠像使用「過濾器」同樣高效地查找傳進來的文本。這些過濾器容許你基於自定義的模式字符串抽取匹配模式、執行查找-替換或分割字符串。該模塊中包含的關鍵函數有:compile() - 將一個RE 表達式編譯成一個可重用的RE 對象;match() - 試圖從字符串的開始匹配一個模式;search() - 找出字符串中全部匹配的項,sub() - 進行查找替換操做。其中的一些函數返回匹配到的對象,你能夠經過組匹配來訪問(若是找到的話)。

10.字符串關鍵點總結

能夠把字符串當作是Python 的一種數據類型,在Python 單引號或者雙引號之間的字符數組或者是連續的字符集合.在Python 中最經常使用兩個引號是單引號(')和雙引號(")。字符串的實際內容是這些單引號(')或者雙引號(")之間的字符,不包括引號自己.能夠用兩種引號來建立字符串是頗有益處的,由於是當你的字符串中包含單引號時,若是用單引號建立字符串,那麼字符串中的雙引號就不須要轉義。反之亦然.

字符串是字符存儲操做的最基本單位,字符應該視爲長度爲1 的字符串。字符串格式化操做符 ( % )提供相似於printf()那樣的功能。

三引號字符串是用兩邊各三個單引號(''')或者兩邊各三個雙引號(""")來定義的。

11.列表

列表不只能夠包含Python 的標準類型,並且能夠用用戶定義的對象做爲本身的元素.列表能夠包含不一樣類型的對象,並且要比C 或者Python 本身的數組類型(包含在array 擴展包中)都要靈活.由於數組類型全部的元素只能是一種類型.列表能夠執行pop,empt,sort,reverse 等操做.列表也能夠添加或者減小元素.還能夠跟其餘的列表結合或者把一個列表分紅幾個.能夠對單獨一個元素或者多個元素執行insert,update,或者remove 操做.

建立一個列表就像給一個變量賦值同樣的簡單.你手工寫一個列表(空的或者有值的都行)而後賦給一個變量,列表是由方括號([])來定義的,固然,你也能夠用工廠方法來建立它。列表的切片操做就像字符串中同樣;切片操做符([])和索引值或索引值範圍一塊兒使用;能夠經過在等號的左邊指定一個索引或者索引範圍的方式來更新一個或幾個元素,你也能夠用append()方法來追加元素到列表中去;要刪除列表中的元素,若是你確切的知道要刪除元素的索引能夠用del 語句,不然能夠用remove(列表元素)方法;還能夠經過pop()方法來刪除並從列表中返回一個特定對象。若刪除一整個列表,你能夠用del 語句:del 列表名。

12.操做符

比較列表時也是用的內建的cmp()函數,基本的比較邏輯是這樣的:兩個列表的元素分別比較,直到有一方的元素勝出。列表的切片操做也聽從正負索引規則,也有開始索引值,結束索引值,若是這兩個值爲空,默認也會分別指到序列的開始和結束位置。

若是你想以子列表的形式獲得一個列表中的一個切片,那須要確保在賦值時等號的左邊也是一個列表而不是一個列表的元素。

鏈接操做符容許咱們把多個列表對象合併在一塊兒.注意,列表類型的鏈接操做也只能在同類型之間進行,換句話說,你不能把兩個不一樣類型的對象鏈接在一塊兒,即使他們都是序列類型也不行。

從Python1.5.2 起,咱們能夠用extend()方法來代替鏈接操做符把一個列表的內容添加到另外一箇中去.使用extend()方法比鏈接操做的一個優勢是它其實是把新列表添加到了原有的列表裏面,而不是像鏈接操做那樣新建一個列表。list.extend()方法也被用來作複合賦值運算,也就是Python2.0 中添加的替換鏈接操做(+=)。

13.內建函數

對兩個列表的元素進行比較:

1. 若是比較的元素是同類型的,則比較其值,返回結果。

2. 若是兩個元素不是同一種類型,則檢查它們是不是數字。

    a. 若是是數字,執行必要的數字強制類型轉換,而後比較。
  b. 若是有一方的元素是數字,則另外一方的元素"大"(數字是"最小的")
  c. 不然,經過類型名字的字母順序進行比較。
3. 若是有一個列表首先到達末尾,則另外一個長一點的列表"大"。
4. 若是咱們用盡了兩個列表的元素並且全部元素都是相等的,那麼結果就是個平局,就是說返回一個0。

對字符串來講len()返回字符串的長度,就是字符串包含的字符個數。對列表或者元組來講,它會像你想像的那樣返回列表或者元組的元素個數,容器裏面的每一個對象被做爲一個項來處理。

max()和min()函數在字符串操做裏面用處不大,由於它們能對字符串作的只能是找出字符串中"最大"和"最小"的字符(按詞典序),而對列表和元組來講,它們被定義了更多的用處.好比對只包含數字和字符串對象的列表,max()和min()函數就很是有用,重申一遍,混合對象的結構越複雜返回的結構準確性就越差.然而,在有些狀況下(雖然不多),這樣的操做能夠返回你須要的結果。

sorted() and reversed(),初學者使用字符串,應該注意是如何把單引號和雙引號的使用矛盾和諧掉.同時還要注意字符串排序使用的是字典序,而不是字母序(字母'T'的ASCII 碼值要比字母'a'的還要靠前)。

enumerate() and zip(),sum()

list() and tuple(),list()函數和tuple()函數接受可迭代對象(好比另外一個序列)做爲參數,並經過淺拷貝數據來建立一個新的列表或者元組.雖然字符串也是序列類型的,可是它們並非常常用於list()和tuple(). 更多的狀況下,它們用於在兩種類型之間進行轉換,好比你須要把一個已有的元組轉成列表類型的(而後你就能夠修改它的元素了),或者相反。

若是你不考慮range()函數的話,Python 中沒有特定用於列表的內建函數.range()函數接受一個數值做爲輸入,輸出一個符合標準的列表.

14.列表類型的內建函數

用點號的方式訪問對象的屬性:object.attribute.列表的方法也是這樣:list.method().咱們用點號來訪問一個對象的屬性(在這裏是一個函數),而後用函數操做符( () )來調用這個方法。能夠在一個列表對象上應用dir()方法來獲得它全部的方法和屬性。

列表類型內建函數
List Method Operation
list.append(obj) 向列表中添加一個對象obj
list.count(obj) 返回一個對象obj 在列表中出現的次數
list.extend(seq) 把序列seq 的內容添加到列表中
list.index(obj,i=0,j=len(list))

返回list[k] == obj 的k 值,而且k 的範圍在 i<=k<j;不然
引起ValueError 異常.

list.insert(index,obj) 在索引量爲index 的位置插入對象obj.
list.pop(index=-1) 刪除並返回指定位置的對象,默認是最後一個對象
list.remove(obj) 從列表中刪除對象obj
list.reverse() 原地翻轉列表
list.sort(func=None,key=None,reverse=False)

以指定的方式排序列表中的成員,若是func 和key 參數指定,
則按照指定的方式比較各個元素,若是reverse 標誌被置爲
True,則列表以反序排列.

核心筆記:那些能夠改變對象值的可變對象的方法是沒有返回值的!

15.列表的特殊特性

堆棧:堆棧是一個後進先出(LIFO)的數據結構。

隊列:隊列是一種先進先出(FIFO)的數據類型,它的工做原理相似於超市中排隊交錢或者銀行裏面的排隊,隊列裏的第一我的首先接受服務(滿心想第一個出去).新的元素經過"入隊"的方式添加進隊列的末尾,"出隊"就是從隊列的頭部刪除.

16.元組

實際上元組是跟列表很是相近的另外一種容器類型.元組和列表看起來不一樣的一點是元組用的是圓括號而列表用的是方括號。而功能上,元組和列表相比有一個很重要的區別,元組是一種不可變類型.另外當處理一組對象時,這個組默認是元組類型.

建立一個元組並給他賦值實際上跟建立一個列表並給它賦值徹底同樣,除了一點,只有一個元素的元組須要在元組分割符裏面加一個逗號(,)用以防止跟普通的分組操做符混淆.不要忘了它是一個工廠方法!元組的切片操做跟列表同樣,用方括號做爲切片操符([]),裏面寫上索引值或者索引範圍.跟數字和字符串同樣,元組也是不可變類型,就是說你不能更新或者改變元組的元素,經過現有字符串的片斷再構造一個新字符串的方式解決的,對元組一樣須要這樣.

刪除一個單獨的元組元素是不可能的,固然,把不須要的元素丟棄後, 從新組成一個元組是沒有問題的.要顯示地刪除一整個元組,只要用del 語句減小對象引用計數.當這個引用計數達到0 的時候,該對象就會被析構.記住,大多數時候,咱們不須要顯式的用del 刪除一個對象,一出它的做用域它就會被析構,Python 編程裏面用到顯式刪除元組的狀況很是之少.del aTuple

17.元組操做符和內建函數

元組的對象和序列類型操做符還有內建函數跟列表的徹底同樣.你仍然能夠對元組進行切片操做,合併操做,以及屢次拷貝一個元組,還能夠檢查一個對象是否屬於一個元組,進行元組之間的比較等.

18.元組的特殊特性

由於元組是容器對象,不少時候你想改變的只是這個容器中的一個或者多個元素,不幸的是這是不可能的,切片操做符不能用做左值進行賦值。這和字符串沒什麼不一樣,切片操做只能用於只讀的操做。若是咱們操做從一個函數返回的元組,能夠經過內建list()函數把它轉換成一個列表.雖然元組對象自己是不可變的,但這並不意味着元組包含的可變對象也不可變了。

元組可使用鏈接操做、重複操做,全部的多對象的,逗號分隔的,沒有明確用符號定義的,好比說像用方括號表示列表和用圓括號表示元組同樣,等等這些集合默認的類型都是元組。全部函數返回的多對象(不包括有符號封裝的)都是元組類型。注意,有符號封裝的多對象集合實際上是返回的一個單一的容器對象。

建立一個只有一個元素的元組?在元組上試驗,你都不能獲得想要的結果。由於圓括號被重載了,它也被用做分組操做符。由圓括號包裹的一個單一元素首先被做爲分組操做,而不是做爲元組的分界符。一個變通的方法是在第一個元素後面添一個逗號(,)來代表這是一個元組而不是在作分組操做.

核心筆記:列表 VS 元組,最好使用不可變類型變量的一個狀況是,若是你在維護一些敏感的數據,而且須要把這些數據傳遞給一個並不瞭解的函數(或許是一個根本不是你寫的API),做爲一個只負責一個軟件某一部分的工程師,若是你確信你的數據不會被調用的函數篡改,你會以爲安全了許多。一個須要可變類型參數的例子是,若是你在管理動態數據集合時。你須要先把它們建立出來,逐漸地或者不按期的添加它們,或者有時還要移除一些單個的元素。這是一個必須使用可變類型對象的典型例子。幸運的是,經過內建的list()和tuple()轉換函數,你能夠很是輕鬆的在二者之間進行轉換.list()和tuple()函數容許你用一個列表來建立一個元組,反之亦然.若是你有一個元組變量,但你須要一個列表變量由於你要更新一下它的對象,這時list()函數就是你最好的幫手.若是你有一個列表變量,而且想把它傳遞給一個函數,或許一個API,而你又不想讓任何人弄亂你的數據,這時tuple()函數就很是有用。

19.相關模塊

與序列類型相關的模塊
模塊 內容
數組 一種受限制的可變序列類型,要求全部的元素必須都是相同的類型。
copy 提供淺拷貝和深拷貝的能力
operator

包含函數調用形式的序列操做符,好比operator.concat(m,n)就至關於鏈接操做(m+n)。

re Perl 風格的正則表達式查找(和匹配)

StringIO/cStringIO

把長字符串做爲文件來操做,好比read(),seek()函數等,C 版的更快一些,可是它不能被繼承.

Textwrap 用做包裹/填充文本的函數,也有一個類
types 包含Python 支持的全部類型
collections 高性能容器數據類型

operator 模塊除了提供與數字操做符相同的功能外,還提供了與序列類型操做符相同的功能.types 模塊是表明python 支持的所有類型的type 對象的引用。最後,UserList 模塊包含了list 對象的徹底的類實現。由於Python 類型不能做爲子類,因此這個模塊容許用戶得到相似list 的類,也能夠派生出新的類或功能。

20.拷貝Python對象(淺拷貝和深拷貝)

淺拷貝:對一個對象進行淺拷貝實際上是新建立了一個類型跟原對象同樣,其內容是原來對象元素的引用,換句話說,這個拷貝的對象自己是新的,可是它的內容不是.

深拷貝:建立一個新的容器對象,包含原有對象元素(引用)全新拷貝的引用--須要copy.deepcopy()函數(需先導入copy模塊)。

序列類型對象的淺拷貝是默認類型拷貝,並能夠如下幾種方式實施:

(1)徹底切片操做[:],

(2)利用工廠函數,好比list(),dict()等,

(3)使用copy 模塊的copy 函數.

拷貝操做的警告:第一,非容器類型(好比數字,字符串和其餘"原子"類型的對象,像代碼,類型和xrange 對象等)沒有被拷貝一說,淺拷貝是用徹底切片操做來完成的.第二,若是元組變量只包含原子類型對象,對它的深拷貝將不會進行.

核心模塊: copy,淺拷貝和深拷貝操做均可以在copy 模塊中找到.其實copy 模塊中只有兩個函數可用:copy()進行淺拷貝操做,而deepcopy()進行深拷貝操做.

21.序列類型小結

 

相關文章
相關標籤/搜索