Python中有一些類型,它們的 成員有序排列,可以通過下標來訪問,這種類型統一被稱為序列,包括列表,字符串,數組。其中字符串和元組屬于不可變類型,即無法通過下標來賦值。如a[0]=’1’,而列表屬于可變類型,可以通過下標來賦值。這篇帖子主要講字符串,列表和元組在后面的帖子再講。
序列類型有著相同的訪問模式:它的每一個元素可以通過指定一個偏移量的方式得到。而多個元素可以通過切片操作的方式一次得到。
Python中的標準類型操作符,即算術操作符、比較操作符、邏輯操作符,可以用作序列類型。
Python中對序列都適用的操作符,有:
成員關系操作符: in, not in obj in seq,判斷obj是否在seq中
鏈接操作符: + 把一個序列和另一個相同類型的序列做連接 seq1 + seq2
重復操作符: *
seq * int_num
可以獲得一個序列的拷貝
>>> a['2', '2']>>> a*2['2', '2', '2', '2']切片操作符: [],[:],[::]
用索引來獲取序列類型的某個元素,或者指定開始或者結束元素,用來獲取一段連續的元素。
內建函數list(), str(),和tuple()被用做在各種序列類型之間轉換。你可以把它們理解成其它語言的類型轉換,但是不是真正的類型轉換,因為會將元素值的索引賦值給新創建的元素,也就是說,list()等函數返回值的元素地址,和list()傳入參數的返回值地址相同,即使是不同類型之間的轉換(淺拷貝)!比如:
>>> a['2', '2']>>> b = str(b)>>> b"['2', '2']">>> id(a[0])139874793120072>>> id(b[2])139874793120072可以看到a中的元素第一個2和b中元素的第一個2,內存地址相同!
還有一些可操作函數: enumerate(iter) len(seq) max(iter,key=None) min(iter, key=None) reversed(seq) sorted(iter, func=None, key=None, reverse=False) sum(seq, init=0) zip([it0, it1,… itN])
等等,后面會提到。
Python里,用單引號或者雙引號來表示一個字符串,可以用索引來訪問每一個元素,包括切片。 刪除字符串:可以通過給字符賦值空值或者用del關鍵字
>>> a = 'asdf'>>> del a>>> aTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'a' is not defined>>> a = 'asdfasdf'>>> a = ''>>> a''看來賦空值還沒法刪除a
在字符串中,沒法用a[0]=’s’這類方法給字符串賦值,因為字符串,元組,數值類型都是不可更新類型,如果想要改變某個字符串的值,就必須通過創建一個新串來實現。比如,可以通過切片技術來獲取一個新串。
鏈接+,成員操作符(in , not in )很簡單了,不用說了。
普通字符串轉化為 Unicode 字符串: 如果把一個普通字符串和一個 Unicode 字符串做連接處理,Python 會在連接操作前先把普通字符串轉化為 Unicode 字符串:
>>> a = '1'>>> a'1'>>> a = a + u'2'>>> au'12'有時候,我們不像讓字符串里的轉義字符發生作用,我們可以使用r/R來讓字符串變為原始字符串,這樣就不會解釋轉義字符了。使用小寫r或者大寫R都可以。如下的例子:
>>> a = '/nasdkfjsad/t'>>> print aasdkfjsad >>> a = r'/nasdkfjsad/t'>>> print a/nasdkfjsad/t和上面的原始字符操作符用法基本一樣,如下例子:
>>> a = 'asdf'>>> a = u'asdf'>>> au'asdf'cmp()
>>> str1 = 'abc'>>> str2 = 'lmn'>>> str3 = 'xyz'>>> cmp(str1, str2)-11>>> cmp(str3, str1)23>>> cmp(str2, 'lmn')0這類函數,會舉一些小例子:
len()
>>> au'asdf'>>> len(a)4max() and min()
>>> au'asdf'>>> len(a)4>>> max(a)u's'>>> min(a)u'a'顯然,max和min函數是返回字符串中ascii值最大的和最小的元素
enumerate()
>>> a = 'asdf'>>> for i , j in enumerate(a):... print i ,j... 0 a1 s2 d3 fzip()
>>> zip('123', 'abc')[('1', 'a'), ('2', 'b'), ('3', 'c')]>>> a = zip('123', 'abc')>>> type(a)<type 'list'>>>> a = zip('1234', 'abc')>>> a[('1', 'a'), ('2', 'b'), ('3', 'c')]>>> a = zip('12', 'abc')>>> a[('1', 'a'), ('2', 'b')]>>> a = zip('123', 'ac')>>> a>>>> a = zip('123', 'ac', 'cvb')>>> a[('1', 'a'), ('2', 'c')][('1', 'a', 'c'), ('2', 'c', 'v')]>>> a = zip('123', 'ac', 'cvbfff')>>> a[('1', 'a', 'c'), ('2', 'c', 'v')]可以看出,zip返回一個list列表,把所有參數的第一個元組組成一個元組存儲到列表里,再把所有參數的第二個元素都存儲在一個元組里,然后再存儲到列表里,依次下去,直到其中有一個參數沒有元素為止。
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.count(str, beg=0,end=len(string)) 返回 str 在 string 里面出現的次數,如果 beg 或者 end 指定則 返回指定范圍內 str 出現的次數
string.join(seq) Merges (concatenates)以 string 作為分隔符,將 seq 中所有的元素 (的字符串表示)合并為一個新的字符串
>>> a = ['a', 'b', 'c']>>> " ".join(a)'a b c'>>> a = ('a', 'b', 'c')>>> " ".join(a)'a b c'>>> " ".join('abc')'a b c'如上所示:元組,列表,字符串都可以當做參數,但是只能是元素只能是字符串,不能傳入如[1, 2, 3]這種的列表,因為不接受整數。
string.lstrip() 截掉 string 左邊的空格 string.rstrip() 刪除 string 字符串末尾的空格. string.strip([obj])在 string 上執行 lstrip()和 rstrip() string.split(str=”“, num=string.count(str)) 以 str 為分隔符切片 string,如果 num有指定值,則僅分隔 num 個子字符串
別的函數就不列舉了。這幾個對我來說很常用。
從Python1.6起就開始引進對于字符串的支持,是用來在多種雙字節字符的格式、編碼進行轉換的,其中包括一些對這類字符串的操作管理功能。
unicode術語:
ASCII:美國標準信息交換碼 Code point:類似于 ASCII 值,代表 Unicode 字符的值,范圍在 range(1114112)或者說0x000000 到 0x10FFFF. UTF:Unicode 或者 UCS 的轉換格式. UTF-8:八位 UTF 轉換格式(無符號字節序列, 長度為一到四個字節) UTF-16:16 位 UTF 轉換格式(無符號字節序列,通常是 16 位長[兩個字節],見 UCS2)
UTF-8是unicode編碼的其中一種,ASCII在UTF-8編碼中,其值和ASCII一樣,所以,UTF-8編碼很受歡迎。
新聞熱點
疑難解答