Python學習筆記:系列數據類型


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. 變量個數和系列長度相等:使用賦值語句,可以將系列值拆封,然後賦值給多個變量;
    變量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)
>>> 
  1. 變量個數和系列長度不等

由於系列長度未知,可使用*元組變量,將多個值作爲元組賦值給元組變量。一個賦值語句,*變量只允許出現一次,否則導致SyntaxError

  1. 使用臨時變量_

如果只需要部分數據,系列其他位置可以使用臨時變量_

>>> _,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')
'是末初呀'
>>>

字符串格式化

  1. %元算符形式

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'
>>> 

在這裏插入圖片描述

  1. 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常量與字符串定義方式類似

  1. 單引號(b’ '),包含在單引號中的字符串,其中可以包含雙引號
  2. 雙引號(b" "),包含在雙引號中字符串,其中可以包含單引號
  3. 三單引號(b’’’ ‘’’),包含在三單引號中的字符串,可以跨行
  4. 三雙單引號(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中的字節整數
bytearrayobject#創建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()方法解碼爲字符串

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