[python學習手冊-筆記]002.python核心資料型別
python核心資料型別
❝本系列文章是我個人學習《python學習手冊(第五版)》的學習筆記,其中大部分內容為該書的總結和個人理解,小部分內容為相關知識點的擴充套件。
非商業用途轉載請註明作者和出處;商業用途請聯絡本人([email protected])獲取許可。
❞
先來解決一個書上沒搞懂的東西,「字面量」
百度百科給出的字面量的解釋:"在電腦科學中,字面量(literal)是用於表達原始碼中一個固定值的表示法(notation)。"
我表示沒看懂,然後又查了一下.所謂字面量,就是那些賦值等號後面的數字啊字串啊等等. 所以給出一個定性的解釋吧.
var=10#這個"10"就是字面量
python的內建物件
物件型別 | 字面量/構造示例 |
---|---|
數字 | 1234, 3.1415 |
字串 | "hello" b'a\x01c' |
列表 | [1,2,"word"], list(range(10)) |
字典 | {"food":"tomato","price":6.66}, dict(hours=10) |
元組 | (1,2,"brady"),tuple('spam') |
檔案 | open("egg.txt") |
集合 | set("abc"),{'a','b','c'} |
其他核心型別 | 型別,None,布林型 |
程式單元型別 | 函式,模組,類 |
Python實現相關型別 | 已編譯程式碼,呼叫棧跟蹤 |
數字型別
Python中的數字型別,除了支援常見的整數和浮點數之外,還有有虛部的附屬,固定精度的十進位制數字,帶分子和分母的有理數等等. 支援常見的算數運算.
字串
字串是通過""
或者''
括起來的任意文字.在python中單引號和雙引號的作用相同.
首先要明白字串的兩個特性:
python中的字串是一個序列,也就是說它是遵循可迭代協議的 字串是一個不可改變的量(這個理解起來有點困難,稍後會說,先承認這一特性)
字串序列的操作
通過len()方法計算長度
In[2]:S="spam"
In[3]:len(S)
Out[3]:4
索引和切片
「字串是一個序列,支援索引和for的遍歷」
在字串的索引中,負數表示逆向的索引,也就是從後往前.也就是說
S[-1]
S[len(S)-1]
In[4]:S[0]
Out[4]:'s'
In[5]:S[-1]
Out[5]:'m'
In[6]:forsinS:
...:print(s)
...:
s
p
a
m「字串支援分片操作」
In[7]:S='hello'
#取第三位到第五位之間的子串
In[8]:S[2:4]
Out[8]:'ll'
#從第三位取到結尾
In[9]:S[2:]
Out[9]:'llo'
#取前三位
In[10]:S[:3]
Out[10]:'hel'
#從開始擷取到倒數第二位之前
In[11]:S[:-2]
Out[11]:'hel'注意,分片操作的時候,
X[I:J]
表示的是從X[I]
開始,到X[J]
結束,但是不包括X[J]
字串的拼接和重複
字串支援通過
+
進行連線. 也可以通過*
進行重複.但是注意,這不代表字串是可以改變的. 比如以下程式碼3-4行中,
S+'xyz'
.這並不是改變了原有字串S,而是開闢新的記憶體空間,將原有字串S和
'xyz'
進行連線,生成一個新的量.In[12]:S="spam"
In[13]:S+'xyz'
Out[13]:'spamxyz'
In[14]:S*3
Out[14]:'spamspamspam'這裡,對於操作符
+
對於不同的型別而言有著不同的作用. 比如在數字型別中表示算數運算中的加法,在字串中表示字串連線. 這一特性就是傳說中的多型,也稱之為運算子過載. 這是Python中的一個極其重要的設計思路.
不可變性
字串在Python中是一個不可變的字面量. 在python核心型別中,字串,數字,元組都是不可變的. 而列表,字典,集合是可變的.
當然,通過前面的學習,某些操作,彷彿可以改變字串. 但是這裡要說的是,這種所謂的"改變"字串,實際上是生成新的字面量,而不是改變原有字面量.
特性型別的方法(內建方法)
Python對於不同的型別,內建了一些便捷的方法可以使用. 也就是我們所謂的內建方法. 相關的內建方法可以在python官網的文件進行查詢.這也是後面我們要學習內容的一部分.
In[15]:S="Spam"
#字串替換
In[17]:S.replace('pa','xz')
Out[17]:'Sxzm'
In[18]:line="aaa,bbb,ccc"
#字串分割
In[19]:line.split(',')
Out[19]:['aaa','bbb','ccc']
在python中,我們可以通過dir()
方法檢視在其作用域內,該型別所支援的屬性和方法.
In[20]:dir(S)
Out[20]:['__add__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__getnewargs__','__gt__','__hash__','__init__','__init_subclass__','__iter__','__le__','__len__','__lt__','__mod__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__rmod__','__rmul__','__setattr__','__sizeof__','__str__','__subclasshook__','capitalize','casefold','center','count','encode','endswith','expandtabs','find','format','format_map','index','isalnum','isalpha','isascii','isdecimal','isdigit','isidentifier','islower','isnumeric','isprintable','isspace','istitle','isupper','join','ljust','lower','lstrip','maketrans','partition','replace','rfind','rindex','rjust','rpartition','rsplit','rstrip','split','splitlines','startswith','strip','swapcase','title','translate','upper','zfill']
轉義字元和unicode字串
python與其他語言一樣,支援'\'
的轉義字元. 比如常見的\n
和\t
另外python原生支援unicode字串. (關於unicode字串,後續會有相關文章介紹)
列表
列表是類似C語言中陣列的一種東西. 但是相比C語言的陣列,python的列表更加靈活:
python的列表不侷限其內的資料型別. 同一個列表中可以存放不同型別的資料 python的列表是可變長的. python的列表支援推導表示式
#python的列表中可以存放不同資料型別的資料
In[23]:L=[1,2,'egg']
In[24]:len(L)
Out[24]:3
#列表也支援拼接操作
In[25]:L+[4,5,6]
Out[25]:[1,2,'egg',4,5,6]
#列表同樣支援重複操作
In[26]:L*2
Out[26]:[1,2,'egg',1,2,'egg']
列表的邊界檢查
python的列表沒有固定的大小,但是同樣有邊界檢查,不允許引用不存在的元素. 也就是說,列表結尾之外的索引是不支援的.
In[27]:L=[1,2,3]
In[28]:L[3]
---------------------------------------------------------------------------
IndexErrorTraceback(mostrecentcalllast)
<ipython-input-28-28c5e42e8527>in<module>
---->1L[3]
IndexError:listindexoutofrange
如果我們需要增加列表的元素,可以使用內建方法append
In[29]:L[3]=4
---------------------------------------------------------------------------
IndexErrorTraceback(mostrecentcalllast)
<ipython-input-29-3e20e34dcd62>in<module>
---->1L[3]=4
IndexError:listassignmentindexoutofrange
In[30]:L.append(4)
In[31]:L
Out[31]:[1,2,3,4]
列表推導式
這就是python強大的地方了,列表中除了可以存放已知的,實際的資料外,還可以通過公式來生成一個列表. 這在矩陣處理中十分有用.
In[32]:M=[[1,2,3],[4,5,6],[7,8,9]]
In[33]:M
Out[33]:[[1,2,3],[4,5,6],[7,8,9]]
In[36]:diag=[M[i][i]foriin[0,1,2]]
In[37]:diag
Out[37]:[1,5,9]
#傳說中的列表生成式
In[38]:L=[[x,x/2,x*2]forxinrange(-6,7,2)ifx>0]
In[39]:L
Out[39]:[[2,1.0,4],[4,2.0,8],[6,3.0,12]]
字典
字典有很多的名字,字典,雜湊,雜湊列表,對映等等. 字典不是一種序列,它是一種對映.是通過鍵-值對的形式來儲存資料的.
它的儲存原理和列表不同. 簡答來說,字典的儲存是將鍵(key)通過雜湊函式進行轉換,得到一個地址,然後將值(value)放入該地址.
那也就是說,字典的查詢速度和其大小無關. 所以對於搜尋來說,字典比列表更合適.
字典的構造
這裡列舉出了字典的三種構造方式.
In[42]:bob={'name':'bob','age':40,'job':'dev'}
In[43]:bob
Out[43]:{'name':'bob','age':40,'job':'dev'}
In[44]:bob2=dict(name='bob',age=40,job='dev')
In[45]:bob2
Out[45]:{'name':'bob','age':40,'job':'dev'}
In[46]:bob3=dict(zip(['name','job','age'],['bob','dev',40]))
In[47]:bob3
Out[47]:{'name':'bob','job':'dev','age':40}
關於zip()
方法的用法,後續的文章會講到
字典中的值可以是簡單的數值和字串,也可以是其他型別,比如:
In[48]:bob4={'name':{"first":'bob','last':'Smith'},'job':['dev','test'],'age':40}
In[49]:bob4
Out[49]:{'name':{'first':'bob','last':'Smith'},'job':['dev','test'],'age':40}
字典的鍵
字典的鍵是其索引,我們可以通過鍵來訪問對應的資料,也可以通過鍵來增加新的資料. 但是對於不存在的鍵,同樣是不支援訪問的.
In[50]:abc={'A':'a','B':'b','C':'c'}
In[51]:abc['B']
Out[51]:'b'
In[52]:abc['D']='d'
In[53]:abc
Out[53]:{'A':'a','B':'b','C':'c','D':'d'}
In[54]:abc['E']
---------------------------------------------------------------------------
KeyErrorTraceback(mostrecentcalllast)
<ipython-input-54-15e1b0b37eaa>in<module>
---->1abc['E']
KeyError:'E'
那麼在訪問字典資料之前,為了避免這種錯誤,我們可以檢查一下我們要訪問的鍵是否存在.
先說一個最容易理解的方式,通過if語句
進行檢查
In[57]:if'D'inabc:
...:print('hit')
...:ifnot'F'inabc:
...:print('miss')
...:
hit
miss
其次還可以使用get
方法來進行檢查,關於get方法,做一個簡單的解釋.
dict.get(key, default=None)
get方法可以通過鍵來訪問資料,如果訪問不到則返回第二個引數.
In[58]:value=abc.get('D',0)
In[59]:value
Out[59]:'d'
In[60]:value=abc.get('F',0)
In[61]:value
Out[61]:0
另外,字典還支援通過keys
方法返回一個包含所有鍵的可迭代物件.
In[67]:Ks=abc.keys()
In[71]:forkeyinKs:
...:print(key)
...:
A
B
C
D
元組
python中的元組可以理解為是一種不可改變的列表. 用來表示確定的元素的集合. 語法很簡單.如下:
In[72]:T1=(1,2,3)
In[73]:type(T1)
Out[73]:tuple
In[74]:T1[1]
Out[74]:2
In[77]:T1.count(2)
Out[77]:1
In[78]:T1+(4,5,6)
Out[78]:(1,2,3,4,5,6)
元組同樣像列表那樣支援分片操作和索引. 但是元組不支援append等方法. 不準確的說,元組其實更像一個可以存放任意的型別的"字元"串.
那麼,既然我們已經有了列表,為什麼還需要元組呢?
元組和列表的主要區別在於,元組是不可改變的. 在一些特定的場景下,元組提供了一種完整性的約束.
檔案
檔案是一種比較特殊的型別,沒有特定的字面量可以建立檔案. 一般我們是通過open函式傳遞一個檔名和操作符來生成檔案控制代碼.
In[79]:f=open('data.txt','wb')
In[81]:f.write(b'helloworld')
Out[81]:11
In[83]:f.close()
集合
python集合不是序列,也不是對映. 它是python中到目前為止,唯一一種不可變的物件的無序集合. 其實python中的集合其實就是數學上所謂的集合. 對,就是那個我們初中學習的交集,並集啥啥啥的玩意兒.
集合的建立有兩種方法:
In[85]:X={1,2,3,4}
In[87]:Y=set([3,4,5,6])
In[88]:X
Out[88]:{1,2,3,4}
In[89]:Y
Out[89]:{3,4,5,6}
#交集
In[90]:X&Y
Out[90]:{3,4}
#並集
In[91]:X|Y
Out[91]:{1,2,3,4,5,6}
#差集
In[92]:X-Y
Out[92]:{1,2}
#X是否為Y的超集
In[93]:X>Y
Out[93]:False
其他資料型別
除了以上介紹的核心型別之外,python中的資料型別還有:
類 程式碼塊 布林值 函式 模組
後續再詳細講解