## 什么是Python?Python是一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。你可能已經(jīng)聽說(shuō)過(guò)很多種流行的編程語(yǔ)言,比如非常難學(xué)的C語(yǔ)言,非常流行的Java語(yǔ)言,適合初學(xué)者的Basic語(yǔ)言,適合網(wǎng)頁(yè)編程的JavaScript語(yǔ)言等等。?那Python是一種什么語(yǔ)言??首先,我們普及一下編程語(yǔ)言的基礎(chǔ)知識(shí)。用任何編程語(yǔ)言來(lái)開發(fā)程序,都是為了讓計(jì)算機(jī)干活,比如下載一個(gè)MP3,編寫一個(gè)文檔等等,而計(jì)算機(jī)干活的CPU只認(rèn)識(shí)機(jī)器指令,所以,盡管不同的編程語(yǔ)言差異極大,最后都得“翻譯”成CPU可以執(zhí)行的機(jī)器指令。而不同的編程語(yǔ)言,干同一個(gè)活,編寫的代碼量,差距也很大。?比如,完成同一個(gè)任務(wù),C語(yǔ)言要寫1000行代碼,Java只需要寫100行,而Python可能只要20行。?所以Python是一種相當(dāng)高級(jí)的語(yǔ)言。?你也許會(huì)問(wèn),代碼少還不好?代碼少的代價(jià)是運(yùn)行速度慢,C程序運(yùn)行1秒鐘,Java程序可能需要2秒,而Python程序可能就需要10秒。?那是不是越低級(jí)的程序越難學(xué),越高級(jí)的程序越簡(jiǎn)單?表面上來(lái)說(shuō),是的,但是,在非常高的抽象計(jì)算中,高級(jí)的Python程序設(shè)計(jì)也是非常難學(xué)的,所以,高級(jí)程序語(yǔ)言不等于簡(jiǎn)單。?但是,對(duì)于初學(xué)者和完成普通任務(wù),Python語(yǔ)言是非常簡(jiǎn)單易用的。連Google都在大規(guī)模使用Python,你就不用擔(dān)心學(xué)了會(huì)沒(méi)用。?用Python可以做什么?可以做日常任務(wù),比如自動(dòng)備份你的MP3;可以做網(wǎng)站,很多著名的網(wǎng)站包括YouTube就是Python寫的;可以做網(wǎng)絡(luò)游戲的后臺(tái),很多在線游戲的后臺(tái)都是Python開發(fā)的??傊褪悄芨珊芏嗪芏嗍吕?。?Python當(dāng)然也有不能干的事情,比如寫操作系統(tǒng),這個(gè)只能用C語(yǔ)言寫;寫手機(jī)應(yīng)用,只能用Swift/Objective-C(針對(duì)iPhone)和Java(針對(duì)Android);寫3D游戲,最好用C或C++。?本篇教程將講述Python基礎(chǔ)的<font color=red>數(shù)據(jù)類型</font>什么是Python??Python是一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。你可能已經(jīng)聽說(shuō)過(guò)很多種流行的編程語(yǔ)言,比如非常難學(xué)的C語(yǔ)言,非常流行的Java語(yǔ)言,適合初學(xué)者的Basic語(yǔ)言,適合網(wǎng)頁(yè)編程的JavaScript語(yǔ)言等等。 那Python是一種什么語(yǔ)言? 首先,我們普及一下編程語(yǔ)言的基礎(chǔ)知識(shí)。用任何編程語(yǔ)言來(lái)開發(fā)程序,都是為了讓計(jì)算機(jī)干活,比如下載一個(gè)MP3,編寫一個(gè)文檔等等,而計(jì)算機(jī)干活的CPU只認(rèn)識(shí)機(jī)器指令,所以,盡管不同的編程語(yǔ)言差異極大,最后都得“翻譯”成CPU可以執(zhí)行的機(jī)器指令。而不同的編程語(yǔ)言,干同一個(gè)活,編寫的代碼量,差距也很大。 比如,完成同一個(gè)任務(wù),C語(yǔ)言要寫1000行代碼,Java只需要寫100行,而Python可能只要20行。 所以Python是一種相當(dāng)高級(jí)的語(yǔ)言。 你也許會(huì)問(wèn),代碼少還不好?代碼少的代價(jià)是運(yùn)行速度慢,C程序運(yùn)行1秒鐘,Java程序可能需要2秒,而Python程序可能就需要10秒。 那是不是越低級(jí)的程序越難學(xué),越高級(jí)的程序越簡(jiǎn)單?表面上來(lái)說(shuō),是的,但是,在非常高的抽象計(jì)算中,高級(jí)的Python程序設(shè)計(jì)也是非常難學(xué)的,所以,高級(jí)程序語(yǔ)言不等于簡(jiǎn)單。 但是,對(duì)于初學(xué)者和完成普通任務(wù),Python語(yǔ)言是非常簡(jiǎn)單易用的。連Google都在大規(guī)模使用Python,你就不用擔(dān)心學(xué)了會(huì)沒(méi)用。 用Python可以做什么?可以做日常任務(wù),比如自動(dòng)備份你的MP3;可以做網(wǎng)站,很多著名的網(wǎng)站包括YouTube就是Python寫的;可以做網(wǎng)絡(luò)游戲的后臺(tái),很多在線游戲的后臺(tái)都是Python開發(fā)的。總之就是能干很多很多事啦。 Python當(dāng)然也有不能干的事情,比如寫操作系統(tǒng),這個(gè)只能用C語(yǔ)言寫;寫手機(jī)應(yīng)用,只能用Swift/Objective-C(針對(duì)iPhone)和Java(針對(duì)Android);寫3D游戲,最好用C或C++。 本篇教程將講述Python基礎(chǔ)的數(shù)據(jù)類型 # 基本的數(shù)據(jù)類型?在Python中,能夠直接處理的數(shù)據(jù)類型有以下幾種:?## 整數(shù)?Python可以處理任意大小的整數(shù),包括負(fù)整數(shù),寫程序的時(shí)候表述與數(shù)學(xué)上的方法一樣,例如:<font color=#0099ff>99</font>,<font color=#0099ff>-3</font>,<font color=#0099ff>6666</font> 等等。?## 浮點(diǎn)數(shù) ?浮點(diǎn)數(shù)也可以稱為小數(shù)。叫做浮點(diǎn)數(shù)是因?yàn)榘凑湛茖W(xué)記數(shù)法表示時(shí),一個(gè)浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是可變的。比如,<font color=#0099ff>1.11x10<sup>6</sup></font>和<font color=#0099ff>11.1x10<sup>5</sup></font>是完全相等的。對(duì)于很大或很小的浮點(diǎn)數(shù),必須用科學(xué)計(jì)數(shù)法表示,把10用e替代,<font color=#0099ff>1.11x10<sup>6</sup></font>就是<font color=#0099ff>1.11e6</font>,或者<font color=#0099ff>11.1e5</font>,<font color=#0099ff>0.0000011</font>可以寫成<font color=#0099ff>1.1e-6</font>。負(fù)數(shù)的話直接在前面加負(fù)號(hào)即可,例如:<font color=#0099ff>-1.1e-6</font>。?**需要注意的一點(diǎn)是,整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,<font color=red>整數(shù)</font>之間的運(yùn)算永遠(yuǎn)是精確的,而<font color=red>浮點(diǎn)數(shù)</font>運(yùn)算則可能會(huì)有四舍五入的誤差。**?## 字符串 ?字符串是以單引號(hào)<font color=#0099ff> ' </font>或雙引號(hào)<font color=#0099ff> " </font>括起來(lái)的任意文本<font color=#0099ff>' '</font>或<font color=#0099ff>" "</font>只是一種表示方式,不是字符串的一部分,所以字符串<font color=#0099ff>'rice'</font>只有<font color=#0099ff>r</font>,<font color=#0099ff>i</font>,<font color=#0099ff>c</font>,<font color=#0099ff>e</font>這4個(gè)字符。如果要把<font color=#0099ff>'</font>本身也包括進(jìn)字符里,那就可以用<font color=#0099ff>" "</font>括起來(lái)。如果字符串內(nèi)部既包含<font color=#0099ff> ' </font>又包含<font color=#0099ff> " </font>怎么辦呢?我們可以用轉(zhuǎn)義字符<font color=#0099ff> \ </font>來(lái)標(biāo)識(shí),例如:<font color=#0099ff>'I\'m \"OK\"!'</font>表示的內(nèi)容為:<font color=#0099ff>I'm "OK"!</font>?轉(zhuǎn)義字符<font color=#0099ff>\</font>可以轉(zhuǎn)義很多字符,比如<font color=#0099ff>\n</font>表示換行,<font color=#0099ff>\t</font>表示制表符,字符\本身也要轉(zhuǎn)義,所以<font color=#0099ff>\\</font>表示的字符就是<font color=#0099ff>\</font>,用print()打印字符串看看結(jié)果如何:基本的數(shù)據(jù)類型?在Python中,能夠直接處理的數(shù)據(jù)類型有以下幾種: 整數(shù)?Python可以處理任意大小的整數(shù),包括負(fù)整數(shù),寫程序的時(shí)候表述與數(shù)學(xué)上的方法一樣,例如:99,-3,6666 等等。 浮點(diǎn)數(shù)?浮點(diǎn)數(shù)也可以稱為小數(shù)。叫做浮點(diǎn)數(shù)是因?yàn)榘凑湛茖W(xué)記數(shù)法表示時(shí),一個(gè)浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是可變的。比如,1.11x106和11.1x105是完全相等的。對(duì)于很大或很小的浮點(diǎn)數(shù),必須用科學(xué)計(jì)數(shù)法表示,把10用e替代,1.11x106就是1.11e6,或者11.1e5,0.0000011可以寫成1.1e-6。負(fù)數(shù)的話直接在前面加負(fù)號(hào)即可,例如:-1.1e-6。 需要注意的一點(diǎn)是,整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,整數(shù)之間的運(yùn)算永遠(yuǎn)是精確的,而浮點(diǎn)數(shù)運(yùn)算則可能會(huì)有四舍五入的誤差。 字符串?字符串是以單引號(hào) ' 或雙引號(hào) " 括起來(lái)的任意文本' '或" "只是一種表示方式,不是字符串的一部分,所以字符串'rice'只有r,i,c,e這4個(gè)字符。如果要把'本身也包括進(jìn)字符里,那就可以用" "括起來(lái)。如果字符串內(nèi)部既包含 ' 又包含 " 怎么辦呢?我們可以用轉(zhuǎn)義字符 \ 來(lái)標(biāo)識(shí),例如:'I\'m \"OK\"!'表示的內(nèi)容為:I'm "OK"! 轉(zhuǎn)義字符\可以轉(zhuǎn)義很多字符,比如\n表示換行,\t表示制表符,字符\本身也要轉(zhuǎn)義,所以\表示的字符就是\,用print()打印字符串看看結(jié)果如何: In [1]: print('I\'m \"OK\"!')I'm "OK"! In [2]: print('CHINA SECURITIES is\ngreat')CHINA SECURITIES is great In [3]: print('\\\t\\')\ ## 布爾值?布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有<font color=#0099ff>True</font>、<font color=#0099ff>False</font>兩種值。Python中,既可以直接用<font color=#0099ff>True</font>、<font color=#0099ff>False</font>表示(<font color=red>一定要大寫</font>),也可以通過(guò)布爾運(yùn)算計(jì)算出來(lái):布爾值?布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有True、False兩種值。Python中,既可以直接用True、False表示(一定要大寫),也可以通過(guò)布爾運(yùn)算計(jì)算出來(lái): In [4]: TrueOut[4]: True In [5]: FalseOut[5]: False In [6]: 1>0Out[6]: True 布爾值可以用<font color=#0099ff>and</font>、<font color=#0099ff>or</font>和<font color=#0099ff>not</font>即與、或和非進(jìn)行運(yùn)算。布爾值可以用and、or和not即與、或和非進(jìn)行運(yùn)算。 In [7]: True and FalseOut[7]: False In [8]: 1 > 2 or 3 < 10Out[8]: True In [9]: not 3 < 10Out[9]: False ## 列表?Python內(nèi)嵌的數(shù)據(jù)類型主要包括以下兩類:?### 有序:?List(列表),是有序集合,沒(méi)有固定大小,可以通過(guò)對(duì)偏移量以及其他方法修改列表大小。列表的基本形式如:[1,2,3,4]?Tuple(元組),是有序集合,是不可變的,可以進(jìn)行組合和復(fù)制運(yùn)算后會(huì)生成一個(gè)新的元組。元組的基本形式比如:(1,3,6,10)?String(字符串),也是有序集合,字符串的基本形式比如:’hello’,這里不進(jìn)行具體介紹。?### 無(wú)序:?Set(集合),是一個(gè)無(wú)序不重復(fù)元素的集。基本功能包括關(guān)系運(yùn)算和消除重復(fù)元素。集合的基本形式如:set('abracadabra')?Dictionary(字典)是無(wú)序的鍵:值對(duì) (key:value 對(duì))集合,鍵必須是互不相同的(在同一個(gè)字典之內(nèi))。字典的基本形式如:{'jack': 4098, 'sape': 4139}首先對(duì)列表進(jìn)行介紹。??List(列表) 是 Python 中最通用的序列。列表是一個(gè)任意類型對(duì)象位置的相關(guān)有序集合,它沒(méi)有固定大小。不像字符串,其大小是可以變的,通過(guò)對(duì)偏移量進(jìn)行賦值以及其他各種列表的方法進(jìn)行調(diào)用,可以修改列表大小。?### 索引是從0開始而非1開始??!?列表中值的分割用變量[頭下標(biāo):尾下標(biāo)],就可以截取相應(yīng)的列表,從左到右索引默認(rèn)“0”開始的,從右到左索引默認(rèn)-1開始,下標(biāo)可以為空表示取到頭或尾??梢詫?duì)列表進(jìn)行索引、切片等操作,看下面例子。列表?Python內(nèi)嵌的數(shù)據(jù)類型主要包括以下兩類: 有序:?List(列表),是有序集合,沒(méi)有固定大小,可以通過(guò)對(duì)偏移量以及其他方法修改列表大小。列表的基本形式如:[1,2,3,4] Tuple(元組),是有序集合,是不可變的,可以進(jìn)行組合和復(fù)制運(yùn)算后會(huì)生成一個(gè)新的元組。元組的基本形式比如:(1,3,6,10) String(字符串),也是有序集合,字符串的基本形式比如:’hello’,這里不進(jìn)行具體介紹。 無(wú)序:?Set(集合),是一個(gè)無(wú)序不重復(fù)元素的集。基本功能包括關(guān)系運(yùn)算和消除重復(fù)元素。集合的基本形式如:set('abracadabra') Dictionary(字典)是無(wú)序的鍵:值對(duì) (key:value 對(duì))集合,鍵必須是互不相同的(在同一個(gè)字典之內(nèi))。字典的基本形式如:{'jack': 4098, 'sape': 4139} 首先對(duì)列表進(jìn)行介紹。 List(列表) 是 Python 中最通用的序列。列表是一個(gè)任意類型對(duì)象位置的相關(guān)有序集合,它沒(méi)有固定大小。不像字符串,其大小是可以變的,通過(guò)對(duì)偏移量進(jìn)行賦值以及其他各種列表的方法進(jìn)行調(diào)用,可以修改列表大小。 索引是從0開始而非1開始?。?a>?列表中值的分割用變量[頭下標(biāo):尾下標(biāo)],就可以截取相應(yīng)的列表,從左到右索引默認(rèn)“0”開始的,從右到左索引默認(rèn)-1開始,下標(biāo)可以為空表示取到頭或尾??梢詫?duì)列表進(jìn)行索引、切片等操作,看下面例子。 列出一周5個(gè)工作日可以使用list:列出一周5個(gè)工作日可以使用list: In [10]: week = ['Monday','Tuesday','Wednesday','Thursday','Friday']weekOut[10]: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] week是一個(gè)list,可以用len()獲取其元素個(gè)數(shù):week是一個(gè)list,可以用len()獲取其元素個(gè)數(shù): In [11]: len(week)Out[11]: 5 可以使用索引來(lái)訪問(wèn)list中的每一個(gè)位置上的元素,不過(guò)一定要記住<font color=red>**索引是從0開始的?。?*</font>可以使用索引來(lái)訪問(wèn)list中的每一個(gè)位置上的元素,不過(guò)一定要記住索引是從0開始的!! In [12]: week[0]Out[12]: 'Monday' In [13]: week[3]Out[13]: 'Thursday' In [14]: week[5]--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-14-aab97e4d2f9f> in <module>() ----> 1 week[5] IndexError: list index out of range 當(dāng)索引超出了范圍時(shí),Python會(huì)報(bào)一個(gè)<font color=#0099ff>IndexError</font>錯(cuò)誤。由于索引是從<font color=#0099ff>0</font>開始的,最后一個(gè)元素的索引是<font color=#0099ff>列表長(zhǎng)度 - 1</font>。?python支持從列表最后取元素,如果要取最后一個(gè)元素,可以用<font color=#0099ff>-1</font>做索引,直接獲取最后一個(gè)元素:當(dāng)索引超出了范圍時(shí),Python會(huì)報(bào)一個(gè)IndexError錯(cuò)誤。由于索引是從0開始的,最后一個(gè)元素的索引是列表長(zhǎng)度 - 1。 python支持從列表最后取元素,如果要取最后一個(gè)元素,可以用-1做索引,直接獲取最后一個(gè)元素: In [15]: week[-1]Out[15]: 'Friday' In [16]: week[-4]Out[16]: 'Tuesday' 由于list是一個(gè)可變的有序表,所以我們可以往list中追加元素到末尾:由于list是一個(gè)可變的有序表,所以我們可以往list中追加元素到末尾: In [17]: week.append('Saturday')weekOut[17]: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 還可以吧元素插入到指定的位置,比如索引號(hào)為<font color=#0099ff>6</font>的位置:還可以吧元素插入到指定的位置,比如索引號(hào)為6的位置: In [18]: week.insert(6,'Sunday')weekOut[18]: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 刪除list末尾的元素,使用<font color=#0099ff>pop()</font>方法:刪除list末尾的元素,使用pop()方法: In [19]: week.pop()weekOut[19]: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 刪除list中指定位置的元素,使用<font color=#0099ff>pop(i)</font>方法,<font color=#0099ff>i</font>是對(duì)應(yīng)的索引位置:刪除list中指定位置的元素,使用pop(i)方法,i是對(duì)應(yīng)的索引位置: In [20]: week.pop(1)weekOut[20]: ['Monday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 把某個(gè)元素替換成別的元素,可以直接賦值給對(duì)應(yīng)的索引位置:把某個(gè)元素替換成別的元素,可以直接賦值給對(duì)應(yīng)的索引位置: In [21]: week[0] = 'Tuesday'weekOut[21]: ['Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] ### Python 的列表數(shù)據(jù)類型包含更多的方法。?<font color=#0099ff>list.append(x)</font> 把一個(gè)元素添加到列表的結(jié)尾。?<font color=#0099ff>list.extend(L)</font> 將一個(gè)給定列表中的所有元素都添加到另一個(gè)列表中。?<font color=#0099ff>list.insert(i, x)</font> 在指定位置插入一個(gè)元素。第一個(gè)參數(shù)是準(zhǔn)備插入到其前面的那個(gè)元素的索引,例如 a.insert(0, x) 會(huì)插入到整個(gè)列表之前,而 a.insert(len(a), x) 相當(dāng)于 a.append(x)。?<font color=#0099ff>list.remove(x)</font> 刪除列表中值為 x 的第一個(gè)元素。如果沒(méi)有這樣的元素,就會(huì)返回一個(gè)錯(cuò)誤。?<font color=#0099ff>list.pop([i])</font> 從列表的指定位置刪除元素,并將其返回。如果沒(méi)有指定索引,a.pop() 返回最后一個(gè)元素。元素隨即從鏈表中被刪除。(方法中 i 兩邊的方括號(hào)表示這個(gè)參數(shù)是可選的,而不是要求你輸入一對(duì)方括號(hào),這個(gè)經(jīng)常會(huì)在 Python 庫(kù)參考手冊(cè)中遇到這樣的標(biāo)記。)?<font color=#0099ff>list.index(x)</font> 返回列表中第一個(gè)值為 x 的元素的索引。如果沒(méi)有匹配的元素就會(huì)返回一個(gè)錯(cuò)誤。?<font color=#0099ff>list.count(x)</font> 返回 x 在鏈表中出現(xiàn)的次數(shù)。?<font color=#0099ff>list.sort(cmp=None, key=None, reverse=False)</font> 對(duì)列表中的元素進(jìn)行排序(參數(shù)可以用來(lái)自定義排序方法,參考 sorted() 的更詳細(xì)的解釋)。?<font color=#0099ff>list.reverse()</font> 就地倒排鏈表中的元素?<font color=#0099ff>del list[i] </font>有個(gè)方法可以從列表中按給定的索引而不是值來(lái)刪除一個(gè)子項(xiàng):del 語(yǔ)句。它不同于有返回值的 pop() 方法。語(yǔ)句 del 還可以從列表中刪除切片或清空整個(gè)列表(我們以前介紹過(guò)一個(gè)方法是將空列表賦值給列表的切片)。Python 的列表數(shù)據(jù)類型包含更多的方法。?list.append(x) 把一個(gè)元素添加到列表的結(jié)尾。 list.extend(L) 將一個(gè)給定列表中的所有元素都添加到另一個(gè)列表中。 list.insert(i, x) 在指定位置插入一個(gè)元素。第一個(gè)參數(shù)是準(zhǔn)備插入到其前面的那個(gè)元素的索引,例如 a.insert(0, x) 會(huì)插入到整個(gè)列表之前,而 a.insert(len(a), x) 相當(dāng)于 a.append(x)。 list.remove(x) 刪除列表中值為 x 的第一個(gè)元素。如果沒(méi)有這樣的元素,就會(huì)返回一個(gè)錯(cuò)誤。 list.pop([i]) 從列表的指定位置刪除元素,并將其返回。如果沒(méi)有指定索引,a.pop() 返回最后一個(gè)元素。元素隨即從鏈表中被刪除。(方法中 i 兩邊的方括號(hào)表示這個(gè)參數(shù)是可選的,而不是要求你輸入一對(duì)方括號(hào),這個(gè)經(jīng)常會(huì)在 Python 庫(kù)參考手冊(cè)中遇到這樣的標(biāo)記。) list.index(x) 返回列表中第一個(gè)值為 x 的元素的索引。如果沒(méi)有匹配的元素就會(huì)返回一個(gè)錯(cuò)誤。 list.count(x) 返回 x 在鏈表中出現(xiàn)的次數(shù)。 list.sort(cmp=None, key=None, reverse=False) 對(duì)列表中的元素進(jìn)行排序(參數(shù)可以用來(lái)自定義排序方法,參考 sorted() 的更詳細(xì)的解釋)。 list.reverse() 就地倒排鏈表中的元素 del list[i] 有個(gè)方法可以從列表中按給定的索引而不是值來(lái)刪除一個(gè)子項(xiàng):del 語(yǔ)句。它不同于有返回值的 pop() 方法。語(yǔ)句 del 還可以從列表中刪除切片或清空整個(gè)列表(我們以前介紹過(guò)一個(gè)方法是將空列表賦值給列表的切片)。 ## 字典(dictionary)字典在某些語(yǔ)言中可能稱為 聯(lián)合內(nèi)存 (associative memories) 或 聯(lián)合數(shù)組 (associative arrays)。序列是以連續(xù)的整數(shù)為索引,與此不同的是,字典以"關(guān)鍵字"為索引,關(guān)鍵字可以是任意不可變類型,通常用字符串或數(shù)值。如果元組中只包含字符串和數(shù)字,它可以作為關(guān)鍵字,如果它直接或間接地包含了可變對(duì)象,就不能當(dāng)做關(guān)鍵字。不能用列表做關(guān)鍵字,因?yàn)榱斜砜梢杂盟饕?、切割或?append() 和 extend() 等方法改變。?字典是無(wú)序的鍵:值對(duì) (key:value 對(duì))集合,鍵必須是互不相同的(在同一個(gè)字典之內(nèi))。使用大括號(hào)創(chuàng)建一個(gè)空的字典:{}。初始化列表時(shí),在大括號(hào)內(nèi)放置一組逗號(hào)分隔的鍵:值對(duì),這也是字典輸出的方式。?字典的主要操作是依據(jù)鍵來(lái)存儲(chǔ)和取值。也可以用 del 來(lái)刪除鍵:值對(duì)(key:value),從一個(gè)不存在的鍵中取值會(huì)導(dǎo)致錯(cuò)誤。字典(dictionary)?字典在某些語(yǔ)言中可能稱為 聯(lián)合內(nèi)存 (associative memories) 或 聯(lián)合數(shù)組 (associative arrays)。序列是以連續(xù)的整數(shù)為索引,與此不同的是,字典以"關(guān)鍵字"為索引,關(guān)鍵字可以是任意不可變類型,通常用字符串或數(shù)值。如果元組中只包含字符串和數(shù)字,它可以作為關(guān)鍵字,如果它直接或間接地包含了可變對(duì)象,就不能當(dāng)做關(guān)鍵字。不能用列表做關(guān)鍵字,因?yàn)榱斜砜梢杂盟饕?、切割或?append() 和 extend() 等方法改變。 字典是無(wú)序的鍵:值對(duì) (key:value 對(duì))集合,鍵必須是互不相同的(在同一個(gè)字典之內(nèi))。使用大括號(hào)創(chuàng)建一個(gè)空的字典:{}。初始化列表時(shí),在大括號(hào)內(nèi)放置一組逗號(hào)分隔的鍵:值對(duì),這也是字典輸出的方式。 字典的主要操作是依據(jù)鍵來(lái)存儲(chǔ)和取值。也可以用 del 來(lái)刪除鍵:值對(duì)(key:value),從一個(gè)不存在的鍵中取值會(huì)導(dǎo)致錯(cuò)誤。 In [22]: d = {'rice':35, 'wheat':101, 'corn':67}print(d)print(d['rice']){'corn': 67, 'wheat': 101, 'rice': 35}
35
把數(shù)據(jù)放入dict還可以直接通過(guò)key放入:把數(shù)據(jù)放入dict還可以直接通過(guò)key放入: In [23]: d['egg'] = 33dOut[23]: {'corn': 67, 'egg': 33, 'rice': 35, 'wheat': 101}一個(gè)key只能對(duì)應(yīng)一個(gè)value,多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉:一個(gè)key只能對(duì)應(yīng)一個(gè)value,多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉: In [24]: d['corn'] = 88dOut[24]: {'corn': 88, 'egg': 33, 'rice': 35, 'wheat': 101}如果key不存在,dict就會(huì)報(bào)錯(cuò)。要避免key不存在的錯(cuò)誤,有兩種辦法,一是通過(guò)<font color=#0099ff> in </font>判斷key是否存在,二是通過(guò)dict提供的<font color=#0099ff> get </font>方法,如果key不存在,可以返回None(返回None的時(shí)候Python的交互式命令行不顯示結(jié)果),或者自己指定的value:如果key不存在,dict就會(huì)報(bào)錯(cuò)。要避免key不存在的錯(cuò)誤,有兩種辦法,一是通過(guò) in 判斷key是否存在,二是通過(guò)dict提供的 get 方法,如果key不存在,可以返回None(返回None的時(shí)候Python的交互式命令行不顯示結(jié)果),或者自己指定的value: In [25]: d['meat']--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-25-d3e7ffd8023e> in <module>() ----> 1 d['meat'] KeyError: 'meat' In [26]: 'meat' in dOut[26]: False In [27]: d.get('meat')In [28]: d.get('meat',45)Out[28]: 45 刪除一個(gè)key,使用<font color=#0099ff>pop(key)</font>方法,對(duì)應(yīng)的value也會(huì)從dict中刪除:刪除一個(gè)key,使用pop(key)方法,對(duì)應(yīng)的value也會(huì)從dict中刪除: In [29]: d.pop('rice')dOut[29]: {'corn': 88, 'egg': 33, 'wheat': 101}有下面幾點(diǎn)需要注意:1. dict內(nèi)部存放的順序和key放入的順序是沒(méi)有關(guān)系的2. dict查找和插入的速度極快,不會(huì)隨著key的增加而增加,但是需要占用大量的內(nèi)存,內(nèi)存浪費(fèi)多3. dict的key必須是<font color=red>**不可變對(duì)象**</font>。字符串、整數(shù)等都是不可變的,可以放心地作為key,而list是可變的,就不能作為key:有下面幾點(diǎn)需要注意:
In [30]: k = [3,4,5]d[k] = 6---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-30-725fccd6cc45> in <module>()
1 k = [3,4,5]
----> 2 d[k] = 6
TypeError: unhashable type: 'list'
### **常見字典操作方法** ?<font color=#0099ff>D.clear()</font> 刪除字典內(nèi)所有元素?<font color=#0099ff>D.copy()</font> 返回一個(gè)字典的復(fù)制?<font color=#0099ff>D.fromkeys(seq,val)</font> 創(chuàng)建一個(gè)新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對(duì)應(yīng)的初始值?<font color=#0099ff>D.get(key, default=None)</font> 返回指定鍵的值,如果值不在字典中返回default值?<font color=#0099ff>D.has_key(key)</font> 如果鍵在字典dict里返回true,否則返回false?<font color=#0099ff>D.items()</font> 以列表返回可遍歷的(鍵, 值) 元組數(shù)組?<font color=#0099ff>D.keys()</font> 以列表返回一個(gè)字典所有的D.keys()以列表返回一個(gè)字典所有的鍵?<font color=#0099ff>D.setdefault(key, default=None) </font> 和get()類似, 但如果鍵不存在于字典中,將會(huì)添加鍵并將值設(shè)為default?<font color=#0099ff>D.update(dict2) </font> 把字典dict2的鍵/值對(duì)更新到dict里?<font color=#0099ff>D.values() </font> 以列表返回字典中的所有值?<font color=#0099ff>D.pop(key) </font> 刪除一個(gè)鍵并返回它的值,類似于列表的pop,只不過(guò)刪除的是一個(gè)鍵不是一個(gè)可選的位置?<font color=#0099ff>del D[key] </font> 刪除鍵?<font color=#0099ff>D[key] </font> = 42新增或修改鍵?### 字典用法注意事項(xiàng):?1. 序列運(yùn)算無(wú)效,字典元素間是沒(méi)有順序的概念?2. 對(duì)新索引賦值會(huì)添加項(xiàng)?3. 鍵不一定總是字符串??常見字典操作方法?D.clear() 刪除字典內(nèi)所有元素 D.copy() 返回一個(gè)字典的復(fù)制 D.fromkeys(seq,val) 創(chuàng)建一個(gè)新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對(duì)應(yīng)的初始值 D.get(key, default=None) 返回指定鍵的值,如果值不在字典中返回default值 D.has_key(key) 如果鍵在字典dict里返回true,否則返回false D.items() 以列表返回可遍歷的(鍵, 值) 元組數(shù)組 D.keys() 以列表返回一個(gè)字典所有的D.keys()以列表返回一個(gè)字典所有的鍵 D.setdefault(key, default=None) 和get()類似, 但如果鍵不存在于字典中,將會(huì)添加鍵并將值設(shè)為default D.update(dict2) 把字典dict2的鍵/值對(duì)更新到dict里 D.values() 以列表返回字典中的所有值 D.pop(key) 刪除一個(gè)鍵并返回它的值,類似于列表的pop,只不過(guò)刪除的是一個(gè)鍵不是一個(gè)可選的位置 del D[key] 刪除鍵 D[key] = 42新增或修改鍵 字典用法注意事項(xiàng):?
### 多種構(gòu)造字典方式?<font color=#0099ff>dict()</font> 構(gòu)造函數(shù)可以直接從 key-value 對(duì)中創(chuàng)建字典多種構(gòu)造字典方式?dict() 構(gòu)造函數(shù)可以直接從 key-value 對(duì)中創(chuàng)建字典 In [31]: dict([('john', 4139), ('mike', 4127), ('lucy', 4098)])Out[31]: {'john': 4139, 'lucy': 4098, 'mike': 4127}In [32]: dict.fromkeys(['a','b'],0) #創(chuàng)建一個(gè)新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對(duì)應(yīng)的初始值Out[32]: {'a': 0, 'b': 0}In [33]: dict(zip(['a','b','c'],[1,2,3]))Out[33]: {'a': 1, 'b': 2, 'c': 3}In [34]: {k:v for (k,v) in zip(['a','b','c'],[1,2,3])}Out[34]: {'a': 1, 'b': 2, 'c': 3}此外,字典推導(dǎo)式可以從任意的鍵值表達(dá)式中創(chuàng)建字典:此外,字典推導(dǎo)式可以從任意的鍵值表達(dá)式中創(chuàng)建字典: In [35]: {x: x**2 for x in (2, 4, 6)}Out[35]: {2: 4, 4: 16, 6: 36}如果關(guān)鍵字都是簡(jiǎn)單的字符串,有時(shí)通過(guò)關(guān)鍵字參數(shù)指定 key-value 對(duì)更為方便:如果關(guān)鍵字都是簡(jiǎn)單的字符串,有時(shí)通過(guò)關(guān)鍵字參數(shù)指定 key-value 對(duì)更為方便: In [36]: D = dict(a=1,b=2,c=3)D Out[36]: {'a': 1, 'b': 2, 'c': 3}In [37]: {c:c*4 for c in 'Zhongxinjiantou'}#默認(rèn)是集合Out[37]: {'Z': 'ZZZZ',
'a': 'aaaa',
'g': 'gggg',
'h': 'hhhh',
'i': 'iiii',
'j': 'jjjj',
'n': 'nnnn',
'o': 'oooo',
't': 'tttt',
'u': 'uuuu',
'x': 'xxxx'}In [38]: {c:c*4 for c in ['Zhongxinjiantou']}Out[38]: {'Zhongxinjiantou': 'ZhongxinjiantouZhongxinjiantouZhongxinjiantouZhongxinjiantou'}In [39]: {c.lower():c*4+'!' for c in 'Zhongxinjiantou'}Out[39]: {'a': 'aaaa!',
'g': 'gggg!',
'h': 'hhhh!',
'i': 'iiii!',
'j': 'jjjj!',
'n': 'nnnn!',
'o': 'oooo!',
't': 'tttt!',
'u': 'uuuu!',
'x': 'xxxx!',
'z': 'ZZZZ!'}## 元組(tuple)元組(tuple)?tuple是另一種有序的數(shù)據(jù)類型,與list比較類似。主要不同的一點(diǎn)是tuple被創(chuàng)建后就不能對(duì)其進(jìn)行修改。所以,tuple與list不同,沒(méi)有append(),pop(),insert()這些方法可以使用。獲取元素的方法和list是一樣的,可以通過(guò)索引來(lái)訪問(wèn)(也是從0開始的),只不過(guò)不能賦值成為其他的元素。?因?yàn)閠uple不可變,所以代碼更安全。如果可以的話,我們盡量使用tuple代替list。?### 創(chuàng)造元組?定義一個(gè)空的tuple,使用<font color=#0099ff> () </font>:tuple是另一種有序的數(shù)據(jù)類型,與list比較類似。主要不同的一點(diǎn)是tuple被創(chuàng)建后就不能對(duì)其進(jìn)行修改。所以,tuple與list不同,沒(méi)有append(),pop(),insert()這些方法可以使用。獲取元素的方法和list是一樣的,可以通過(guò)索引來(lái)訪問(wèn)(也是從0開始的),只不過(guò)不能賦值成為其他的元素。 因?yàn)閠uple不可變,所以代碼更安全。如果可以的話,我們盡量使用tuple代替list。 創(chuàng)造元組?定義一個(gè)空的tuple,使用 () : In [40]: t = ()tOut[40]: () 只有1個(gè)元素的元組在進(jìn)行定義的時(shí)候,需要加一個(gè)逗號(hào)<font color=#0099ff> **,** </font>來(lái)消除歧義,否則定義的就不是一個(gè)元組而是元素本身:只有1個(gè)元素的元組在進(jìn)行定義的時(shí)候,需要加一個(gè)逗號(hào) , 來(lái)消除歧義,否則定義的就不是一個(gè)元組而是元素本身: In [41]: t = (3)tOut[41]: 3 In [42]: t = (3,)tOut[42]: (3,) ### 元組的連接?如前面所說(shuō),元組是不可改的,但是可以連接?可以使用<font color=#0099ff> + </font>對(duì)元組進(jìn)行連接,例如:In [43]: t1 = (2,3,5)t2 = ('Zhongxinjiantou','python')t3 = t1 + t2t3Out[43]: (2, 3, 5, 'Zhongxinjiantou', 'python') ### 元組的刪除?元組中的元素不能被刪除,但是我們可以使用<font color=#0099ff> del </font>刪除整個(gè)元組,刪除后可以重新定義:?元組的刪除?元組中的元素不能被刪除,但是我們可以使用 del 刪除整個(gè)元組,刪除后可以重新定義: In [44]: t4 = ('a',2,'b')t4Out[44]: ('a', 2, 'b')In [45]: del t4t4---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-45-00422465996d> in <module>()
1 del t4
----> 2 t4
NameError: name 't4' is not defined
事實(shí)上,上面所說(shuō)的元素不變是指每個(gè)元素的指向永遠(yuǎn)不變。即指向<font color=#0099ff>1</font>,就不能改成指向<font color=#0099ff>2</font>,指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的,例如:事實(shí)上,上面所說(shuō)的元素不變是指每個(gè)元素的指向永遠(yuǎn)不變。即指向1,就不能改成指向2,指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的,例如: In [46]: tup = (1,2,[3,4,5])tupOut[46]: (1, 2, [3, 4, 5]) In [47]: tup[2][0] = 7tup[2][1] = 11tupOut[47]: (1, 2, [7, 11, 5]) ### Python 的元組數(shù)據(jù)類型包含更多的方法。?<font color=#0099ff>tup.index(x, [start, [stop]]))</font> 返回元組中start到stop索引中第一個(gè)值為 x 的元素在整個(gè)列表中的索引。如果沒(méi)有匹配的元素就會(huì)返回一個(gè)錯(cuò)誤。?<font color=#0099ff>tup.count(x)</font> 返回 x 在元組中出現(xiàn)的次數(shù)。?<font color=#0099ff>cmp(tuple1, tuple2)</font> 比較元組中兩個(gè)元素。?<font color=#0099ff>len(tuple)</font> 計(jì)算元組元素個(gè)數(shù)。?<font color=#0099ff>max(tuple)</font> 返回元組中元素最大值。?<font color=#0099ff>min(tuple)</font> 返回元組中元素最小值。?<font color=#0099ff>tuple(seq)</font> 將列表轉(zhuǎn)換為元組。?<font color=red>元組不提供字符串、列表和字典中的方法。</font> 如果相對(duì)元組排序,通常先得將它轉(zhuǎn)換為列表并使其成為一個(gè)可變對(duì)象,才能獲得使用排序方法,或使用sorted內(nèi)置方法。Python 的元組數(shù)據(jù)類型包含更多的方法。?tup.index(x, [start, [stop]])) 返回元組中start到stop索引中第一個(gè)值為 x 的元素在整個(gè)列表中的索引。如果沒(méi)有匹配的元素就會(huì)返回一個(gè)錯(cuò)誤。 tup.count(x) 返回 x 在元組中出現(xiàn)的次數(shù)。 cmp(tuple1, tuple2) 比較元組中兩個(gè)元素。 len(tuple) 計(jì)算元組元素個(gè)數(shù)。 max(tuple) 返回元組中元素最大值。 min(tuple) 返回元組中元素最小值。 tuple(seq) 將列表轉(zhuǎn)換為元組。 元組不提供字符串、列表和字典中的方法。 如果相對(duì)元組排序,通常先得將它轉(zhuǎn)換為列表并使其成為一個(gè)可變對(duì)象,才能獲得使用排序方法,或使用sorted內(nèi)置方法。 ## 集合(set)?與dict類似,set也是一組key的集合,但不存儲(chǔ)value。由于key不能重復(fù),所以,在set中,沒(méi)有重復(fù)的key。創(chuàng)建一個(gè)set,需要提供一個(gè)list作為輸入集合:集合(set)?與dict類似,set也是一組key的集合,但不存儲(chǔ)value。由于key不能重復(fù),所以,在set中,沒(méi)有重復(fù)的key。創(chuàng)建一個(gè)set,需要提供一個(gè)list作為輸入集合: In [48]: s = set([3,4,5])sOut[48]: {3, 4, 5}重復(fù)元素在set中會(huì)被自動(dòng)被過(guò)濾,通過(guò)<font color=#0099ff>add(key)</font>方法往set中添加元素,重復(fù)添加不會(huì)有效果,通過(guò)<font color=#0099ff>remove(key)</font>方法可以刪除元素,例如:重復(fù)元素在set中會(huì)被自動(dòng)被過(guò)濾,通過(guò)add(key)方法往set中添加元素,重復(fù)添加不會(huì)有效果,通過(guò)remove(key)方法可以刪除元素,例如: In [49]: s = set([3,3,4,4,5,5,6,6,7])sOut[49]: {3, 4, 5, 6, 7}In [50]: s.add(1)sOut[50]: {1, 3, 4, 5, 6, 7}In [51]: s.add(1)sOut[51]: {1, 3, 4, 5, 6, 7}In [52]: s.remove(5)sOut[52]: {1, 3, 4, 6, 7}由于set是無(wú)序和無(wú)重復(fù)元素的集合,所以兩個(gè)set可以做數(shù)學(xué)意義上的交并集等操作:由于set是無(wú)序和無(wú)重復(fù)元素的集合,所以兩個(gè)set可以做數(shù)學(xué)意義上的交并集等操作: In [53]: s1 = set([3,4,5,6])s2 = set([5,6,7,8,9])s1 & s2Out[53]: {5, 6}In [54]: s1 | s2Out[54]: {3, 4, 5, 6, 7, 8, 9}與dict一樣,set同樣不可以放入可變對(duì)象,因?yàn)闊o(wú)法判斷兩個(gè)可變對(duì)象是否相等,也就無(wú)法保證set內(nèi)部不會(huì)有重復(fù)元素。所以把list放入set,會(huì)報(bào)錯(cuò)。與dict一樣,set同樣不可以放入可變對(duì)象,因?yàn)闊o(wú)法判斷兩個(gè)可變對(duì)象是否相等,也就無(wú)法保證set內(nèi)部不會(huì)有重復(fù)元素。所以把list放入set,會(huì)報(bào)錯(cuò)。 In [55]: s = set([1,2,[1,2]])--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-55-806dee2b7dcf> in <module>() ----> 1 s = set([1,2,[1,2]]) TypeError: unhashable type: 'list' ## 總結(jié)總體而言,幾種基礎(chǔ)數(shù)據(jù)類型有相似之處,可根據(jù)實(shí)際應(yīng)用場(chǎng)景來(lái)選擇。總結(jié)?總體而言,幾種基礎(chǔ)數(shù)據(jù)類型有相似之處,可根據(jù)實(shí)際應(yīng)用場(chǎng)景來(lái)選擇。 |
|
|