python程序設(shè)計 課件 第2章 Python語法基礎(chǔ)_第1頁
python程序設(shè)計 課件 第2章 Python語法基礎(chǔ)_第2頁
python程序設(shè)計 課件 第2章 Python語法基礎(chǔ)_第3頁
python程序設(shè)計 課件 第2章 Python語法基礎(chǔ)_第4頁
python程序設(shè)計 課件 第2章 Python語法基礎(chǔ)_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第2章Python語法基礎(chǔ)Python程序設(shè)計·第2章Python語法基礎(chǔ)Python屬于解釋性程序語言,因此我們可以一行一行地編寫程序命令并交給Python解釋器立即執(zhí)行,這一點與編譯式程序語言(例如C與C++)不同,其程序代碼必須先經(jīng)過編譯器轉(zhuǎn)換為電腦硬件能讀懂的機器指令碼,然后才執(zhí)行。解釋性程序語言這種方式非常方便學(xué)習(xí),在互動模式下,透過互動過程,逐步掌握Python的語法和各項功能特色。標(biāo)識符與數(shù)據(jù)類型1程序文件擴展名與常見錯誤類型4運算符與表達(dá)式2程序注釋3軟件開發(fā)簡介5目錄2.1

標(biāo)識符與數(shù)據(jù)類型標(biāo)識符與保留字對象與類型、動態(tài)類型列表、可變與不可變別名、元組內(nèi)置常數(shù)2.1

標(biāo)識符與數(shù)據(jù)類型為開始下面的學(xué)習(xí),我們進入Python解釋器互動模式(Shell),或者把程序代碼寫入文件再交由解釋器執(zhí)行。在本書中,當(dāng)看到三個大于符號“>>>”時,代表解釋器處于互動模式,等待你輸入程序代碼;若是出現(xiàn)較長且完整的程序代碼時,則會寫成文件并標(biāo)示文件名。2.1

標(biāo)識符與數(shù)據(jù)類型下面的程序代碼會輸出數(shù)字3。 >>>3 3在互動模式(Shell)中,光是輸入“3”,也會回應(yīng)“3”,這是因為Shell會在執(zhí)行完一段程序代碼之后,盡量輸出結(jié)果提供回應(yīng)。但若是在程序文件里寫個“3”,執(zhí)行后并不會出現(xiàn)“3”,平常編寫程序代碼文件時,若想輸出內(nèi)容到屏幕上,應(yīng)使用print語句。2.1

標(biāo)識符與數(shù)據(jù)類型雖然這一行程序代碼只有一個數(shù)字3,但執(zhí)行可不簡單,解釋器努力工作,解析輸入的程序代碼,檢查語法并了解語義后,知道你想要的是個值為3的數(shù)字;然后,若處于互動模式,解釋器會試著輸出執(zhí)行結(jié)果。光是執(zhí)行“3”也不簡單2.1

標(biāo)識符、對象與類型不過上述程序代碼在執(zhí)行完后無法再次調(diào)用。為此,我們需要命名機制,為它取個名稱,以便能透過該名稱重復(fù)調(diào)用,請看下面的程序代碼。在符號“#”之后的文字是程序的注釋,即使輸入了也會被解釋器所忽略。 >>>a=3#建立整數(shù)3,取名稱a(第一次) >>>a#再次調(diào)用a 3當(dāng)執(zhí)行程序代碼“a=3”時,等號“=”的意思是“賦值”,會先執(zhí)行右邊的程序代碼,建立整數(shù)3后,若左邊的名稱是第一次出現(xiàn),那么解釋器會建立該名稱,再把數(shù)字3賦值給名稱a。除了整數(shù),Python還能提供浮點數(shù)、字符串和其他各種數(shù)據(jù)。2.1.1標(biāo)識符與保留字名稱是編程的重要組成部分。我們?yōu)橹得ɡ鏲elsius和fahrenheit),為模塊命名(例如convert),也為模塊中的函數(shù)命名(例如main)。從技術(shù)上講,所有這些名稱都稱為“標(biāo)識符”。當(dāng)我們要在程序里命名名稱時,必須遵守Python制定的一些規(guī)則:每個標(biāo)識符必須以字母或下劃線(“_”)開頭,后跟字母(小寫a到z,大寫A到Z)、數(shù)字(0到9)或下劃線(“_”)的任意序列。這意味著第一個不能是數(shù)字,單個標(biāo)識符不能包含任何空格。所以,a、i、score、factory、_g_value、camelCase、idx、send_to_screen等等都是合乎規(guī)則的名稱。注意到,Python標(biāo)識符區(qū)分大小寫(又稱“大小寫敏感”),所以對Python來說,spam、Spam、sPam和SPAM是不同的名稱。在大多數(shù)情況下,程序員可以自由選擇符合這些規(guī)則的任何名稱。不過,好的程序員總是會選擇一些有實際意義的名字。2.1.1標(biāo)識符與保留字Python有39個保留字(也稱關(guān)鍵字),但是與有五六十個以上保留字的語言如C++、C#、Java等等相比,Python可謂中規(guī)中矩,如果少于這個數(shù)目,恐怕就得犧牲掉某些語言特色或是采取更精簡的作法。例如COBOL,這個“古老”的程序語言的保留字?jǐn)?shù)目居然高達(dá)三百多個。本書附錄A.1列出了Python的保留字。 >>>if=3 #if是Python保留字 File"<stdin>",line1 if=3 ^if是Python的保留字,無法以此命名,要不然會出現(xiàn)出錯信息“SyntaxError:invalidsyntax”(語法錯誤:無效的語法)。 >>>IF=4 #取名為大寫IF后雖可行,但不建議2.1.1標(biāo)識符與保留字在Python中也可以使用Unicode字符來命名,例如可以使用中文字、日文假名、法文字母來命名,例如: >>>數(shù)=3 #建立整數(shù)3,命名為“數(shù)” >>>你好='hello' #建立字符串'hello',命名為“你好”不過取這種名稱不利流通也不具國際性,所以應(yīng)盡量避免。2.1.1標(biāo)識符與保留字當(dāng)想透過某名稱存取與其綁定的對象時,該名稱必須先存在,也就是必須先定義。在Python中定義名稱的方式是賦值語句。當(dāng)某名稱第一次出現(xiàn)在賦值語句左邊時,解釋器就會產(chǎn)生該名稱,然后便能在程序中使用該名稱(對象);之后若該名稱又出現(xiàn)在賦值語句左邊,便會轉(zhuǎn)而指向別的對象。 >>>a #目前尚未有“a”這個名稱 Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> NameError:name'a'isnotdefined

(名稱錯誤:名稱'a'尚未定義)2.1.1標(biāo)識符與保留字 >>>a=3 #以賦值語句產(chǎn)生名稱、建立int對象3,并綁定兩者 >>>a+5 #之后就可以使用名稱“a”來存取對象 8 >>>a=99 #轉(zhuǎn)而指向別的新對象但也有例外,在使用“+=”這樣的運算符時,若左邊是可變對象,例如list(列表),其動作通常會是原地修改。2.1.1標(biāo)識符與保留字Python還包括許多內(nèi)置函數(shù)(例如print函數(shù))。雖然在技術(shù)上可以將內(nèi)置函數(shù)的名稱用來標(biāo)識其他目的,但這是一個“非常糟糕”的主意。例如,如果你重新定義print的含義,那么就無法再打印信息,這也會讓其他閱讀程序的Python程序員感到非常困惑,因為他們預(yù)期中的print指的是內(nèi)置函數(shù)。2.1.2對象與類型請看下面的舉例,執(zhí)行結(jié)果見右圖。名稱與對象的關(guān)系圖中的“3”、“7”、“1.25”、“'hello'”,被稱為“對象”,每個對象都有其類型,例如“7”是“int”(整數(shù)),“1.25”為“?oat”(浮點數(shù)),“'hello'”是“str”(字符串)。2.1.2對象與類型當(dāng)你想建立字符串對象時,以單引號“'”或雙引號“"”包住想要的文字即可。執(zhí)行賦值(等號“=”)動作時,如果左邊的名稱(標(biāo)識符)是第一次出現(xiàn),那么Python解釋器就會先產(chǎn)生該名稱,讓你經(jīng)由該名稱調(diào)用指向的對象;若之后再把相同的名稱放在等號左邊,那么解釋器會找出該名稱、使它轉(zhuǎn)而指向新的對象,例如上述程序代碼執(zhí)行后,名稱a最后會指向整數(shù)對象。名稱與對象之間的關(guān)系又稱為綁定。由于Python具備垃圾收集的功能,而上述程序代碼最后已經(jīng)沒有任何名稱指向該對象,原先的整數(shù)對象3(被稱為垃圾)會被自動回收。編寫程序時會根據(jù)需求建立各種不同的對象,若想表示學(xué)生的成績,可使用整數(shù)或浮點數(shù)類型的對象,若想存儲員工的姓名,可使用字符串類型的對象。此外,Python還提供了其他一些數(shù)據(jù)類型。2.1.2對象與類型在某些程序語言里,變量是個整體的概念,包括變量的名稱、變量值的類型、存放變量值的地方。以變量名稱來使用變量,變量與類型也捆綁在一起,一經(jīng)宣告便不可改變,存放值的地方也是一塊與變量名稱緊緊關(guān)聯(lián)在一起的固定大小的存儲塊。但是,若只有這種形式的變量也會很不方便,所以其他程序語言后來加入了指針、對象等概念。而在Python里,所有東西通通都是對象,不論是整數(shù)、字符串、列表,還是函數(shù)、模塊等等,并且把名稱與對象的概念獨立開來,所以不再使用“變量”的概念來解釋。2.1.3動態(tài)類型談?wù)摮绦蛘Z言時,常會看到“動態(tài)”與“靜態(tài)”這兩個字眼,簡單地說,動態(tài)是指“執(zhí)行時”,靜態(tài)就是指“執(zhí)行前”。把名稱與對象分離開來,而且把類型放在對象身上,在動態(tài)執(zhí)行時才會去找出對象的類型,這種概念稱為動態(tài)類型。2.1.3動態(tài)類型名稱本身并不含有類型信息,該名稱可能指向整數(shù)對象、也可能指向列表對象,在程序執(zhí)行過程中,該名稱指向?qū)ο蟮念愋涂赡軙淖儯怨饪闯绦虼a“a+b”,并不知道a與b的類型,自然也不清楚“+”應(yīng)該做什么動作,只有在執(zhí)行時,知道a與b的類型后,才能執(zhí)行“a+b”。如果是整數(shù),那么“+”是算術(shù)加法,如果是字符串,那么“+”是字符串連接。這種根據(jù)類型做出不一樣行為的機制,叫做“多態(tài)”。因為Python采用動態(tài)類型,所以名稱可隨時指向不同類型的對象,容器類型內(nèi)的元素也可以是不同類型。例如下面的程序代碼,在列表a里放入各種類型的對象。 >>>a=[3,'abc',4.56,(0,1,2),[[3,4],'def']]2.1.4列表除了整數(shù)、浮點數(shù)、字符串等數(shù)據(jù)類型之外,還有一種叫做列表(list)的具備容器(數(shù)據(jù)結(jié)構(gòu))功能的類型,list數(shù)據(jù)結(jié)構(gòu)中可以放入任何類型的對象。建立列表對象時,其語法是使用方括號“[]”包住想含有的對象。例如:>>>li0=[30,41,52,63]>>>li0[2] #調(diào)用位于索引2處的對象52>>>li1=['amy','bob','cathy']>>>b=li1[1] #拿到索引1之處的對象,賦值給名稱b>>>b #名稱b指向字符串對象'bob''bob'>>>li1[99] #索引值超過界限,發(fā)生錯誤Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:listindexoutofrange#索引錯誤2.1.4列表2.1.4列表見圖2-3,名稱li0指向一個列表對象,含有4個元素(或稱為項目),分別是整數(shù)對象30、41、52、63,然后可使用“l(fā)i0[2]”的索引語法來存取該位置的對象,給定名稱后再于方括號內(nèi)寫進索引值即可。列表的索引值從0開始計數(shù),所以列表li0的有效索引值界限是從0到3。名稱li1指向另一個列表對象,含有3個字符串對象,使用索引語法取出對象后,可以賦值給另一個名稱;若索引值超過界限,便會顯示出錯信息“IndexError:listindexoutofrange”(索引錯誤:列表索引值超過界限)。

列表對象2.1.4列表注:索引從0開始長度為n的列表,其有效索引值是0到n-1,如果不小心以n作為索引值來存取列表,就會出錯,這叫做“離一錯誤”。雖然只差一,但還是屬于非法動作。列表可以同時放入任何類型的對象,包括列表本身。2.1.4列表例如: >>>li2=[3,101,4.56,'book','music’] >>>li3=['Frank',177,68,'engineer',['C','Python’]] >>>li3[4] #li3列表、索引值4的地方也是個列表['C','Python’] >>>li3[4][1] #既然是個列表,繼續(xù)以[]語法調(diào)用其內(nèi)容'Python'列表li2里有兩個整數(shù)對象、一個浮點數(shù)對象、兩個字符串對象。列表不僅可以含有整數(shù)、浮點數(shù)、字符串這些對象類型,也可含有列表。如上例的li3,其索引值4之處也是個列表,里頭含有兩個字符串。列表內(nèi)可含有列表2.1.4列表當(dāng)我們說“列表內(nèi)可存放對象”時,并不是真的把某個對象放在列表里,而是讓該列表能以索引的方式指向別的對象,就跟“a=3”的賦值結(jié)果差不多,只不過改成索引語法來調(diào)用罷了。2.1.5可變與不可變類型為int、?oat、str的對象,都擁有“不可變”的特性,即:不可變對象一旦建立,其值就無法改變。可以讓某個名稱轉(zhuǎn)而指向別的對象,但不能修改不可變對象。 >>>a=3#建立整數(shù)對象(值為3),產(chǎn)生名稱a指向它 >>>a=4#名稱a轉(zhuǎn)而指向另一個整數(shù)對象(值為4) >>>a 4上述程序代碼中,值為3的整數(shù)對象一旦建立后,其值就不能再變動;執(zhí)行“a=4”后,名稱a指向新的對象,則原先的對象將成為垃圾被系統(tǒng)回收。但列表屬于“可變”對象,建立后,仍可修改其內(nèi)容。 >>>name='Frank' #姓名

>>>weight=177 #身高

>>>height=68 #體重

>>>title='engineer' #職稱

>>>langs=['C','Python'] #程序語言

>>>li4=[name,weight,height,title,langs] >>>li4[2]=75 #哇,變胖啦

>>>li4 ['Frank',185,75,'engineer',['C','Python']]2.1.5可變與不可變2.1.5可變與不可變在上述代碼中,列表li4的索引值2原本指向整數(shù)對象68(體重),之后“l(fā)i4[2]=75”讓該處轉(zhuǎn)而指向新的整數(shù)對象75,換句話說,列表li4改變了。而因為程序里沒有任何一處(名稱)指向之前的整數(shù)對象68,也就成為垃圾,會被Python的垃圾收集機制回收。2.1.6別名因為Python有不可變對象(int、?oat、str)與可變對象(list、dict)之分,而且名稱與對象其實是獨立的兩樣?xùn)|西,所以必須注意發(fā)生“別名現(xiàn)象”,也就是當(dāng)兩個(或以上)的名稱都指向同一個對象時的狀況。別名也叫做共享參考。如果是不可變對象,那么程序行為應(yīng)可預(yù)期,例如:>>>a=3 #名稱a指向整數(shù)對象3>>>b=a #透過名稱a拿到整數(shù)對象3,賦值給名稱b>>>a #此時,a與b都指向“同一個”對象3>>>b3>>>b=4 #名稱b指向“新的整數(shù)對象4”>>>b4>>>a #名稱a仍指向原先的整數(shù)對象332.1.6別名上述程序行為,讀者應(yīng)該熟悉了,但如果是可變對象,那就要小心,例如:>>>a=[60,71,82] #名稱a指向列表>>>b=a #透過名稱a拿到列表,賦值給名稱b>>>a #此時,a與b都指向“同一個”列表[60,71,82]>>>b[60,71,82]>>>b[0]=99 #透過名稱b修改列表(可變對象)>>>b #改變了[99,71,82]>>>a[99,71,82]2.1.6別名2.1.6別名當(dāng)使用可變對象時,同一個對象可賦值給多個名稱。換句話說,多個名稱可指向同一個對象,透過這些名稱都可以修改該可變對象。Python提供了元組(tuple)類型,元組是不可變的列表(list)。建立tuple對象時,須使用小括號“()”包住想含有的對象,例如:>>>() #空tuple()>>>t0=(30,41,52,63)>>>t0[2] #調(diào)用索引2該處的對象52>>>t1=('amy','bob','cathy')>>>b=t1[1] #讀取索引1的對象,賦值給名稱b>>>b #名稱b指向字符串對象'bob''bob'2.1.6別名>>>t1[0]='annie’ #tuple是不可變對象,不能修改Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:'tuple'objectdoesnotsupportitemassignment(類型錯誤:'tuple'對象不支持項目分配)>>>t1[99] #索引值超過界限,發(fā)生錯誤Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:tupleindexoutofrange(索引錯誤:元組索引超出范圍)2.1.6別名2.1.7元組tuple跟list很像,建立時改用小括號包住內(nèi)含對象,調(diào)用時的索引語法都跟list一樣,索引值超過界限時也會發(fā)生錯誤,但tuple對象屬于不可變對象,當(dāng)你想要更動它時,例如“t1[0]='annie'”,將會出現(xiàn)錯誤“TypeError:'tuple'objectdoesnotsupportitemassignment”(類型錯誤:'tuple'對象不支持賦值動作)。既然tuple對象不可變,就無須擔(dān)心別名現(xiàn)象,因為一旦你手上有個名稱指向tuple對象,不管是你自己建立的、還是從某地方拿到的,它都不會改變。>>>t0=(0,1,2,3)>>>t1=t0 #t1與t1指向同一個對象>>>t1[0]=99 #不可變Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:'tuple'objectdoesnotsupportitemassignment(類型錯誤:'tuple'對象不支持項目分配)2.1.7元組2.1.7元組當(dāng)想建立只含一個元素的tuple對象時,不能只寫“('onlyone')”,因為括號“()”除了用來建立tuple對象,也可用來改變運算順序,所以必須如上述程序代碼加個逗號“('onlyone',)”,這樣Python才能正確得知你想要的是什么。另外,在語義明確的地方,通??梢允÷缘艚uple的括號,Python還是能知道你的意思。 >>>t0=('onlyone') #t0是str對象 >>>t1=('onlyone',) #t1是tuple對象 >>>('a','b','c') #以括號“()”建立tuple對象 ('a','b','c’) >>>'a','b','c' #此處可省略括號 ('a','b','c')又如:>>>(0,1,2,3) #建立數(shù)組(0,1,2,3)>>>3*(4+5) #用括號改變運算順序27>>>(0) #這樣只會得到值為0的int對象0>>>(0,) #這樣會得到含有一個元素的tuple對象(0,)2.1.7元組2.1.8內(nèi)置常數(shù)所謂“內(nèi)置常數(shù)”是指Python事先就設(shè)定好的數(shù)據(jù),即系統(tǒng)缺省的幾個名稱、指向預(yù)先建立的對象,這些名稱都代表了特定的意義,如果任意重新賦值的話,程序的行為就會改變,也會讓閱讀程序代碼的人困惑且造成混淆,因此,一般不會也不該這么做。內(nèi)置常數(shù)包括:None、False、True、NotImplemented、Ellipsis、__debug__。2.2

運算符與表達(dá)式算術(shù)表達(dá)式比較運算符邏輯運算符運算符優(yōu)先級2.2

運算符與表達(dá)式現(xiàn)在,我們已經(jīng)建立并擁有一些東西(對象)了,但是,該怎么操作各種類型的對象呢?例如,華氏溫度轉(zhuǎn)成攝氏,拿到五門課的成績后想求個平均分,想比較兩個對象的大小,想連接好幾個字符串,這些動作就要靠表達(dá)式來完成了。表達(dá)式由操作數(shù)與運算符組成,操作數(shù)就是對象,可以直接寫在程序里,例如“3”、“45.67”、“'Howareyou?'”、“[3,2,1,0]”這些字面值;操作數(shù)也可以是個名稱,透過名稱調(diào)用指向的對象。至于運算符,代表了種種不同的操作動作,例如兩個整數(shù)對象相加、連接兩個tuple或列表、比較兩個字符串、檢查某個對象是否存在于列表中,等等。2.2.1算術(shù)運算符算術(shù)運算符包括+、-、*、/、%、//、**,例如: >>>a=3+5 #+加法,得到8 >>>b=6-20 #-減法,得到-14 >>>c=200+a*b #先乘除后加減,得到88 >>>c2=(200+a)*b #使用括號改變運算順序,得到-2912 >>>d=17/3 #5.666666666666667 >>>d2=17//3 #地板除法,得到5 >>>e=17%3 #余數(shù),得到2 >>>f=2**5 #2的5次方,得到32 >>>g=+f #求f的正數(shù),還是32 >>>h=-f #求f的負(fù)數(shù),得到-322.2.1算術(shù)運算符其中“+”加法、“-”減法、“*”乘法、“**”冪次方,就跟在數(shù)學(xué)課中所學(xué)到的一樣;“+”與“-”運算符不僅能作為二元運算符(需要兩個操作數(shù)),代表加法與減法,也可作為一元運算符(需要一個操作數(shù)),代表正數(shù)與負(fù)數(shù),“-x”可改變x的正負(fù)號,但“+x”就沒什么用了。2.2.1算術(shù)運算符要特別注意“/”、“//”和“%”。先來看看“//”地板除法運算符,我們想象有一條垂直的數(shù)值線(見圖2-5),往上為正、往下為負(fù);“17//3”的結(jié)果會是“17除以3”的地板,也就是比它小但最靠近它的整數(shù),換句話說,“17除以3”落在5與6之間,天花板是6、地板是5,所以“17//3”地板除法的結(jié)果會是5;而“-17除以3”落在-5與-6之間,天花板是-5、地板是-6,所以“-17//3”結(jié)果是-6。若作用在浮點數(shù),行為仍相同,但結(jié)果的對象類型會是?oat。

天花板與地板2.2.1算術(shù)運算符換個說法,地板除法“//”的運算規(guī)則是:先對被除數(shù)進行四舍五入取整(除數(shù)不動),然后運算除法,對運算結(jié)果進行無條件截斷,只保留到整數(shù)部分,小數(shù)點后不保留。這個計算結(jié)果類似于floor(),所以叫地板除法。至于“/”除法運算符,若操作數(shù)是浮點數(shù),則得到一般除法(也稱精確除法)的結(jié)果,例如“17.0/3”的結(jié)果是“5.666666666666667”,只要操作數(shù)其中一個是浮點數(shù),另一個操作數(shù)就會被自動轉(zhuǎn)成浮點數(shù),然后再作除法。但因為電腦的浮點數(shù)類型不能表示無窮位數(shù),所以只能得到“5.666666666666667”這樣的結(jié)果;另外,就算是非無窮位數(shù),浮點數(shù)類型仍無法完整表示某些值,操作數(shù)不論是整數(shù)還是浮點數(shù),其行為都相同(見表2-1)。2.2.1算術(shù)運算符表2-1“/”、“%”與“//”的運算結(jié)果2.2.1算術(shù)運算符“%”余數(shù)運算符,操作數(shù)是正整數(shù)對象時,其行為例如“17%3”的結(jié)果是2;但若是負(fù)整數(shù),其行為由“x%y”等于“x-(x//y)*y”決定,若作用在浮點數(shù),行為仍一樣,但結(jié)果的類型是?oat。 >>>x=17 >>>y=-3 >>>x%y -1 >>>x-(x//y)*y -12.2.1算術(shù)運算符Python執(zhí)行表達(dá)式運算時,會遵從運算符優(yōu)先順序,在算術(shù)運算符中,“**”最高,“+”正數(shù)與“-”負(fù)數(shù)次之,然后是“*、/、//、%”,之后是“+、-”加減法,這也符合我們學(xué)過的運算順序。若想改變運算順序,可使用括號。當(dāng)表達(dá)式中有多個運算符、且優(yōu)先順序相同時,會從左邊開始運算,除了“**”以外。>>>2+3-1 #優(yōu)先順序相同,從左邊開始算4 #等同于(2+3)–1>>>2*(3*4) #使用括號改變運算順序24>>>2**3**2 #注意,“**”例外,先算3**2512>>>2**(3**2)512>>>(2**3)**2642.2.1算術(shù)運算符2.2.1算術(shù)運算符當(dāng)表達(dá)式中的操作數(shù)屬于不同類型的對象時,它們之間并不能進行運算,必須先轉(zhuǎn)變數(shù)據(jù)類型,對于int與?oat這兩種數(shù)值類型,只要知道表達(dá)式中有浮點數(shù)時,其他操作數(shù)就會通通轉(zhuǎn)成浮點數(shù)。str(字符串)類型的對象可以使用“+”與“*”,分別代表字符串連接與復(fù)制字符串?dāng)?shù)次再連接起來。例如:>>>'Hello'+''+'Python' #連接'HelloPython'>>>'Hello'*4 #復(fù)制數(shù)次再連接'HelloHelloHelloHello'>>>4*'Hello''HelloHelloHelloHello'2.2.1算術(shù)運算符2.2.1算術(shù)運算符其實,list與tuple也可以使用“+”與“*”作運算,因為它們與字符串都是序列類型的一種。 >>>[0,1,2]+[3,4,5] #列表連接后產(chǎn)生新列表 [0,1,2,3,4,5] >>>[0,1,2]*3 #列表的“乘法”,重復(fù)列表的內(nèi)容數(shù)次 [0,1,2,0,1,2,0,1,2]上述程序代碼里的list對象若改成tuple對象依然可運算,只不過產(chǎn)生的對象會是tuple類型。2.2.2比較運算符廣義的比較運算符有:·<、<=、>、>=、!=、<>、==:作大小比較,比較的意義由類型決定?!n、notin:成員關(guān)系運算符,檢查某元素是否在容器型對象里?!s、isnot:同等關(guān)系運算符,判斷兩個對象是否為同一個。比較運算符的運算結(jié)果會產(chǎn)生布爾(bool)類型的對象,只有兩種可能的值,True(真)與False(假)。>>>a=11>>>b=23>>>a<b #a小于b嗎?True>>>a<=b #a小于或等于b嗎?True>>>a>b #a大于b嗎?False>>>a>=b #a大于或等于b嗎?False>>>a==b #a等于b嗎?注意,兩個等于符號“==”False>>>a!=b #a等于b嗎?True>>>a<>b #a等于b嗎?2.x版才有“<>”True2.2.2比較運算符2.2.2比較運算符以上是數(shù)值類型(int或?oat)的比較行為,str、list、tuple類型也能使用比較運算符,但較少用?!?=”(雙等號)可用來比較兩個對象的內(nèi)容是否相等。 >>>li0=[0,1,2] >>>li1=[3,4,5] >>>li2=[0]+[1,2] >>>li0==li1 False #兩者不相等,含有不同的內(nèi)容 >>>li0==li2 True #兩個列表里含有相同的對象2.2.2比較運算符成員關(guān)系運算符“in、notin”可檢查某對象是否位于容器(數(shù)據(jù)結(jié)構(gòu))對象內(nèi),換句話說,可檢查str、list、tuple類型的對象里是否有該對象。>>>a=4>>>b=11>>>li=[2,3,5,7,11,13,17,19]>>>t=[0,2,4,6,8,10]>>>ainli #a在li里嗎?False>>>binli #b在li里嗎?True>>>anotint #a不在t里嗎?False2.2.2比較運算符>>>bnotint #b不在t里嗎?True>>>s0='you'>>>s1='she'>>>s2='Howareyou?'>>>s0ins2#s2里有s0嗎?True>>>s1ins2#s2里有s1嗎?False2.2.2比較運算符2.2.2比較運算符同等關(guān)系運算符“is”可判斷兩個對象是不是“同一個”,準(zhǔn)確地說,是判斷兩個名稱是否指向同一個對象;“isnot”的行為則相反。>>>a=3>>>b=4>>>c=1+2>>>aisb#名稱a與名稱b是否指向同一個對象?False>>>a==cTrue #a的值與c的值相等>>>aiscTrue2.2.2比較運算符>>>t0=(0,1,2)>>>t1=t0>>>t2=(0,)+(1,2)>>>t0ist1 #這兩個名稱是否指向同一對象?True>>>t0==t2True#t0與t2內(nèi)含的對象都相同>>>t0ist2False#t0與t2指向不同的對象2.2.2比較運算符2.2.2比較運算符當(dāng)你想知道兩個名稱是否指向同一個對象時,使用“is”;若是想比較兩個對象是否相等,應(yīng)該使用運算符“==”。True與False實際上就是整數(shù)1與0,只不過擁有特別的名稱,作為特殊用途罷了。所以可用于一般的算術(shù)運算,但并不建議這么做。應(yīng)該把True與False視為類型布爾的真假值,而不是單純的數(shù)字。>>>False-5+(True*3)-2>>>True==1,False==0 #其值雖等于1和0,(True,True)>>>Trueis1,Falseis0 #但并非同一對象(False,False)2.2.2比較運算符2.2.2比較運算符當(dāng)想比較多個數(shù)值時,原本需要以and或or組合多個比較表達(dá)式,但Python支持簡短的寫法,例如“x<y<z”等同于“x<yandy<z”。>>>x,y,z=3,6,9>>>x<yandy<zTrue>>>x<y<z #簡短寫法True>>>x<yandy>zFalse>>>x<y>z #簡短寫法False>>>x==y<zFalse>>>x==yandy<z #簡短寫法False2.2.2比較運算符2.2.2比較運算符若只須比較三個東西,可使用簡短寫法。不過一旦比較的東西(表達(dá)式)較長、需要比較的個數(shù)多于三個,那么使用簡短寫法很容易搞混,不知道到底是哪個比哪個。2.2.3邏輯運算符比較運算符的運算結(jié)果可得到True或False,這些是布爾類型的對象,而邏輯運算符可以再進一步,把多個比較表達(dá)式結(jié)合在一起。例如,你不僅想知道代表水溫的數(shù)字是否大于冰點(攝氏0度),也想同時知道該數(shù)字是否也小于沸點(攝氏100度)。邏輯運算符有“and、or、not”。當(dāng)“and”運算時,只有在左右兩邊的對象都為True時,運算結(jié)果才會是True,其余情況都為False;“or”則只要有一個對象為True就會得到結(jié)果True;“not”則是反轉(zhuǎn)真假值。>>>x=42 #假設(shè)這是水溫>>>0<=xandx<=100 #是否介于0到100之間(包含)True>>>y=25>>>z=36>>>a=x<yorz<x #是否超出25-36界限之外>>>a #可把運算結(jié)果(是個bool對象)賦值給名稱aTrue>>>nota #“not”代表“非”的意思False2.2.3邏輯運算符2.2.3邏輯運算符在Python里,可被當(dāng)作真假值的不僅有True跟False,事實上,所有對象都可用于邏輯運算。False、None、數(shù)值類型值為0的對象、空字符串“''”、空list對象與空tuple對象,在邏輯表達(dá)式里都會被當(dāng)作False,任何其他對象則一律視為True。注意,字符串“'0'”、list“[0]”、tuple“(0,)”都代表“真”。None是個非常特別的對象,它的類型是NoneType,通常用來代表“無”或“尚未得到有效值”。>>>li0=[0,1,2]>>>li1=[] #空list對象>>>li2=[None,False]>>>li0andli1[] #[]也代表空列表False>>>li0orli2[None,False]#只要list對象里有東西,它就不代表False2.2.3邏輯運算符2.2.3邏輯運算符結(jié)合and、or、not組成更長的邏輯表達(dá)式時,須注意短路行為,一旦運算式已經(jīng)得知結(jié)果,就不會再繼續(xù)運算。例如:>>>li0=[]>>>li1=[30,41,52]>>>li0andli0[0]>25 #光看li0就知道整個表達(dá)式的結(jié)果[] #所以結(jié)果就是li0“[]”,根本不會運算“l(fā)i0[0]>25”>>>li1andli1[0]>25 #li1非空列表True #所以會去運算“l(fā)i1[0]>25”>>>[]or'0' #[]為假,所以結(jié)果由'0'決定'0' #'0'為真>>>''or[0]or()or0 #看到[0](真)時,就知道結(jié)果了,不會去看后面的()和0[0]2.2.3邏輯運算符2.2.3邏輯運算符最后,在Python里,“x<yandy<=z”可寫成“x<y<=z”,語義相同但更短。2.2.4運算符優(yōu)先級表2-2列出了Python中所有運算符的優(yōu)先順序,其中某些尚未介紹。表中的“expr”代表表達(dá)式,例如“3+2”、“16<<2”,而“expr...”代表一串以逗號隔開的表達(dá)式,例如“1,3+5,5/2,2**3”,“arguments...”代表傳入函數(shù)的參數(shù)(零到多個)。一般的數(shù)值運算符,例如“+、*、/”等等,其優(yōu)先順序都高于比較運算符,如“<=、!=、isnot”等。2.2.4運算符優(yōu)先級表2-2運算符優(yōu)先順序(優(yōu)先級從上到下)2.2.4運算符優(yōu)先級(1)編寫程序需要一種系統(tǒng)的方法來解決問題,其步驟包括:問題分析、程序規(guī)格說明、設(shè)計、實現(xiàn)、測試/調(diào)試和維護。(2)程序由標(biāo)識符和表達(dá)式構(gòu)成的語句組成。標(biāo)識符以下劃線或字母開頭,后跟字母、數(shù)字或下劃線字符的組合。Python中的標(biāo)識符區(qū)分大小寫。表達(dá)式是產(chǎn)生數(shù)據(jù)的程序片段。表達(dá)式可以由字面量、變量、運算符組成。(3)Python的數(shù)字運算符包括加法(+)、減法(-)、乘法(*)、除法(/)和乘冪(**)等常見的算術(shù)運算。2.3

程序注釋2.3

程序注釋在編寫程序代碼時,為了使代碼更容易理解,通常會在實現(xiàn)某種功能時添加一些注釋予以說明,注釋的內(nèi)容不會被程序解析執(zhí)行。(1)中文注釋方法。Python默認(rèn)使用ASCII碼保存文件。如果在程序中使用中文注釋時,為避免出現(xiàn)亂碼,應(yīng)該在程序的開頭聲明保存編碼的字符格式。例如在程序開頭加上: #coding=gbk或者: #coding=utf-82.3

程序注釋(2)單行注釋符號。“#”常被用作單行注釋符號,在代碼中使用#時,它右邊的任何數(shù)據(jù)都會被忽略而當(dāng)做是注釋內(nèi)容。 print1 #輸出1 #右邊的內(nèi)容在執(zhí)行的時候不會被輸出。2.3

程序注釋(3)批量、多行注釋符號。當(dāng)注釋內(nèi)容有很多行時,需要使用多行注釋符,就是用三引號對''''''(單引號組成)或者""""""(雙引號組成)來包含注釋內(nèi)容。例如:'''三對單引號,Python多行注釋符三對單引號,Python多行注釋符三對單引號,Python多行注釋符'''或者"""三對單引號,Python多行注釋符三對單引號,Python多行注釋符三對單引號,Python多行注釋符"""2.4

程序文件擴展名與常見錯誤類型擴展名與執(zhí)行方式程序常見錯誤2.4

程序文件擴展名與常見錯誤類型雖然在學(xué)習(xí)初期Python的解釋器互動模式(Shell)會很好用,透過交互方式逐步學(xué)習(xí)了各種語言功能,但最終還是要把程序?qū)懺谖募铩?.4.1擴展名與執(zhí)行方式Python源代碼文件,或稱為腳本文件,一般會以“.py”作為擴展名。當(dāng)執(zhí)行Python程序文件之后,可能還會看見“.pyc”文件,這些是字節(jié)文件。雖然理論上Python解釋器會一行一行地執(zhí)行文件里的程序代碼,但實際上是先把源程序文檔編譯成二進制代碼文檔,然后才執(zhí)行;假設(shè)再次執(zhí)行時文件內(nèi)容沒變,就不需編譯可直接執(zhí)行二進制代碼文檔,以提升執(zhí)行速度?!?pyc”可能與源程序文件放在一起,也可能放在“__pycache__”目錄之下,這由Python解釋器的不同版本而定。另外,“.pyo”文件則是開啟效能最佳化選項編譯出來的二進制代碼文檔。當(dāng)在命令模式下想執(zhí)行Python程序時,可以輸入Python解釋器的指令名(通常是python)、后面跟著源程序文件名,這樣便可執(zhí)行。2.4.2程序常見錯誤下面列舉幾則Python程序中的常見錯誤。1.縮排不正確當(dāng)看到“IndentationError”(縮排錯誤)信息時,就代表該程序代碼里某語句的縮排深度不正確。請注意所使用的程序代碼編輯器的特殊功能,有些編輯器會把一個TAB換成四個空格(或其他);一個TAB有時等于四個空格的寬度、有時卻等于八個空格,總之,在屏幕上所看見的縮排模樣,看似正確,但實際上并不一定正確。建議保持一致的縮排風(fēng)格,例如全部采用“四個空格”作為一層縮排的深度,并且不要混用空格與TAB。在命令模式下執(zhí)行程序文件時,可為Python解釋器指令(通常是python)加上參數(shù)“-t”,便會幫助偵測是否有混用的情況,并對此發(fā)出警告。2.4.2程序常見錯誤2.忘記冒號“:”Python語句會以冒號“:”表示接下來的程序代碼為主體部分,例如if、else、for、def與while,這點跟以大括號“{、}”來劃分程序代碼的語言不同(如C/C++與Java)。3.操作數(shù)對象的類型不同不同類型的對象之間不能進行運算,“3+4.5”可執(zhí)行的原因是Python解釋器自動幫你轉(zhuǎn)換,會把3從類型int轉(zhuǎn)為類型?oat,然后才和4.5相加;但若碰到無法自動轉(zhuǎn)換的情況,解釋器便會顯示出錯信息。例如“"45"+3”與“3+"45"”,你想要的結(jié)果是字符串呢、還是整數(shù)呢?想連接字符串與數(shù)字時,應(yīng)以函數(shù)str先將數(shù)字轉(zhuǎn)成字符串,然后再以“+”連接兩個字符串。2.4.2程序常見錯誤4.搞錯“=”與“==”一個等號“=”的意義是“賦值”,其作用是讓左邊的名稱指向右邊的對象;兩個等號“==”的意義則是比較左右兩邊是否相等?!癷s”運算符的作用是判斷左右兩邊是否為同一個對象。建立新對象還是原地修改有些動作會建立新對象,有些則是“原地修改”,須區(qū)分清楚。 >>>a=b=c=[0,1,2] #原本

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論