版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Python基礎(chǔ)一、 Python中數(shù)據(jù)類(lèi)型在Python中,能夠直接處理的數(shù)據(jù)類(lèi)型有以下幾種:一、整數(shù)Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在Python程序中,整數(shù)的表示方法和數(shù)學(xué)上的寫(xiě)法一模一樣,例如:1,100,-8080,0,等等。計(jì)算機(jī)由于使用二進(jìn)制,所以,有時(shí)候用十六進(jìn)制表示整數(shù)比較方便,十六進(jìn)制用0x前綴和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。二、浮點(diǎn)數(shù)浮點(diǎn)數(shù)也就是小數(shù),之所以稱(chēng)為浮點(diǎn)數(shù),是因?yàn)榘凑湛茖W(xué)記數(shù)法表示時(shí),一個(gè)浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是可變的,比如,1.23x109和12.3x108是相等的。浮點(diǎn)數(shù)可以用數(shù)學(xué)寫(xiě)法,如1.23,3.
2、14,-9.01,等等。但是對(duì)于很大或很小的浮點(diǎn)數(shù),就必須用科學(xué)計(jì)數(shù)法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以寫(xiě)成1.2e-5,等等。整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,整數(shù)運(yùn)算永遠(yuǎn)是精確的(除法難道也是精確的?是的?。↑c(diǎn)數(shù)運(yùn)算則可能會(huì)有四舍五入的誤差。三、字符串字符串是以或括起來(lái)的任意文本,比如abc,xyz等等。請(qǐng)注意,或本身只是一種表示方式,不是字符串的一部分,因此,字符串a(chǎn)bc只有a,b,c這3個(gè)字符。四、布爾值布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有True、False兩種值,要么是True,要么是False,
3、在Python中,可以直接用True、False表示布爾值(請(qǐng)注意大小寫(xiě)),也可以通過(guò)布爾運(yùn)算計(jì)算出來(lái)。布爾值可以用and、or和not運(yùn)算。and運(yùn)算是與運(yùn)算,只有所有都為 True,and運(yùn)算結(jié)果才是 True。or運(yùn)算是或運(yùn)算,只要其中有一個(gè)為 True,or 運(yùn)算結(jié)果就是 True。not運(yùn)算是非運(yùn)算,它是一個(gè)單目運(yùn)算符,把 True 變成 False,F(xiàn)alse 變成 True。五、空值空值是Python里一個(gè)特殊的值,用None表示。None不能理解為0,因?yàn)?是有意義的,而None是一個(gè)特殊的空值。此外,Python還提供了列表、字典等多種數(shù)據(jù)類(lèi)型,還允許創(chuàng)建自定義數(shù)據(jù)類(lèi)型,我們
4、后面會(huì)繼續(xù)講到打印輸出print語(yǔ)句可以向屏幕上輸出指定的文字。比如輸出hello, world,用代碼實(shí)現(xiàn)如下: print hello, world二、 Python中的注釋Python的注釋以#開(kāi)頭,后面的文字直到行尾都算注釋三、 Python的變量在Python程序中,變量是用一個(gè)變量名表示,變量名必須是大小寫(xiě)英文、數(shù)字和下劃線(_)的組合,且不能用數(shù)字開(kāi)頭,比如:a = 1變量a是一個(gè)整數(shù)。t_007 = T007變量t_007是一個(gè)字符串。在Python中,等號(hào)=是賦值語(yǔ)句,可以把任意數(shù)據(jù)類(lèi)型賦值給變量,同一個(gè)變量可以反復(fù)賦值,而且可以是不同類(lèi)型的變量,例如:a = 123 # a
5、是整數(shù)print aa = imooc # a變?yōu)樽址畃rint a這種變量本身類(lèi)型不固定的語(yǔ)言稱(chēng)之為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言。靜態(tài)語(yǔ)言在定義變量時(shí)必須指定變量類(lèi)型,如果賦值的時(shí)候類(lèi)型不匹配,就會(huì)報(bào)錯(cuò)。例如Java是靜態(tài)語(yǔ)言,賦值語(yǔ)句如下(/ 表示注釋?zhuān)篿nt a = 123; / a是整數(shù)類(lèi)型變量a = mooc; / 錯(cuò)誤:不能把字符串賦給整型變量和靜態(tài)語(yǔ)言相比,動(dòng)態(tài)語(yǔ)言更靈活,就是這個(gè)原因。請(qǐng)不要把賦值語(yǔ)句的等號(hào)等同于數(shù)學(xué)的等號(hào)。比如下面的代碼:x = 10x = x + 2如果從數(shù)學(xué)上理解x = x + 2那無(wú)論如何是不成立的,在程序中,賦值語(yǔ)句先計(jì)算右側(cè)的表達(dá)式x + 2,
6、得到結(jié)果12,再賦給變量x。由于x之前的值是10,重新賦值后,x的值變成12。最后,理解變量在計(jì)算機(jī)內(nèi)存中的表示也非常重要。當(dāng)我們寫(xiě):a = ABC時(shí),Python解釋器干了兩件事情:1. 在內(nèi)存中創(chuàng)建了一個(gè)ABC的字符串;2. 在內(nèi)存中創(chuàng)建了一個(gè)名為a的變量,并把它指向ABC。也可以把一個(gè)變量a賦值給另一個(gè)變量b,這個(gè)操作實(shí)際上是把變量b指向變量a所指向的數(shù)據(jù),例如下面的代碼:a = ABCb = aa = XYZprint b最后一行打印出變量b的內(nèi)容到底是ABC呢還是XYZ?如果從數(shù)學(xué)意義上理解,就會(huì)錯(cuò)誤地得出b和a相同,也應(yīng)該是XYZ,但實(shí)際上b的值是ABC,讓我們一行一行地執(zhí)行代碼,
7、就可以看到到底發(fā)生了什么事:執(zhí)行a = ABC,解釋器創(chuàng)建了字符串 ABC和變量 a,并把a(bǔ)指向 ABC:執(zhí)行b = a,解釋器創(chuàng)建了變量 b,并把b指向 a 指向的字符串ABC:執(zhí)行a = XYZ,解釋器創(chuàng)建了字符串XYZ,并把a(bǔ)的指向改為XYZ,但b并沒(méi)有更改:所以,最后打印變量b的結(jié)果自然是ABC了。四、 數(shù)據(jù)類(lèi)型1. Python中定義字符串。字符串可以用或者括起來(lái)表示。如果字符串本身包含怎么辦?比如我們要表示字符串Im OK,這時(shí),可以用 括起來(lái)表示:Im OK類(lèi)似的,如果字符串包含,我們就可以用 括起來(lái)表示:Learn Python is useful如果字符串既包含又包含怎么辦?
8、這個(gè)時(shí)候,就需要對(duì)字符串的某些特殊字符進(jìn)行“轉(zhuǎn)義”,Python字符串用進(jìn)行轉(zhuǎn)義。要表示字符串Bob said Im OK.由于 和 會(huì)引起歧義,因此,我們?cè)谒懊娌迦胍粋€(gè)表示這是一個(gè)普通字符,不代表字符串的起始,因此,這個(gè)字符串又可以表示為:Bob said Im OK.注意:轉(zhuǎn)義字符 不計(jì)入字符串的內(nèi)容中。常用的轉(zhuǎn)義字符還有:n 表示換行t 表示一個(gè)制表符 表示 字符本身2. Python中raw字符串與多行字符串如果一個(gè)字符串包含很多需要轉(zhuǎn)義的字符,對(duì)每一個(gè)字符都進(jìn)行轉(zhuǎn)義會(huì)很麻煩。為了避免這種情況,我們可以在字符串前面加個(gè)前綴 r ,表示這是一個(gè)raw字符串,里面的字符就不需要轉(zhuǎn)義了。例
9、如:r(_)/ (_)/但是r.表示法不能表示多行字符串,也不能表示包含和 的字符串(為什么?)如果要表示多行字符串,可以用.表示:Line 1Line 2Line 3上面這個(gè)字符串的表示方法和下面的是完全一樣的:Line 1nLine 2nLine 3還可以在多行字符串前面添加 r ,把這個(gè)多行字符串也變成一個(gè)raw字符串:rPython is created by Guido.It is free and easy to learn.Lets start learn Python in imooc!3. Python中Unicode字符串字符串還有一個(gè)編碼問(wèn)題。因?yàn)橛?jì)算機(jī)只能處理數(shù)字,如果
10、要處理文本,就必須先把文本轉(zhuǎn)換為數(shù)字才能處理。最早的計(jì)算機(jī)在設(shè)計(jì)時(shí)采用8個(gè)比特(bit)作為一個(gè)字節(jié)(byte),所以,一個(gè)字節(jié)能表示的最大的整數(shù)就是255(二進(jìn)制11111111=十進(jìn)制255),0 - 255被用來(lái)表示大小寫(xiě)英文字母、數(shù)字和一些符號(hào),這個(gè)編碼表被稱(chēng)為ASCII編碼,比如大寫(xiě)字母A的編碼是65,小寫(xiě)字母z的編碼是122。如果要表示中文,顯然一個(gè)字節(jié)是不夠的,至少需要兩個(gè)字節(jié),而且還不能和ASCII編碼沖突,所以,中國(guó)制定了GB2312編碼,用來(lái)把中文編進(jìn)去。類(lèi)似的,日文和韓文等其他語(yǔ)言也有這個(gè)問(wèn)題。為了統(tǒng)一所有文字的編碼,Unicode應(yīng)運(yùn)而生。Unicode把所有語(yǔ)言都統(tǒng)一
11、到一套編碼里,這樣就不會(huì)再有亂碼問(wèn)題了。Unicode通常用兩個(gè)字節(jié)表示一個(gè)字符,原有的英文編碼從單字節(jié)變成雙字節(jié),只需要把高字節(jié)全部填為0就可以。因?yàn)镻ython的誕生比Unicode標(biāo)準(zhǔn)發(fā)布的時(shí)間還要早,所以最早的Python只支持ASCII編碼,普通的字符串ABC在Python內(nèi)部都是ASCII編碼的。Python在后來(lái)添加了對(duì)Unicode的支持,以Unicode表示的字符串用u.表示,比如:print u中文中文注意: 不加 u ,中文就不能正常顯示。Unicode字符串除了多了一個(gè) u 之外,與普通字符串沒(méi)啥區(qū)別,轉(zhuǎn)義字符和多行表示法仍然有效:轉(zhuǎn)義:u中文n日文n韓文多行:u第一行
12、第二行raw+多行:urPython的Unicode字符串支持中文,日文,韓文等多種語(yǔ)言如果中文字符串在Python環(huán)境下遇到 UnicodeDecodeError,這是因?yàn)?py文件保存的格式有問(wèn)題??梢栽诘谝恍刑砑幼⑨? -*- coding: utf-8 -*-目的是告訴Python解釋器,用UTF-8編碼讀取源代碼。然后用Notepad+ 另存為. 并選擇UTF-8格式保存。4. Python中整數(shù)和浮點(diǎn)數(shù)的運(yùn)算Python支持對(duì)整數(shù)和浮點(diǎn)數(shù)直接進(jìn)行四則混合運(yùn)算,運(yùn)算規(guī)則和數(shù)學(xué)上的四則運(yùn)算規(guī)則完全一致?;镜倪\(yùn)算:1 + 2 + 3 # = 64 * 5 - 6 # = 147.5 /
13、 8 + 2.1 # = 3.0375使用括號(hào)可以提升優(yōu)先級(jí),這和數(shù)學(xué)運(yùn)算完全一致,注意只能使用小括號(hào),但是括號(hào)可以嵌套很多層:(1 + 2) * 3 # = 9(2.2 + 3.3) / (1.5 * (9 - 0.3) # = 0.42145593869731807和數(shù)學(xué)運(yùn)算不同的地方是,Python的整數(shù)運(yùn)算結(jié)果仍然是整數(shù),浮點(diǎn)數(shù)運(yùn)算結(jié)果仍然是浮點(diǎn)數(shù):1 + 2 # = 整數(shù) 31.0 + 2.0 # = 浮點(diǎn)數(shù) 3.0但是整數(shù)和浮點(diǎn)數(shù)混合運(yùn)算的結(jié)果就變成浮點(diǎn)數(shù)了:1 + 2.0 # = 浮點(diǎn)數(shù) 3.0為什么要區(qū)分整數(shù)運(yùn)算和浮點(diǎn)數(shù)運(yùn)算呢?這是因?yàn)檎麛?shù)運(yùn)算的結(jié)果永遠(yuǎn)是精確的,而浮點(diǎn)數(shù)運(yùn)算的
14、結(jié)果不一定精確,因?yàn)橛?jì)算機(jī)內(nèi)存再大,也無(wú)法精確表示出無(wú)限循環(huán)小數(shù),比如 0.1 換成二進(jìn)制表示就是無(wú)限循環(huán)小數(shù)。那整數(shù)的除法運(yùn)算遇到除不盡的時(shí)候,結(jié)果難道不是浮點(diǎn)數(shù)嗎?我們來(lái)試一下:11 / 4 # = 2令很多初學(xué)者驚訝的是,Python的整數(shù)除法,即使除不盡,結(jié)果仍然是整數(shù),余數(shù)直接被扔掉。不過(guò),Python提供了一個(gè)求余的運(yùn)算 % 可以計(jì)算余數(shù):11 % 4 # = 3如果我們要計(jì)算 11 / 4 的精確結(jié)果,按照“整數(shù)和浮點(diǎn)數(shù)混合運(yùn)算的結(jié)果是浮點(diǎn)數(shù)”的法則,把兩個(gè)數(shù)中的一個(gè)變成浮點(diǎn)數(shù)再運(yùn)算就沒(méi)問(wèn)題了:11.0 / 4 # = 2.755. Python中布爾類(lèi)型我們已經(jīng)了解了Pytho
15、n支持布爾類(lèi)型的數(shù)據(jù),布爾類(lèi)型只有True和False兩種值,但是布爾類(lèi)型有以下幾種運(yùn)算:與運(yùn)算:只有兩個(gè)布爾值都為 True 時(shí),計(jì)算結(jié)果才為 True。True and True # = TrueTrue and False # = FalseFalse and True # = FalseFalse and False # = False或運(yùn)算:只要有一個(gè)布爾值為 True,計(jì)算結(jié)果就是 True。True or True # = TrueTrue or False # = TrueFalse or True # = TrueFalse or False # = False非運(yùn)算:把Tr
16、ue變?yōu)镕alse,或者把False變?yōu)門(mén)rue:not True # = Falsenot False # = True布爾運(yùn)算在計(jì)算機(jī)中用來(lái)做條件判斷,根據(jù)計(jì)算結(jié)果為T(mén)rue或者False,計(jì)算機(jī)可以自動(dòng)執(zhí)行不同的后續(xù)代碼。在Python中,布爾類(lèi)型還可以與其他數(shù)據(jù)類(lèi)型做 and、or和not運(yùn)算,請(qǐng)看下面的代碼:a = Trueprint a and a=T or a=F計(jì)算結(jié)果不是布爾類(lèi)型,而是字符串 a=T,這是為什么呢?因?yàn)镻ython把0、空字符串和None看成False,其他數(shù)值和非空字符串都看成 True,所以:True and a=T 計(jì)算結(jié)果是 a=T繼續(xù)計(jì)算 a=T o
17、r a=F 計(jì)算結(jié)果還是 a=T要解釋上述結(jié)果,又涉及到 and 和 or 運(yùn)算的一條重要法則:短路計(jì)算。1.在計(jì)算 a and b 時(shí),如果 a 是 False,則根據(jù)與運(yùn)算法則,整個(gè)結(jié)果必定為 False,因此返回 a;如果 a 是 True,則整個(gè)計(jì)算結(jié)果必定取決與 b,因此返回 b。2. 在計(jì)算 a or b 時(shí),如果 a 是 True,則根據(jù)或運(yùn)算法則,整個(gè)計(jì)算結(jié)果必定為 True,因此返回 a;如果 a 是 False,則整個(gè)計(jì)算結(jié)果必定取決于 b,因此返回 b。所以Python解釋器在做布爾運(yùn)算時(shí),只要能提前確定計(jì)算結(jié)果,它就不會(huì)往后算了,直接返回結(jié)果。五、 PythonList
18、1. Python創(chuàng)建listPython內(nèi)置的一種數(shù)據(jù)類(lèi)型是列表:list。list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。比如,列出班里所有同學(xué)的名字,就可以用一個(gè)list表示: Michael, Bob, Tracylist是數(shù)學(xué)意義上的有序集合,也就是說(shuō),list中的元素是按照順序排列的。2. Python按照索引訪問(wèn)list由于list是一個(gè)有序集合,所以,我們可以用一個(gè)list按分?jǐn)?shù)從高到低表示出班里的3個(gè)同學(xué): L = Adam, Lisa, Bart那我們?nèi)绾螐膌ist中獲取指定第 N 名的同學(xué)呢需要特別注意的是,索引從 0 開(kāi)始,也就是說(shuō),第一個(gè)元素的索引是0,第二個(gè)
19、元素的索引是1,以此類(lèi)推。因此,要打印第一名同學(xué)的名字,用 L0: print L0Adam要打印第二名同學(xué)的名字,用 L1: print L1Lisa要打印第四名同學(xué)的名字,用 L3: print L34 (most recent call last): File , line 1, in IndexError: list index out of range報(bào)錯(cuò)了!IndexError意思就是索引超出了范圍,因?yàn)樯厦娴膌ist只有3個(gè)元素,有效的索引是 0,1,2。所以,使用索引時(shí),千萬(wàn)注意不要越界。3. Python之倒序訪問(wèn)listList的倒序檢索:最后一個(gè)為L(zhǎng)-1,倒數(shù)第二個(gè)為L(zhǎng)-
20、2 .注意倒序檢索也不能越界!4. Python之添加新元素append();在集合最后邊添加新的元素;L.insert(0, Paul);把元素插入到定義的位置?,F(xiàn)在,班里有3名同學(xué): L = Adam, Lisa, Bart今天,班里轉(zhuǎn)來(lái)一名新同學(xué) Paul,如何把新同學(xué)添加到現(xiàn)有的 list 中呢?第一個(gè)辦法是用 list 的 append() 方法,把新同學(xué)追加到 list 的末尾: L = Adam, Lisa, Bart L.append(Paul) print LAdam, Lisa, Bart, Paulappend()總是把新的元素添加到 list 的尾部。如果 Paul 同
21、學(xué)表示自己總是考滿(mǎn)分,要求添加到第一的位置,怎么辦?方法是用list的 insert()方法,它接受兩個(gè)參數(shù),第一個(gè)參數(shù)是索引號(hào),第二個(gè)參數(shù)是待添加的新元素: L = Adam, Lisa, Bart L.insert(0, Paul) print LPaul, Adam, Lisa, BartL.insert(0, Paul) 的意思是,Paul將被添加到索引為 0 的位置上(也就是第一個(gè)),而原來(lái)索引為 0 的Adam同學(xué),以及后面的所有同學(xué),都自動(dòng)向后移動(dòng)一位。5. Python從list刪除元素L.pop() 刪除集合的最后一個(gè)元素L.pop(元素下標(biāo))刪除指定下標(biāo)的元素6. Pyth
22、on中替換元素L要替換的下標(biāo)=要替換的元素(也可用倒序索引)。7. Python之創(chuàng)建tupletuple是另一種有序的列表,中文翻譯為“元組”。tuple 和 list 非常類(lèi)似,但是,tuple一旦創(chuàng)建完畢,就不能修改了。同樣是表示班里同學(xué)的名稱(chēng),用tuple表示如下: t = (Adam, Lisa, Bart)創(chuàng)建tuple和創(chuàng)建list唯一不同之處是用( )替代了 。8. Python之創(chuàng)建單元素tupletuple和list一樣,可以包含 0 個(gè)、1個(gè)和任意多個(gè)元素。包含多個(gè)元素的 tuple,前面我們已經(jīng)創(chuàng)建過(guò)了。包含 0 個(gè)元素的 tuple,也就是空tuple,直接用 ()表
23、示:創(chuàng)建包含1個(gè)元素的 tuple 呢?來(lái)試試: t = (1) print t1好像哪里不對(duì)!t 不是 tuple ,而是整數(shù)1。為什么呢?因?yàn)?)既可以表示tuple,又可以作為括號(hào)表示運(yùn)算時(shí)的優(yōu)先級(jí),結(jié)果 (1) 被Python解釋器計(jì)算出結(jié)果 1,導(dǎo)致我們得到的不是tuple,而是整數(shù) 1。正是因?yàn)橛?)定義單元素的tuple有歧義,所以 Python 規(guī)定,單元素 tuple 要多加一個(gè)逗號(hào)“,”,這樣就避免了歧義: t = (1,) #單個(gè)tuple需在元素后加逗號(hào) print t(1,)Python在打印單元素tuple時(shí),也自動(dòng)添加了一個(gè)“,”,為了更明確地告訴你這是一個(gè)tup
24、le。多元素 tuple 加不加這個(gè)額外的“,”效果是一樣的: t = (1, 2, 3,) print t(1, 2, 3)9. Python之“可變”的tuple前面我們看到了tuple一旦創(chuàng)建就不能修改?,F(xiàn)在,我們來(lái)看一個(gè)“可變”的tuple: t = (a, b, A, B)注意到 t 有 3 個(gè)元素:a,b和一個(gè)list:A, B。list作為一個(gè)整體是tuple的第3個(gè)元素。list對(duì)象可以通過(guò) t2 拿到: L = t2然后,我們把list的兩個(gè)元素改一改: L0 = X L1 = Y再看看tuple的內(nèi)容: print t(a, b, X, Y)tuple包含的3個(gè)元素存儲(chǔ)分析
25、:當(dāng)我們把list的元素A和B修改為X和Y后,tuple變?yōu)椋簍uple所謂的“不變”是說(shuō),tuple的每個(gè)元素,指向永遠(yuǎn)不變。即指向a,就不能改成指向b,指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的!理解了“指向不變”后,要?jiǎng)?chuàng)建一個(gè)內(nèi)容也不變的tuple就必須保證tuple的每一個(gè)元素本身也不能變。六、 Python判斷、循環(huán)1. Python之if語(yǔ)句If示例,注意縮進(jìn)age = 20if age = 18: print your age is, ageprint adultelse: print age is smaller than 18print END
26、注意:Python代碼的縮進(jìn)規(guī)則。具有相同縮進(jìn)的代碼被視為代碼塊,上面的3,4行 print 語(yǔ)句就構(gòu)成一個(gè)代碼塊(但不包括第5行的print)。如果 if 語(yǔ)句判斷為 True,就會(huì)執(zhí)行這個(gè)代碼塊。縮進(jìn)請(qǐng)嚴(yán)格按照Python的習(xí)慣寫(xiě)法:4個(gè)空格,不要使用Tab,更不要混合Tab和空格,否則很容易造成因?yàn)榭s進(jìn)引起的語(yǔ)法錯(cuò)誤。注意: if 語(yǔ)句后接表達(dá)式,然后用:表示代碼塊開(kāi)始。如果你在Python交互環(huán)境下敲代碼,還要特別留意縮進(jìn),并且退出縮進(jìn)需要多敲一行回車(chē):2. Python之 if-elif-else要避免嵌套結(jié)構(gòu)的 if . else .,我們可以用 if . 多個(gè)elif . els
27、e . 的結(jié)構(gòu),一次寫(xiě)完所有的規(guī)則:if age = 18: print adultelif age = 6: print teenagerelif age = 3: print kidelse: print babyelif 意思就是 else if。這樣一來(lái),我們就寫(xiě)出了結(jié)構(gòu)非常清晰的一系列條件判斷。特別注意:這一系列條件判斷會(huì)從上到下依次判斷,如果某個(gè)判斷為 True,執(zhí)行完對(duì)應(yīng)的代碼塊,后面的條件判斷就直接忽略,不再執(zhí)行了。3. Python之 for循環(huán)list或tuple可以表示一個(gè)有序集合。如果我們想依次訪問(wèn)一個(gè)list中的每一個(gè)元素呢?比如 list:Python的 for 循
28、環(huán)就可以依次把list或tuple的每個(gè)元素迭代出來(lái):L = Adam, Lisa, Bartfor name in L: print name注意:name 這個(gè)變量是在 for 循環(huán)中定義的,意思是,依次取出list中的每一個(gè)元素,并把元素賦值給 name,然后執(zhí)行for循環(huán)體(就是縮進(jìn)的代碼塊)。4. Python之 while循環(huán)和 for 循環(huán)不同的另一種循環(huán)是 while 循環(huán),while 循環(huán)不會(huì)迭代 list 或 tuple 的元素,而是根據(jù)表達(dá)式判斷循環(huán)是否結(jié)束。比如要從 0 開(kāi)始打印不大于 N 的整數(shù):N = 10x = 0while x N: print x x = x
29、+ 1while循環(huán)每次先判斷 x N,如果為T(mén)rue,則執(zhí)行循環(huán)體的代碼塊,否則,退出循環(huán)。在循環(huán)體內(nèi),x = x + 1 會(huì)讓 x 不斷增加,最終因?yàn)?x N 不成立而退出循環(huán)。如果沒(méi)有這一個(gè)語(yǔ)句,while循環(huán)在判斷 x 100: breakprint sum在循環(huán)體內(nèi),判斷了 x 100 條件成立時(shí),用break語(yǔ)句退出循環(huán),這樣也可以實(shí)現(xiàn)循環(huán)的結(jié)束。6. Python之 continue繼續(xù)循環(huán)在循環(huán)過(guò)程中,可以用break退出當(dāng)前循環(huán),還可以用continue跳過(guò)后續(xù)循環(huán)代碼,繼續(xù)下一次循環(huán)。計(jì)算平均分:L = 75, 98, 59, 81, 66, 43, 69, 85想要統(tǒng)計(jì)及
30、格分?jǐn)?shù)的平均分,就要把 x 60 的分?jǐn)?shù)剔除掉,這時(shí),利用 continue,可以做到當(dāng) x 60的時(shí)候,不繼續(xù)執(zhí)行循環(huán)體的后續(xù)代碼,直接進(jìn)入下一次循環(huán):for x in L: if x print d.get(Bart)59 print d.get(Paul)Noneu Python更新dictdict是可變的,也就是說(shuō),我們可以隨時(shí)往dict中添加新的 key-value。比如已有dict:d = Adam: 95, Lisa: 85, Bart: 59要把新同學(xué)Paul的成績(jī) 72 加進(jìn)去,用賦值語(yǔ)句: dPaul = 72如果 key 已經(jīng)存在,則賦值會(huì)用新的 value 替換掉原來(lái)的
31、 value:2. Python中dict的特點(diǎn)u dict的第一個(gè)特點(diǎn)是查找速度快,無(wú)論dict有10個(gè)元素還是10萬(wàn)個(gè)元素,查找速度都一樣。而list的查找速度隨著元素增加而逐漸下降。不過(guò)dict的缺點(diǎn)是占用內(nèi)存大,還會(huì)浪費(fèi)很多內(nèi)容,list正好相反,占用內(nèi)存小,但是查找速度慢。u dict的第二個(gè)特點(diǎn)就是存儲(chǔ)的key-value序?qū)κ菦](méi)有順序的!這和list不一樣:dict內(nèi)部是無(wú)序的,不能用dict存儲(chǔ)有序的集合。u dict的第三個(gè)特點(diǎn)是作為 key 的元素必須不可變,Python的基本類(lèi)型如字符串、整數(shù)、浮點(diǎn)數(shù)都是不可變的,都可以作為 key。但是list是可變的,就不能作為 ke
32、y。由于dict是按 key 查找,所以,在一個(gè)dict中,key不能重復(fù)。3. Python之 遍歷dict由于dict也是一個(gè)集合,所以,遍歷dict和遍歷list類(lèi)似,都可以通過(guò) for 循環(huán)實(shí)現(xiàn)。直接使用for循環(huán)可以遍歷 dict 的 key: d = Adam: 95, Lisa: 85, Bart: 59 for key in d:. print key. LisaAdamBart由于通過(guò) key 可以獲取對(duì)應(yīng)的 value,因此,在循環(huán)體內(nèi),可以獲取到value的值。4. Python-setu set 持有一系列元素,這一點(diǎn)和 list 很像,但是set的元素沒(méi)有重復(fù),而且是
33、無(wú)序的,這點(diǎn)和 dict 的 key很像。創(chuàng)建 set 的方式是調(diào)用 set() 并傳入一個(gè) list,list的元素將作為set的元素: s = set(A, B, C)u 由于set存儲(chǔ)的是無(wú)序集合,所以我們沒(méi)法通過(guò)索引來(lái)訪問(wèn)。訪問(wèn) set中的某個(gè)元素實(shí)際上就是判斷一個(gè)元素是否在set中。 B in s#此方法嚴(yán)格區(qū)分大小寫(xiě),如果是小寫(xiě)b,則返回falseTrue s = set(1, 2, 3) s.add(4)#set添加元素 print sset(1, 2, 3, 4)刪除set中的元素時(shí),用set的remove()方法: s = set(1, 2, 3, 4) s.remove(4
34、)#刪除set中的已有元素,刪之前需判斷元素是否存在,不存在的話會(huì)報(bào)錯(cuò) print sset(1, 2, 3)5. Python之 set的特點(diǎn)的應(yīng)用set的內(nèi)部結(jié)構(gòu)和dict很像,唯一區(qū)別是不存儲(chǔ)value,因此,判斷一個(gè)元素是否在set中速度很快。set存儲(chǔ)的元素和dict的key類(lèi)似,必須是不變對(duì)象,因此,任何可變對(duì)象是不能放入set中的。最后,set存儲(chǔ)的元素也是沒(méi)有順序的。常用來(lái)判斷對(duì)象是否包含在set里。6. Python之 遍歷set由于 set 也是一個(gè)集合,所以,遍歷 set 和遍歷 list 類(lèi)似,都可以通過(guò) for 循環(huán)實(shí)現(xiàn)。直接使用 for 循環(huán)可以遍歷 set 的元素
35、: s = set(Adam, Lisa, Bart) for name in s:. print name. LisaAdamBart注意:觀察 for 循環(huán)在遍歷set時(shí),元素的順序和list的順序很可能是不同的,而且不同的機(jī)器上運(yùn)行的結(jié)果也可能不同。八、 Python之函數(shù)1. 單返回參數(shù)函數(shù)在Python中,定義一個(gè)函數(shù)要使用 def 語(yǔ)句,依次寫(xiě)出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫(xiě)函數(shù)體,函數(shù)的返回值用return語(yǔ)句返回。我們以自定義一個(gè)求絕對(duì)值的 my_abs 函數(shù)為例:def my_abs(x): if x = 0: return x else: retu
36、rn -x請(qǐng)注意,函數(shù)體內(nèi)部的語(yǔ)句在執(zhí)行時(shí),一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過(guò)條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。return None可以簡(jiǎn)寫(xiě)為return。如果沒(méi)有return語(yǔ)句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為 None。2. 多個(gè)返回參數(shù)函數(shù)比如在游戲中經(jīng)常需要從一個(gè)點(diǎn)移動(dòng)到另一個(gè)點(diǎn),給出坐標(biāo)、位移和角度,就可以計(jì)算出新的坐標(biāo):# math包提供了sin()和cos()函數(shù),我們先用import引用它:import mathdef move(x, y, step, angle): nx = x + step * math.cos(ang
37、le) ny = y - step * math.sin(angle) return nx, ny這樣我們就可以同時(shí)獲得返回值: x, y = move(100, 100, 60, math.pi / 6) print x, y151.961524227 70.0但其實(shí)這只是一種假象,Python函數(shù)返回的仍然是單一值: r = move(100, 100, 60, math.pi / 6) print r(151.96152422706632, 70.0)用print打印返回結(jié)果,原來(lái)返回值是一個(gè)tuple!但是,在語(yǔ)法上,返回一個(gè)tuple可以省略括號(hào),而多個(gè)變量可以同時(shí)接收一個(gè)tuple
38、,按位置賦給對(duì)應(yīng)的值,所以,Python的函數(shù)返回多值其實(shí)就是返回一個(gè)tuple,但寫(xiě)起來(lái)更方便。3. Python之遞歸函數(shù)在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。舉個(gè)例子,我們來(lái)計(jì)算階乘 n! = 1 * 2 * 3 * . * n,用函數(shù)fact(n)表示,可以看出:fact(n) = n! = 1 * 2 * 3 * . * (n-1) * n = (n-1)! * n = fact(n-1) * n所以,fact(n)可以表示為 n * fact(n-1),只有n=1時(shí)需要特殊處理。于是,fact(n)用遞歸的方式寫(xiě)出來(lái)就是:def fac
39、t(n): if n=1: return 1 return n * fact(n - 1) fact(5)120 fact(100)93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L使用遞歸函數(shù)需要注意防止棧溢出。在計(jì)算機(jī)中,函數(shù)調(diào)用是通過(guò)棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧
40、就會(huì)減一層棧幀。由于棧的大小不是無(wú)限的,所以,遞歸調(diào)用的次數(shù)過(guò)多,會(huì)導(dǎo)致棧溢出??梢栽囋囉?jì)算 fact(10000)。4. Python之定義默認(rèn)參數(shù)定義函數(shù)的時(shí)候,還可以有默認(rèn)參數(shù)。例如Python自帶的 int() 函數(shù),其實(shí)就有兩個(gè)參數(shù),我們既可以傳一個(gè)參數(shù),又可以傳兩個(gè)參數(shù): int(123)123 int(123, 8)83int()函數(shù)的第二個(gè)參數(shù)是轉(zhuǎn)換進(jìn)制,如果不傳,默認(rèn)是十進(jìn)制 (base=10),如果傳了,就用傳入的參數(shù)??梢?jiàn),函數(shù)的默認(rèn)參數(shù)的作用是簡(jiǎn)化調(diào)用,你只需要把必須的參數(shù)傳進(jìn)去。但是在需要的時(shí)候,又可以傳入額外的參數(shù)來(lái)覆蓋默認(rèn)參數(shù)值。我們來(lái)定義一個(gè)計(jì)算 x 的N次方的
41、函數(shù):def power(x, n): s = 1 while n 0: n = n - 1 s = s * x return s假設(shè)計(jì)算平方的次數(shù)最多,我們就可以把 n 的默認(rèn)值設(shè)定為 2:def power(x, n=2): s = 1 while n 0: n = n - 1 s = s * x return s這樣一來(lái),計(jì)算平方就不需要傳入兩個(gè)參數(shù)了: power(5)25由于函數(shù)的參數(shù)按從左到右的順序匹配,所以默認(rèn)參數(shù)只能定義在必需參數(shù)的后面:# OK:def fn1(a, b=1, c=2): pass# Error:def fn2(a=1, b): pass5. Python之定
42、義可變參數(shù)如果想讓一個(gè)函數(shù)能接受任意個(gè)參數(shù),我們就可以定義一個(gè)可變參數(shù):def fn(*args): print args可變參數(shù)的名字前面有個(gè)*號(hào),我們可以傳入0個(gè)、1個(gè)或多個(gè)參數(shù)給可變參數(shù): fn () fn(a)(a,) fn(a, b)(a, b)可變參數(shù)也不是很神秘,Python解釋器會(huì)把傳入的一組參數(shù)組裝成一個(gè)tuple傳遞給可變參數(shù),因此,在函數(shù)內(nèi)部,直接把變量 args 看成一個(gè)tuple就好了。定義可變參數(shù)的目的也是為了簡(jiǎn)化調(diào)用。假設(shè)我們要計(jì)算任意個(gè)數(shù)的平均值,就可以定義一個(gè)可變參數(shù):def average(*args): .這樣,在調(diào)用的時(shí)候,可以這樣寫(xiě): average(
43、)0 average(1, 2)1.5九、 Python切片1. 對(duì)list進(jìn)行切片取一個(gè)list的部分元素是非常常見(jiàn)的操作。比如,一個(gè)list如下: L = Adam, Lisa, Bart, Paul取前3個(gè)元素,應(yīng)該怎么做?笨辦法: L0, L1, L2Adam, Lisa, Bart之所以是笨辦法是因?yàn)閿U(kuò)展一下,取前N個(gè)元素就沒(méi)轍了。取前N個(gè)元素,也就是索引為0-(N-1)的元素,可以用循環(huán): r = n = 3 for i in range(n):. r.append(Li). rAdam, Lisa, Bart對(duì)這種經(jīng)常取指定索引范圍的操作,用循環(huán)十分繁瑣,因此,Python提供了
44、切片(Slice)操作符,能大大簡(jiǎn)化這種操作。對(duì)應(yīng)上面的問(wèn)題,取前3個(gè)元素,用一行代碼就可以完成切片: L0:3Adam, Lisa, BartL0:3表示,從索引0開(kāi)始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個(gè)元素。如果第一個(gè)索引是0,還可以省略: L:3Adam, Lisa, Bart也可以從索引1開(kāi)始,取出2個(gè)元素出來(lái): L1:3Lisa, Bart只用一個(gè) : ,表示從頭到尾: L:Adam, Lisa, Bart, Paul因此,L:實(shí)際上復(fù)制出了一個(gè)新list。切片操作還可以指定第三個(gè)參數(shù): L:2Adam, Bart第三個(gè)參數(shù)表示每N個(gè)取一個(gè),上面的 L:2
45、 會(huì)每?jī)蓚€(gè)元素取出一個(gè)來(lái),也就是隔一個(gè)取一個(gè)。把list換成tuple,切片操作完全相同,只是切片的結(jié)果也變成了tuple。2. 倒序切片對(duì)于list,Python支持L-1取倒數(shù)第一個(gè)元素,它同樣支持倒數(shù)切片 L = Adam, Lisa, Bart, Paul L-2:Bart, Paul L:-2Adam, Lisa L-3:-1Lisa, Bart L-4:-1:2Adam, Bart倒數(shù)第一個(gè)元素的索引是-1。倒序切片包含起始索引,不包含結(jié)束索引。3. 對(duì)字符串切片字符串 xxx和 Unicode字符串 uxxx也可以看成是一種list,每個(gè)元素就是一個(gè)字符。因此,字符串也可以用切片
46、操作,只是操作結(jié)果仍是字符串: ABCDEFG:3ABC ABCDEFG-3:EFG ABCDEFG:2ACEG在很多編程語(yǔ)言中,針對(duì)字符串提供了很多各種截取函數(shù),其實(shí)目的就是對(duì)字符串切片。Python沒(méi)有針對(duì)字符串的截取函數(shù),只需要切片一個(gè)操作就可以完成,非常簡(jiǎn)單。十、 Python迭代1. 什么是迭代在Python中,如果給定一個(gè)list或tuple,我們可以通過(guò)for循環(huán)來(lái)遍歷這個(gè)list或tuple,這種遍歷我們成為迭代(Iteration)。在Python中,迭代是通過(guò)for . in來(lái)完成的,而很多語(yǔ)言比如C或者Java,迭代list是通過(guò)下標(biāo)完成的,比如Java代碼:for (i
47、=0; i L = Adam, Lisa, Bart, Paul for index, name in enumerate(L):. print index, -, name. 0 - Adam1 - Lisa2 - Bart3 - Paul使用 enumerate() 函數(shù),我們可以在for循環(huán)中同時(shí)綁定索引index和元素name。但是,這不是 enumerate() 的特殊語(yǔ)法。實(shí)際上,enumerate() 函數(shù)把:Adam, Lisa, Bart, Paul變成了類(lèi)似:(0, Adam), (1, Lisa), (2, Bart), (3, Paul)因此,迭代的每一個(gè)元素實(shí)際上是一個(gè)tuple:for t in enumerate(L): index = t0 name = t1 print index, -, name如果我們知道每個(gè)tuple元素都包含兩個(gè)元素,for循環(huán)又可以進(jìn)一步簡(jiǎn)寫(xiě)為:for index, name in enumerate(L): print index, -, name這樣不但代碼更簡(jiǎn)單,而且還少了兩條賦值語(yǔ)句
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)護(hù)坡后期維護(hù)管理方案
- 智能家居安保系統(tǒng)方案
- 商業(yè)綜合體施工進(jìn)場(chǎng)方案
- 智能家居蓄電池管理方案
- 高校信息安全道德教育方案
- 中學(xué)教師節(jié)發(fā)言稿:傳承知識(shí)與夢(mèng)想
- 藝術(shù)文化機(jī)構(gòu)財(cái)務(wù)管理方案
- 機(jī)械設(shè)備橋門(mén)式起重機(jī)事故應(yīng)對(duì)預(yù)案
- 牡丹江-PEP-24年小學(xué)4年級(jí)下冊(cè)英語(yǔ)第二單元真題試卷
- 任務(wù)驅(qū)動(dòng)法在高職康復(fù)治療技術(shù)課程中的運(yùn)用
- 發(fā)展?jié)h語(yǔ)(第二版)中級(jí)寫(xiě)作教案
- 熱交換器的定期檢驗(yàn)-全國(guó)壓力容器檢驗(yàn)員RQ-1
- 融資擔(dān)保機(jī)構(gòu)擔(dān)保代償管理指引
- GB 14194-1993永久氣體氣瓶充裝規(guī)定
- 如何做好行政執(zhí)法與刑事司法相銜接課件
- 注氮機(jī)司機(jī)講義
- 數(shù)據(jù)庫(kù)工程師考試大綱
- 小學(xué)數(shù)學(xué)西南師大六年級(jí)上冊(cè)七負(fù)數(shù)的初步認(rèn)識(shí) 西師大數(shù)學(xué)六上《負(fù)數(shù)的初步認(rèn)識(shí)》
- Proficy-Cimplicity-軟件介紹及入門(mén)提綱
- 2023年上海聯(lián)合產(chǎn)權(quán)交易所校園招聘筆試模擬試題及答案解析
- 加強(qiáng)區(qū)域環(huán)境管理,提高環(huán)境質(zhì)量的關(guān)鍵
評(píng)論
0/150
提交評(píng)論