系列數據類型
Python系列數據概述
數組
數組一種數據結構,用於存儲和處理大量數據。將所有的數據存儲在一個或多個數據中,然後通過索引下標訪問並處理數組元素,可以實現複雜數據處理任務。Python語言並沒有提供直接創建數組的功能,但可以使用其內置的系列數據類型(例如列表list),實現數組功能。
系列數據類型
系列數據類型是Python基礎的數據結構,是一組有順序的元素的集合。系列數據可以包含一個或多個元素(對象,元素也可以是其他系列數據),也可以是一個沒有任何元素的空系列。
Pyrhon的內置系列數據類型包括:元組(tuple)、列表(list)、字符串(str)和字節數據(bytes和bytearray)
系列數據的基本操作
系列的長度,最大值,最小值,求和
通過內置函數
len(),max(),min()
可以獲取系列的長度,系列中元素最大值,系列中最小值。內置函數sum()
可獲取列表或元組各元素之和;如果有非數值元素,則導致TypeError
;對於字符串(str)和字節數據(bytes),也將導致TyprError
。
系列中索引訪問操作
系列表可以通過索引下表訪問的可迭代對象、可以通過整數下表訪問系列s的元素。
索引下標從0開始,第一個元素爲s[0]
,第二個元素爲s[1]
,以此類推,最後一個元素是s[len(s)-1]
,如果索引下標越界,則導致IndexError
;如果索引下標不是整數,則導致TypeError
系列的切片操作
通過切片操作,可以截取系列
s
的。切片操作的基本形式爲:s[i:j] 或 s[i:j:k]
其中i
爲系列開始下標(包含s[i]
);j
爲系列結束下標(不包含s[j]
);k
爲步長。如果省略i
,則從下標0
開始;如果省略j
,則直接系列到結束爲止;如果省略k
,則步長爲1
注意:下標也可以爲負數。如果截取範圍內沒有數據,則返回空元組;如果超過下標範圍,不會報錯
系列的連接和重複操作
通過連接操作符
+
,可以連接兩個系列(s1和s2),形成一個新的系列對象,通過重複操作符*
,可以重複一個系列n
次(n爲整數)。系列連接和重複操作的基本形式爲:s1+s2
或者s*n
或者n*s
連接操作符
+
和重複操作符*
也支持複合賦值運算,即:+=
和*=
系列的成員關係操作
可以通過下列方式之一判斷一個元素
x
是否在系列s中。
x in s #如果爲True,則表示存在
x not in s #如果爲True,則表示不存在
s.count(x) #返回x在s(指定範圍[start,end))中出現的次數
s.index(x[,i[,j]]) #返回x在s(指定範圍[i,j])中第一次出現的下標
#其中,指定範圍[i,j),從下標(包括,默認爲0)開始,到下標j結束(不包括,默認認爲len(s))。
#對於s.index(value,[start,[stop]])方法,如果找不到時,則導致ValueError
系列的比較運算操作
兩個系列支持比較運算符(<,<=,==,!=,>=,>),字符串比較運算順序逐個元素進行比較
系列的排序操作
通過內置函數
sorted()
,可以返回系列的排序列表。通過類reversed
構造函數,可以返回系列的反序列迭代器。形式如下:
sorted(iterable,key=None,reverse=False) #返回系列的排序列表
其中key
適用於計算比較鍵值的函數(帶一個參數),例如:key=str.lower
如果reverse=True
,則反向排序
內置函數all()和any()
通過內置函數all()和any(),可以判斷系列的元素是否全部和部分爲
True
all(iterable) #如果序列的所有值都爲True,返回True,否則返回False
any(iterable) #如果序列的任意值爲True,返回True;否則,返回False
>>> any((1,2,3,0))
True
>>> any((0,0,0,0))
False
>>> all([1,2,3,0])
False
>>> all([1,2,3,4])
True
系列拆封
- 變量個數和系列長度相等:使用賦值語句,可以將系列值拆封,然後賦值給多個變量;
變量1,變量2,....,變量n = 系列或可迭代對象
變量個數和系列元素個數不一致時,將導致ValueError
>>> a,b,c=(1,2,3)
>>> a,b
(1, 2)
>>> a,b,c
(1, 2, 3)
>>> a,b,c=(7,'mochu',[7,77,777])
>>> a,b,c
(7, 'mochu', [7, 77, 777])
>>> c
[7, 77, 777]
>>> a,b,c=(1,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
>>>
- 變量個數和系列長度不等
由於系列長度未知,可使用
*元組變量
,將多個值作爲元組賦值給元組變量。一個賦值語句,*變量
只允許出現一次,否則導致SyntaxError
- 使用臨時變量
_
如果只需要部分數據,系列其他位置可以使用臨時變量
_
>>> _,a,_,b=(1,2,3,4)
>>> _
3
>>> a,b
(2, 4)
>>>
元組
元組是一組有序系列,包含零個或多個對象引用。元組和列表十分類似,但元組是不可變對象,即不能修改、添加或刪除元組中的項目,但可以訪問元組中的項目。
使用元組字面量創建元組實例對象
使用元組字面量,可以創建元組實例對象。元組字面量採用圓括號中用逗號分隔的項目定義。圓括號可以省略。其基本形式如下:
x1,[x2,...,xn]
或者(x1,[x2,...,xn])
,其中x1,x2,…,xn爲任意對象
注意,如果元組中有一個項目時,後面的逗號不能省略,這是因爲Python解釋器把(x1)解釋爲x1,例如。
(1)
爲整數1,(1,)
解釋爲元組。
使用tuple對象創建元組實例對象
也可以通過創建tuple對象來創建元組。其基本形式爲:
tuple() #創建一個空列表
tuple(iterable) #創建一個列表,包含的項目爲可枚舉對象iterable中的元素
元組的系列操作
元組支持系列的基本操作,包括索引訪問、切片操作、連接操作、重複操作、成員關係操作、比較運算操作,以及
len(),max(),sum()
,求元組長度、最大值。最小值等
列表
列表是一組有序項目的數據結構。創建一個列表後,可以訪問,修改,添加或刪除列表中的項目。即列表示可變數據類型,Python沒有數組,可以使用列表代替
使用列表字面量創建列表實例對象
使用列表字面量,可以創建列表實例對象。列表字面量列表採用方括號中用逗號分隔的項目定義。其基本形式:
[x1,x2,...,xn]
使用list對象創建元組實例對象
也可以通過創建list對象來創建列表。其基本形式爲:
list() #創建一個空列表
list(iterable) #創建一個空列表,包含項目爲可枚舉對象iterable中的元素
列表的系列操作
列表支持系列的基本操作,包括索引訪問、切片操作、連接操作、重複操作、成員關係操作、比較運算操作,以及求列表長度,最大值,最小值等
列表是可變對象,故可以改變列表對象中的值,也可以通過
del
刪除某元素
s[下標]=x #設置列表元素,x爲任意對象
del x[下標] #刪除列表元素
列表是可變對象,故可以改變切片的值,也可以通過
del
刪除切片
s[i:j]=x #設置列表內容,x爲任意對象,也可以是元組、列表
del s[i:j] #移去列表中一系列元素,等同於s[i:j]=[]
s[i:j]=[] #移去列表一系列元素
list對象的方法
對象是可變對象,其包含的主要方法如下圖所示,
s=[1,3,2]
列表解析表達式
使用列表解析式,可以簡單高效地處理一個可迭代對象,並生成結果列表。列表解析表達式的形式如下:
[expr for i1 in 序列1…for iN in 序列N]:迭代所有內容,並生成計算列表
[expr for i1 i in 序列1…for iN in 序列N if cond_expr]:按條件迭代,並生成計算列表
表達式expr使用每次迭代內容 i1…iN,計算生成一個列表。如果指定了條件表達式cond_expr,則只有滿足條件的元素參與迭代
>>> [i**2 for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [(i,i**2) for i in range(10)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81)]
>>> [i for i in range(10) if i%2==0]
[0, 2, 4, 6, 8]
>>> [(x,y,x*y) for x in range(1,4) for y in range(1,4) if x>=y]
[(1, 1, 1), (2, 1, 2), (2, 2, 4), (3, 1, 3), (3, 2, 6), (3, 3, 9)]
>>>
字符串
字符串實現爲有序的字符合集,即字符系列。str對象是不可變對象。
字符串系列操作
字符串支持系列的基本操作,包括索引訪問、切片操作、連接操作、重複操作、成員關係操作符、比較運算操作,以及求字符串長度、最大值、最小值等。
通過len(s),可以獲取字符串s的長度;如果其長度爲0,則爲空字符串
字符串編碼
默認情況下,Python字符串採用UTF-8編碼。創建字符串,也可以指定編碼方式
str(object=b'',encoding='utf-8',errors='strict') #指定編碼,根據字節碼對應編碼的字符串
其中,objec爲字節碼對象(bytes或bytearray);encoding爲編碼;error爲錯誤控制、該構造函數的結果,等同於bytes對象b的對象方法:b.encode(encoding,error) #把字節碼對象b解碼爲對應編碼的字符串
對應的,也可以把字符串對象s
編碼爲字節對象:
>>> s1='是末初呀'
>>> s2=s1.encode(encoding='cp936')
>>> s2
b'\xca\xc7\xc4\xa9\xb3\xf5\xd1\xbd'
>>> s2.decode(encoding='cp936')
'是末初呀'
>>>
字符串格式化
- %元算符形式
Python支持類似C語言的printf
格式化輸出,採用如下形式:
格式化字符串 % (值1,值2,...) #兼容Python2的格式,不建議使用
格式化字符串與C語言的printf
格式化字符串基本相同。格式化字符串由固定和格式說明符混合組成。格式說明符的語法如下:
%[(key)][flags][width][.precision][Length]type
其中,key(可選)爲映射鍵(適用於映射的格式化,例如%(lang)s
);flags(可選)爲修改輸出格式的字符集;width(可選)爲最小寬度,如果爲*
,則使用下一個參數值;percision(可選)爲精度,如果爲*
,則使用下一參數值;Length爲修飾符(h、l或L,可選),Python忽略該字符;type爲格式化類型字符。例如:
>>> '結果:%f'%88
'結果:88.000000'
>>> '姓名:%s,年齡:%d,體重:%3.2f'%('末初',19,60)
'姓名:末初,年齡:19,體重:60.00'
>>> '%(lang)s has %(num)03d quote types.'%{'lang':'Python','num':2}
'Python has 002 quote types.'
>>> '%0*.*f'%(10,5,88)
'0088.00000'
>>>
- format內置函數
內置函數基本形式如下:
format(value) #等同於str(value)
format(value,format_spec) #等同於type(value)._format__(format_scpec)
格式化說明符(format_spec)的基本格式如下:
[[fill]align][sign][#][0][width][,][.percision][type]
其中,fill
(可選)爲填充字符,可以爲除{}
外的任何字符;align
爲對齊方式,包括:<
左對齊,>
右對齊,=
填充位於符號和數字之間,^
居中對齊,sign
(可選)爲符號字符,包括+
(正數)、-
(負數)、(正數帶空格),
width
(可選)是最小寬度;percision
(可選)是精度;type
是格式化類型字符,如下:
3.字符串的format方法h
字符串format方法的基本形式如下:
str.format(格式化字符串,值1,值2,...) #類方法
格式化字符串.format(值1,值2,...) #對象方法
格式化字符串.format_map(mapping)
格式化字符串由固定文本和格式化說明符混合組成。格式說明符的語法如下:
{[索引和鍵]:formati_spec}
其中,可選索引對應於要格式化參數值的位置,可選鍵對應於要格式化映射的鍵;格式化說明符(format_spec)同format內置函數
字節系列
字節系列是由8位字節數據組成的系列數據類型,即
0<=x<256
的整數系列。Python內置的字節系列數據類型包括:bytes(不可變對象)、bytearray(可變對象)和memoryview
bytes常量
使用字母b加單引號或雙引號括起來的內容,是
bytes
常量,Python解釋器自動創建bytes
型對象實例。bytes常量與字符串定義方式類似
- 單引號(b’ '),包含在單引號中的字符串,其中可以包含雙引號
- 雙引號(b" "),包含在雙引號中字符串,其中可以包含單引號
- 三單引號(b’’’ ‘’’),包含在三單引號中的字符串,可以跨行
- 三雙單引號(b""" “”“),包含在三雙引號中的字符串,可以跨行
注意:引號只能包含ASCII碼字符,否則導致SyntaxError
>>> b'末初'
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>>
創建bytes對象
創建bytes類型的對象實例基本形式如下:
bytes() #創建空bytes對象
bytes(n) #創建長度爲n(整數)的bytes對象,各字節爲0
bytes(iterable) #創建bytes對象,使用iterable中字節整數
bytes(object) #創建bytes對象,使用iterable中的字節整數
bytes(source[,enconding[,errors]]) #創建bytes對象
注意:如果
iterable
中包含非0<=x<256
的整數,則導致ValueError
創建bytearray對象
創建bytearray類型的對象實例的基本形式爲:
bytearray() #創建空bytearrat()對象
bytearray(n) #創建長度爲n(整數)的bytearray()對象,各字節爲0
bytearray(iterable) #創建bytearray對象,使用iterable中的字節整數
bytearray(object) #創建bytearray對象,賦值object字節數據
bytearray([source[,encoding[,errors]]]) #創建bytearray()對象
如果iterable中包含非
0<=x<256
的整數,則導致ValueError
bytes和bytearray的系列操作
byte和bytearray支持系列的基本操作,包括索引訪問、切片操作、連接操作、重複操作、成員關係操作、比較運算操作。以及求系列長度、最大值、最小值等
bytes和bytearray一般基於ASCII字符串,故bytes和bytearray基本上支持str對象的類似方法。但不支持str.encode()(把字符串轉換爲bytes對象)、str.format()/str.format_map()(字符串格式化)、str.isidentifier()/str.isunmeric()/str.isdecimal()/str.isprintable()(判斷這些無意義)
注意:bytes和bytearray()的方法不接受字符串參數,只接受bytes和bytearray參數,否則導致TypeError
字節編碼和解碼
字符串可以通過
str.encode()
方法編碼爲字節碼;通過bytes和bytearray的decode()
方法解碼爲字符串