Python序列:字符串,列表和元組(一)

Python序列

Python中有一些類型,它們的 成員有序排列,可以通過下標來訪問,這種類型統一被稱爲序列,包括列表,字符串,數組。其中字符串和元組屬於不可變類型,即無法通過下標來賦值。如a[0]=’1’,而列表屬於可變類型,可以通過下標來賦值。這篇帖子主要講字符串,列表和元組在後面的帖子再講。

1 序列

序列類型有着相同的訪問模式:它的每一個元素可以通過指定一個偏移量的方式得到。而多個元素可以通過切片操作的方式一次得到。

1.1 標準類型操作符

Python中的標準類型操作符,即算術操作符、比較操作符、邏輯操作符,可以用作序列類型。

1.2 序列類型操作符

Python中對序列都適用的操作符,有:

成員關係操作符: in, not in
obj in seq,判斷obj是否在seq中

鏈接操作符: +
把一個序列和另一個相同類型的序列做連接
seq1 + seq2

重複操作符: *

seq * int_num

可以獲得一個序列的拷貝

>>> a
['2', '2']
>>> a*2
['2', '2', '2', '2']

切片操作符: [],[:],[::]

用索引來獲取序列類型的某個元素,或者指定開始或者結束元素,用來獲取一段連續的元素。

1.3 內建函數

內建函數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])

等等,後面會提到。

2 字符串

Python裏,用單引號或者雙引號來表示一個字符串,可以用索引來訪問每一個元素,包括切片。
刪除字符串:可以通過給字符賦值空值或者用del關鍵字

>>> a = 'asdf'
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

>>> a = 'asdfasdf'
>>> a = ''
>>> a
''

看來賦空值還沒法刪除a

在字符串中,沒法用a[0]=’s’這類方法給字符串賦值,因爲字符串,元組,數值類型都是不可更新類型,如果想要改變某個字符串的值,就必須通過創建一個新串來實現。比如,可以通過切片技術來獲取一個新串。

3 字符串和操作符

3.1 標準類型操作符

鏈接+,成員操作符(in , not in )很簡單了,不用說了。

普通字符串轉化爲 Unicode 字符串:
如果把一個普通字符串和一個 Unicode 字符串做連接處理,Python 會在連接操作前先把普通字符串轉化爲 Unicode 字符串:

>>> a = '1'
>>> a
'1'
>>> a = a + u'2'
>>> a
u'12'

4 只適用於字符串的操作符

4.4.1 格式化操作符(%)

>>> "%+d"
'%+d'
>>> "%+d" % 4
'+4'
>>> "%+d" % 10
'+10'
>>> "%+d" % -10\
... 
'-10'
>>> "%+d" % -10
'-10'
>>> repr(1)
'1'
>>> repr('a')
"'a'"
>>> `a`
"u'12'"

更多的就不寫了,還有很多用法,網上有。

4.4.2 字符串模板

>>> from string import Template
>>> s = Template('There are ${howmany} ${lang} Quotation Symbols')
>>>
>>> print s.substitute(lang='Python', howmany=3) There are 3 Python Quotation
Symbols
>>>
>>> print s.substitute(lang='Python') Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/local/lib/python2.4/string.py", line 172, in substitute
return self.pattern.sub(convert, self.template)
File "/usr/local/lib/python2.4/string.py", line 162, in convert val =
mapping[named]
KeyError: 'howmany'
>>>
>>> print s.safe_substitute(lang='Python') There are ${howmany} Python Quotation
Symbols

4.4.3 原始字符串操作符

有時候,我們不像讓字符串裏的轉義字符發生作用,我們可以使用r/R來讓字符串變爲原始字符串,這樣就不會解釋轉義字符了。使用小寫r或者大寫R都可以。如下的例子:

>>> a = '\nasdkfjsad\t'
>>> print a

asdkfjsad   
>>> a = r'\nasdkfjsad\t'
>>> print a
\nasdkfjsad\t

4.4.4 unicode字符串操作符

和上面的原始字符操作符用法基本一樣,如下例子:

>>> a = 'asdf'
>>> a = u'asdf'
>>> a
u'asdf'

5 內建函數

5.1 標準類型函數

cmp()

>>> str1 = 'abc'
>>> str2 = 'lmn'
>>> str3 = 'xyz'
>>> cmp(str1, str2)
-11
>>> cmp(str3, str1)
23
>>> cmp(str2, 'lmn')
0

5.2 序列類型函數

這類函數,會舉一些小例子:

len()

>>> a
u'asdf'
>>> len(a)
4

max() and min()

>>> a
u'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 a
1 s
2 d
3 f

zip()

>>> 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列表,把所有參數的第一個元組組成一個元組存儲到列表裏,再把所有參數的第二個元素都存儲在一個元組裏,然後再存儲到列表裏,依次下去,直到其中有一個參數沒有元素爲止。

6 字符串內建函數

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 個子字符串

別的函數就不列舉了。這幾個對我來說很常用。

Unicode

從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編碼很受歡迎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章