Python的資料通路模型:直接存取 ,序列 ,映射
對非容器類都可以直接存取,所有的數值類型歸為此類。
序列類型是指容器内的元素從0開始的索引順序通路,一次可以通路一個或者多個元素。 字元串清單元組歸到次類
映射類型和序列類型不同之處,它使用的索引和順序的數字偏移量不同,它的元素無序存放,通過唯一的key來通路。 字典就是這種類型。
下面要說的字元串(strings),清單(lists),元組(tuples),我們可以統稱為序列。
序列有着相同的通路模式:它的每一個元素都可以通過指定一個偏移量的方式得到,而要想一次得到多個元素,我們可以使用切片,下表偏移量從0開始,總元素數減1結束。
下面舉幾個例子,先看看什麼事字元串,清單,元組。
字元串:
>>> a = 'HelloPython!'
>>> a
'Hello Python!'
>>> b = "This is'Python'"
>>> b
"This is 'Python'"
>>> c = 'This is"Python"'
>>> c
'This is "Python"'
>>>
清單:
>>> a = [1, 2, 3, 4,5]
>>> a
[1, 2, 3, 4, 5]
>>> b = [1, 'a', 2.5,2+3j, "this is python list"]
>>> b
[1, 'a', 2.5, (2+3j), 'this is pythonlist']
>>>
元組:
>>> a = (1, 3, 5,7)
>>> a
(1, 3, 5, 7)
>>> a = ('a',2)
>>> a
('a', 2)
>>>
下面看一下序列通用的幾個操作符:
1 連接配接操作符(+) 這個操作符允許我們把一個序列和另一個相同的序列做連結。
Sequence1+sequence2 結果是包含兩個原序列内容的新序列。
>>> a = 'this is '
>>> b = 'Python'
>>> a+b
'this is Python'
>>>
2 重複操作符(*)
當你需要一個序列的多份拷貝時,重複操作符非常有用。
Sequence * copies_int
Copies_int必須為整型。
>>> a
'this is Python'
>>> a*3
'this is Pythonthis is Pythonthis isPython'
>>>
>>> b = [1, 2, 3]
>>> b*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>>
3 切片操作符 [ ] [:] [: : ]
切片操作符應該是由最簡單的取單個元素的操作擴充而來的。通常sequence[n]代表取出序列中第n+1個元素(因為元素下标從0開始)
>>> a = 'Python'
>>> a[2]
't'
>>> b = [1, 2, 3,4]
>>> b[2]
3
>>> c = (1, 2, 3)
>>> c[2]
3
>>>
當中括号裡面有個:的時候,代表冒号兩邊的數字規定了兩個位置,我們把處于這個位置之中的所有元素取了出來。如果冒号兩邊什麼都沒有,代表取出所有元素,如果兩邊有數,例如sequence[m:n]就是代表取出從下标為m的元素到下标為n-1的所有元素。如果中括号裡兩個冒号,那麼兩個冒号後面的數代表步長,就是隔幾個元素取一次。下面一字元串為例詳細說明。(其他的序列操作類似)
>>> a = 'Python'
>>> a[1]
'y'
>>> a[:]
'Python'
>>> a[1:4]
'yth'
>>> a ='10001000100010001'
>>> a[0:17:4]
'11111'
>>>
另外切片支援負數操作。比如
>>> a = 'Python'
>>> a[-1]
'n'
>>> a[-2]
'o'
>>> a[-6]
'P'
>>>
由此我們就可以很随意的取元素了。但是注意一點,平時我們不加步長,是因為我們預設是順序取,并且步長為1,假如我們要倒着取,步長必須為負數才行,否則取的不正确。
>>> a = 'Python'
>>> a[-2:-4]
'' 這是錯誤的
>>> a[-4:-2]
'th'
>>> a[-2:-4:-1]
'oh'
>>> a[::-1]
'nohtyP'
>>>
4 成員操作符( in , not in )
>>> a = 'Python'
>>> 'p' in a
False
>>> 'y' in a
True
>>> b = [1, 2, 3,4]
>>> 1 in b
True
>>> 5 in b
False
>>>
序列的一些常用的公用函數:
1 len() 獲得序列的長度
>>> a = 'ddddddd'
>>> b = [1, 3, 4,4]
>>> c = (1,3,4,4)
>>> len(a)
7
>>> len(b)
4
>>> len(c)
4
>>>
得出一點結論,Python字元串和C字元串不同的地方,Python字元串不會以空字元結尾
2 max() and min() 獲得序列中最大和最小元素
>>> a = 'abcdefg'
>>> b = [1, 3, 5,8]
>>> c = (2, 5, 1,0)
>>> d =['a',3,45,9]
>>> max(a)
'g'
>>> max(d)
'a'
>>> min(b)
1
>>> min(c)
>>>
下面接着看看标準内建函數:
1 type(object) 接受一個對象作為參數,并傳回它的類型。
>>type(2)
>><type‘int’>
>>type(‘a’)
>><type‘str’>
2 cmp() 比較大小
>>> a = 4
>>> b = 8
>>> cmp(a,b)
-1
>>> cmp(b,a)
1
>>> a = 3
>>> b = 3
>>> cmp(a,b)
>>> a = 'lmn'
>>> b = 'abc'
>>> cmp(a,b)
1
>>>
3 str() 和repr()
>>> str(4.53-2j)
'(4.53-2j)'
>>> str(1)
'1'
>>> str([1, 3, 4,5])
'[1, 3, 4, 5]'
>>> repr([1, 3, 4,5])
'[1, 3, 4, 5]'
>>> '[1, 3, 4, 5]'
'[1, 3, 4, 5]'
>>>
-----------------------------------------------------------------------------------------------------------------------------
下面就看一看字元串,清單,元組各自常有的操作符和内建函數:
字元串
首先我覺得最重要的就是字元串的格式化輸出了”%”(Formatting)
>>> format ="Hello,%s,%s enough for ya?"
>>> values =('world','Hot')
>>> print format %values
Hello,world,Hot enough for ya?
>>>
%代表了要插入的位置,s代表了要插入的資料類型是str,因為這裡我們要插入兩個地方,是以我們用到了values這個元組。注意,格式化輸出要插入多個資料的時候,隻有元組和字典具有這個資格,不能使用清單,清單隻能代表一個資料。
>>> values =['world','Hot']
>>> print format %values
Hello,['world', 'Hot'] enough for ya?
>>>
>>> print 'you areNo.%s' % 1
you are No.1
如果給的資料不是str類型的,%s會自動用str()把它轉換為str類型
如果要格式化輸出一個控制精度的浮點數,可以如下:
>>> PI =3.1415926
>>> print "PI is%.3f" % PI
PI is 3.142
>>>
但是從上面可以看到,使用格式化操作符還是不友善的,因為經常要注意格式轉換的問題,%s格式系統會自動為我們轉換那些輸入不是str類型的資料,但是别的格式化輸出符,還是需要我們自己去轉化,如果要輸出的格式有好多種,用起來還是比較複雜的。
Template strings字元串模闆
字元串模闆使我們不用去管輸出傳遞的細節,而是像現在shell風格的腳本裡面使用符号“$”
>>> from stringimport Template
>>> s =Template("There are ${howmany} ${lang} Quotation Symbols")
>>> prints.substitute(,howmany=3)
There are 3 Python Quotation Symbols
>>>s.substitute(,howmany=3)
'There are 3 Python Quotation Symbols'
>>> prints.substitute()
Traceback (most recent call last):
File"<pyshell#50>", line 1, in<module>
prints.substitute()
File "C:\Python26\lib\string.py", line 170,in substitute
returnself.pattern.sub(convert, self.template)
File "C:\Python26\lib\string.py", line 160,in convert
val =mapping[named]
KeyError: 'howmany'
>>> prints.safe_substitute(,howmany=3)
There are 3 Python Quotation Symbols
>>> prints.safe_substitute(howmany=3)
There are 3 ${lang} Quotation Symbols
>>>
Template對象有兩個方法,substitute() 和safe_substitute()前者更為嚴謹,在key缺少的情況下會報錯KeyError,而後者在缺少Key時,直接安缺少的情況把字元串輸出顯示出來。
在這裡如果要輸出$符号,我們可以用$$
String Methods 字元串函數
1 find() 查找某個字元在字元串中是否存在,并傳回結果。找到傳回位置,沒有則傳回-1
>>> title = "MontyPython's Flying Circus"
>>>title.find("Monty")
>>>title.find('Python')
6
>>>title.find('Flying')
15
>>>title.find('Zirquss')
-1
>>>
Find也可以帶參數,來限制查找的範圍,比如:find(’a’,1,10)
就是查找字元’a’,查找範圍是從标号為1的元素開始到标号為9的元素截止(和切片類似)。
2 join()函數
>>> seq = ['1','2', '3', '4', '5']
>>> sep = '+'
>>>sep.join(seq)
'1+2+3+4+5'
>>> seq
['1', '2', '3', '4', '5']
>>>'+'.join(seq)
'1+2+3+4+5'
>>>'%'.join(seq)
'1%2%3%4%5'
>>>'#$%'.join(seq)
'1#$%2#$%3#$%4#$%5'
>>> dirs = '','usr','bin','env'
>>>'/'.join(dirs)
' /usr/bin/env'
>>> print'C:'+'\\'.join(dirs)
C: \usr\bin\env
>>>
3 lower()
>>> "TrindhermHammer Dance".lower()
'trindherm hammer dance'
>>>
4 replace() 替換
>>>"This is a test".replace('is','AAA')
'ThAAA AAA a test'
>>>
字元串的函數很多,而且參數也有變化,功能也多,這裡就不一一列舉了。
清單
清單也是序列式的資料類型,可以通過下标或者切片操作來通路一個或者多個元素。清單和字元串不同的地方在,字元串隻能由字元組成,而且不是可變的(不能單獨改變它的某個值),而清單則是儲存任何數目的Python對象的靈活的容器。
對清單的一些操作:
1 通路清單中的元素
>>>alist = [1, 2,3, 4]
>>>alist[1]
2
>>>
另外清單和其他序列一樣,也可以進行切片操作
2更新清單的元素,看下面的例子:
>>> str1 = "stringcan not be changed"
>>> str1[0]
's'
>>> str1[0]='S'
Traceback (most recent call last):
File"<pyshell#2>", line 1, in<module>
str1[0]='S'
TypeError: 'str' object does not support item assignment
>>> tuples1 = (1,2, 3, 4)
>>> tuples1[0]
1
>>> tuples1[0] =2
Traceback (most recent call last):
File"<pyshell#5>", line 1, in<module>
tuples1[0] = 2
TypeError: 'tuple' object does not support item assignment
>>> list1 = [1,'a', 3, 5]
>>> list1[1]
'a'
>>> list1[1] ='b'
>>> list1
[1, 'b', 3, 5]
>>>
可以看到,同樣作為序列的字元串和元組,值是不可改變的,我們可以改變的隻能是給他重新指派,然後以前的值會被銷毀。但是清單卻不同,清單可以對其裡面的任意元素做任意操作,改變,添加,删除等等。
3 del 删除操作:
>>> list1
[1, 'b', 3, 5]
>>> dellist1[0]
>>> list1
['b', 3, 5]
>>> del list1
>>> list1
Traceback (most recent call last):
File"<pyshell#17>", line 1, in<module>
list1
NameError: name 'list1' is not defined
>>>
Del既可以删除一個元素,也可以删除整個清單。
5 append 在清單結尾添加新元素:
>>> lst = [1, 2,3]
>>>lst.append(4)
>>> lst
[1, 2, 3, 4]
>>>
6 count 傳回該元素的個數
>>> lst = [1, 2, 2,3, 3, 3]
>>>lst.count(1)
1
>>>lst.count(2)
2
>>>lst.count(3)
3
>>>
6 extend 允許你一次把清單擴充多個元素
>>> a = [1, 2,3]
>>> b = [4, 5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
>>> a = [1, 2,3]
>>> b = [4, 5,6]
>>> a+b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]
>>>
可以看出和”+”操作還是不同的
7 index 傳回元素的位置
>>> ind =['Python', 'is', 'powerful']
>>>ind.index('is')
1
>>>
8 insert 插入一個元素
>>> numbers = [1,2, 3, 5, 6, 7]
>>>numbers.insert(3,'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
>>>
Insert 第一個參數表示要插入的位置,第二是要插入的内容。
9 pop 和 remove
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
>>>numbers.remove('four')
>>> numbers
[1, 2, 3, 5, 6, 7]
>>>
Remove類似于del
>>> numbers
[1, 2, 3, 5, 6, 7]
>>>numbers.pop()
7
>>> numbers
[1, 2, 3, 5, 6]
>>>numbers.pop(0)
1
>>> numbers
[2, 3, 5, 6]
>>>
Pop不帶參數,是把清單最後一個元素删除了,當然可以指定位置。
10 reverse 翻轉
>>> numbers
[2, 3, 5, 6]
>>>numbers.reverse()
>>> numbers
[6, 5, 3, 2]
>>>
10 排序sort()
>>> x = [4, 6, 1,7, 2, 5, 3]
>>> x.sort()
>>> x
[1, 2, 3, 4, 5, 6, 7]
>>> x =['abcdefg','ab','abcd','a','abc']
>>>x.sort(key=len)
>>> x
['a', 'ab', 'abc', 'abcd', 'abcdefg']
>>> x = [1, 2, 3,4, 5, 6]
>>>x.sort(reverse=True)
>>> x
[6, 5, 4, 3, 2, 1]
使用指令dir(list)可以列出清單的全部方法和屬性,這裡不一一舉例了。
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__','__delitem__', '__delslice__', '__doc__', '__eq__', '__format__','__ge__', '__getattribute__', '__getitem__', '__getslice__','__gt__', '__hash__', '__iadd__', '__imul__', '__init__','__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__','__new__', '__reduce__', '__reduce_ex__', '__repr__','__reversed__', '__rmul__', '__setattr__', '__setitem__','__setslice__', '__sizeof__', '__str__', '__subclasshook__','append', 'count', 'extend', 'index', 'insert', 'pop', 'remove','reverse', 'sort']
>>>
元組
元組是跟清單非常相近的另外一種容器類型,兩者重要不同點是:元組和字元串一樣,是一種不可變類型。
關于元組的建立,通路,切片等一些序列公有的操作這裡就不說了。
元組是不可改變的,也就說不能對元組的某一個元素進行改變,但是我們可以對整個元素進行重新指派,同樣能達到對元組進行改變的目的,比如:
>>> aTuple = (1,'a', 2, 'b', 'c')
>>> aTuple =aTuple[0],aTuple[2]
>>> aTuple
(1, 2)
>>>
下面是元組的一些操作:
>>> dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__','__doc__', '__eq__', '__format__', '__ge__', '__getattribute__','__getitem__', '__getnewargs__', '__getslice__', '__gt__','__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__','__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__','__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__','__subclasshook__', 'count', 'index']
來源:http://blog.sina.com.cn/s/blog_4b5039210100e9yd.html
來源:http://blog.sina.com.cn/s/blog_4b5039210100e9yg.html