信息安全案例教程:技術(shù)與應(yīng)用 第2版 課件 第3章 序列_第1頁
信息安全案例教程:技術(shù)與應(yīng)用 第2版 課件 第3章 序列_第2頁
信息安全案例教程:技術(shù)與應(yīng)用 第2版 課件 第3章 序列_第3頁
信息安全案例教程:技術(shù)與應(yīng)用 第2版 課件 第3章 序列_第4頁
信息安全案例教程:技術(shù)與應(yīng)用 第2版 課件 第3章 序列_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章序列信息學(xué)院2024引言3.1案例:計算圓周率的精確小數(shù)位數(shù)3.2對象和類3.3字符串3.4列表和元組3.5文件3.6編程實踐:Matplotlib中的pyplot3.7本章小結(jié)3.8習(xí)題本章將首先介紹對象和類的概念,然后詳細(xì)介紹幾種序列類型的應(yīng)用,包括字符串、列表和元組,并在此基礎(chǔ)上介紹文件對象。在章首案例和實例的指引下,本章還將學(xué)習(xí)使用一些標(biāo)準(zhǔn)庫和第三方庫。3.1案例:計算圓周率的精確小數(shù)位數(shù)上一章中我們采取了不同方法來計算圓周率的近似值,本章案例在【例2-1】的基礎(chǔ)上來計算圓周率的精確度。我們將保留小數(shù)點后30位的圓周率的值存儲在一個文本文件(pi_30.txt)中。每一行存儲了10個小數(shù)位,共3行。將采用無窮級數(shù)法計算出來的圓周率近似值與文本文件中存儲的值進行比較,確定計算結(jié)果精確到第幾位小數(shù)。為了觀察不同項數(shù)計算出來的結(jié)果精確度的變化,我們一直計算到300000項,并將變化情況以折線圖的方式展現(xiàn)出來。編寫程序并將文件命名為ch03.py。程序運行時彈出一個文件對話框,讓用戶選擇要打開并讀取內(nèi)容的文本文件。3.1案例:計算圓周率的精確小數(shù)位數(shù)精確小數(shù)位數(shù)變化情況如圖所示。到3000左右項數(shù)的時候,精度達(dá)到11位,到33000左右達(dá)到14位,到150000左右達(dá)到16位,到280000左右達(dá)到17位,到290000左右達(dá)到18,到296600左右達(dá)到峰值21,之后又開始回落。繼續(xù)增加項數(shù)無法達(dá)到精確度更高,這是因為計算機中小數(shù)運算是有誤差的。3.1案例:計算圓周率的精確小數(shù)位數(shù)到目前為止,我們把數(shù)據(jù)看成是被動的實體,可以通過運算符和函數(shù)對它們進行操作。為了創(chuàng)建更為復(fù)雜的系統(tǒng),我們需要建立數(shù)據(jù)和操作之間一種新的關(guān)系,大多數(shù)現(xiàn)代的計算機程序都是基于面向?qū)ο螅╫bjectoriented)方法創(chuàng)建的。在一個復(fù)雜的系統(tǒng)中,相對簡單的對象之間相互交互。對象是獨立的個體,既包含數(shù)據(jù)(稱為屬性),也包含操作(稱為方法),對象之間的交互通過發(fā)送消息(message)完成。3.2對象和類屬性(attribute)其實就是變量,方法(method)就是隸屬于這個對象的函數(shù),可以理解為這個對象對外提供的功能,可以主動完成一些動態(tài)的行為。給一個對象發(fā)送消息實際上就是向這個對象發(fā)出一個請求,調(diào)用它的一個方法來完成某些操作,調(diào)用的時候在方法名稱前需要指定是哪個對象,即<object>.<method>,注意這個“.”。每一個對象都是一個類(class)的實例(instance),在類中定義其屬性和方法,所有根據(jù)這個類創(chuàng)建的對象實例就有了這些屬性和方法。3.2對象和類Python是一種面向?qū)ο蟮恼Z言,雖然我們之前沒有提到“對象”這個概念,但實際上已經(jīng)在使用它們了。第1章中學(xué)習(xí)過:一種數(shù)據(jù)類型是一系列值以及為這些值定義的一系列操作方法的集合。實際上,每一種數(shù)據(jù)類型都是一個類,類型轉(zhuǎn)換函數(shù)的名字就是類名,調(diào)用類型轉(zhuǎn)換函數(shù)就是根據(jù)這個類創(chuàng)建一個對象實例,比如str()函數(shù)就是創(chuàng)建了一個字符串類的對象實例,即一個字符串實例。既然是對象,就可以有自己的方法供調(diào)用,注意在調(diào)用的時候方法名稱前要指定是哪個對象。3.2.1type()函數(shù)type()函數(shù)接受一個對象作為參數(shù),并返回它的類型。下圖以第1章中數(shù)據(jù)類型示例作為type()函數(shù)的參數(shù),返回了各種數(shù)據(jù)類型的類名,它們也是類型轉(zhuǎn)換函數(shù)的名字,前4種我們已經(jīng)學(xué)習(xí)并使用過,后4種將在本章和下一章學(xué)習(xí)。本書第7章將詳細(xì)介紹類和面向?qū)ο蟪绦蛟O(shè)計方法。3.2.1type()函數(shù)計算機中小數(shù)運算是有誤差的,如果想提高計算精度,可以使用decimal庫中的Decimal類。decimal是一個標(biāo)準(zhǔn)庫,直接引入就可以使用。本章案例要計算精確小數(shù)位數(shù),提高pi值的計算精度才能增加精確小數(shù)位數(shù),我們一直計算到300000項,看看精度如何。3.2.2decimal庫中的Decimal類fromdecimalimportDecimal#引入Decimal類pi=3a,b,c=2,3,4foriinrange(2,300000):ifnoti%2:pi+=Decimal(4/(a*b*c))#提高小數(shù)運算精度else:pi-=Decimal(4/(a*b*c))#提高小數(shù)運算精度a,b,c=a+2,b+2,c+2pi_str=str(pi)#將pi轉(zhuǎn)換為字符串3.2.2decimal庫中的Decimal類類名也是構(gòu)造函數(shù)的名字,調(diào)用它可以創(chuàng)建出一個類的對象實例。計算出來的pi值轉(zhuǎn)換為字符串后存儲在pi_str中。3.3字符串本節(jié)將詳細(xì)介紹字符串的表示、相關(guān)運算符、內(nèi)置函數(shù)和標(biāo)準(zhǔn)庫,還將重點介紹字符串作為一種Python對象所具有的方法,它們也可以用來操作字符串。字符串(string)就是字符的序列。Python里面沒有字符(char)這個類型,而是用長度為1的字符串來表示字符。3.3.1字符串的表示轉(zhuǎn)義字符是一種特殊的字符,無法用普通字符形式表示。表示轉(zhuǎn)義字符用反斜線開頭,比如換行符(newline)用“\n”表示,制表符(tab)用“\t”表示,其功能是在不使用表格的情況下在垂直方向按列對齊文本,我們在【例2-6】中已經(jīng)使用過。轉(zhuǎn)義字符轉(zhuǎn)義字符含義轉(zhuǎn)義字符含義\n換行符\t制表符\r回車符\'單引號\"雙引號\\反斜線由于單引號和雙引號被用來括起字符串,如果在字符串內(nèi)出現(xiàn)單引號或雙引號,就會被認(rèn)為是字符串的結(jié)束,而如果在前面加上反斜線,Python就會視其為單引號或雙引號而非字符串結(jié)束。反斜線本身具有特殊含義,它是轉(zhuǎn)義字符的開頭,如果字符串里包含反斜線的字符,則需要用“\\”表示。比如,使用如下的表示會出現(xiàn)語法錯誤:"Tomsaid,"HelloWorld""因為字符串到出現(xiàn)第二個雙引號時就結(jié)束了,后面的表示就是錯誤的。正確的表示是:"Tomsaid,\"HelloWorld\""Python還支持不同引號的互相嵌套,用來表示復(fù)雜字符串。比如,以上字符串這樣表示更為簡單:"Tomsaid,'HelloWorld'"單引號括起的字符串里面嵌套了一個雙引號括起的字符串,只有配對的引號才會認(rèn)為是字符串的結(jié)束,互不干擾。轉(zhuǎn)義字符再比如,文件路徑的字符串表示里就包含反斜線,如果只用“\”而不用“\\”就容易出現(xiàn)錯誤。在IDLE解釋器中輸入path="C:\Python311\",會出現(xiàn)語法錯誤(SyntaxError),為什么?如何修正?試一試第1章里講到,Python的字符串可以用單引號、雙引號或三引號括起,到目前為止我們用的都是單引號或者雙引號。用三引號括起來的字符串在輸入時支持換行。使用雙引號試圖換行時,出現(xiàn)了語法錯誤。注意區(qū)分三個單引號和混合使用一個雙引號和一個單引號,仔細(xì)觀察,還是能看出不同的。三引號的作用字符串中的單個字符可以通過方括號加索引號(也稱為下標(biāo))的方式來訪問,即:s[i]。s為字符串,索引號i從0開始,最大值為字符串的長度-1。Python允許使用負(fù)值作為索引號來提取字符串里的字符,-1表示最后一個字符,依次類推。比如:pi_str='3.1415926'pi_str[5]和pi_str[-4]都能提取其中的字符'5'。字符串中的單個字符第1章已經(jīng)介紹了用于字符串的格式化運算符。第2章介紹的比較運算符和邏輯運算符也適用于字符串,本小節(jié)將通過舉例來進一步說明。此外,常用的字符串運算符還包括連接運算符、切片運算符和成員運算符。3.3.2字符串運算符字符串的比較運算是按照順序?qū)γ恳粋€字符的ASCII碼值進行比較,如果第一個字符相同,就比較第二個字符,以此類推,如果字符串長度相同且一直到最后一個字符的ASCII碼值都相同,那么兩個字符串相等。比較運算符本章案例要比較計算出來的pi值與文本文件中的pi值,由于是要計算精確的小數(shù)位數(shù),而不是比大小,因此無法用整個字符串的比較來實現(xiàn),需要對每一個小數(shù)位進行逐一比較。假設(shè)從文本文件中讀取出來的pi值(字符串)存儲在pi_text中,判斷它與pi_str中某一位小數(shù)不相等的表達(dá)式為:pi_str[i]!=pi_text[i]比較運算符邏輯運算符表達(dá)式只要有布爾值就可以參與邏輯運算,對于字符串來說,空串的布爾值為0,其余字符串的布爾值均為1。連接運算符連接運算符的作用是把一個序列和另一個相同類型的序列做連接,對于字符串來說,就是把兩個或更多個字符串連接成為一個更長的字符串。連接運算符用加法運算符“+”表示,還可以對一個字符串作幾次重復(fù)的連接,這種操作用乘法運算符“*”表示,另一個操作數(shù)是整數(shù),表示重復(fù)的次數(shù)。第2章案例中輸出pi的近似值使用了如下語句:print("Theapproximatevalueofpiis",round(pi,7),"while",in_points,"outof",points,"pointsareinthecircle.")連接運算符也可以使用連接運算符把要輸出的多項內(nèi)容連接為一個完整的字符串輸出:print("Theapproximatevalueofpiis"+str(round(pi,7))+"while"+str(in_points)+"outof"+str(points)+"pointsareinthecircle.")當(dāng)然也可以使用字符串的格式化運算符來輸出:print("Theapproximatevalueofpiis%.7fwhile%doutof%dpointsareinthecircle."%(pi,in_points,points))注意:“+”左右兩邊都是數(shù)字時做加法運算,左右兩邊都是字符串時做連接運算,但如果一邊是數(shù)字、一邊是字符串,則會出現(xiàn)類型錯誤(TypeError)。切片運算符切片運算符的作用是通過指定下標(biāo)范圍來獲得一個序列的一組元素,對于字符串來說就是取出已有字符串中的一部分(子串)成為一個新的字符串。切片運算符用冒號表示,其描述形式為:s[m:n:d]s是字符串,m、n、d都是整數(shù),得到在s[m]到s[n-1]的范圍內(nèi)按d的步長選出字符而形成的字符串。切片描述中必須包含冒號,但m、n、d都可以省略。m省略時默認(rèn)為0(從頭開始),n省略時默認(rèn)為字符串長度-1(直到末尾),d省略時默認(rèn)為1(按順序選出字符),如果都省略,表示整個字符串。切片運算符本章案例中要對pi_str和pi_text中的每一位小數(shù)進行比較,整數(shù)部分(第1個字符)和小數(shù)點(第2個字符)無需考慮,只需截取小數(shù)部分,即:pi_str=pi_str[2:]pi_text=pi_text[2:]注意冒號不可省略,否則僅獲取兩個字符串中的第3個字符。成員運算符成員運算符用來判斷一個元素是否屬于一個序列的成員,對于字符串來說,就是判斷一個字符或一個子串是否出現(xiàn)在一個字符串中。成員運算符用“in”或“notin”表示,結(jié)果是布爾值True或False。如下兩個表達(dá)式:'ab'in'abcd''ac'in'abcd'第一個表達(dá)式的結(jié)果是True,第二個表達(dá)式的結(jié)果是False。第1章中介紹了用于字符串的str()函數(shù)。第2章中介紹了與字符相關(guān)的chr()和ord()函數(shù),此外數(shù)字運算函數(shù)中的max()和min()也適用于字符串,返回的是字符串中ASCII碼值最大和最小的字符。本小節(jié)介紹len()函數(shù)以及string標(biāo)準(zhǔn)庫。3.3.3len函數(shù)和string庫len()函數(shù)len()函數(shù)返回序列類型中元素的個數(shù),對于字符串來說,就是字符串中字符的個數(shù)。本章案例要對pi_str和pi_text進行逐個小數(shù)位的比較,代碼如下:len()函數(shù)foriinrange(len(pi_str)):ifpi_str[i]!=pi_text[i]:#不相等,說明精度到上一個小數(shù)位breakbreak語句用來跳出循環(huán),一般和if語句一起使用,在滿足一定條件下,提前跳出循環(huán),不再執(zhí)行循環(huán)體。循環(huán)次數(shù)由字符串pi_str的長度決定,循環(huán)變量i也就是每一位小數(shù)在字符串中的下標(biāo),從0開始,如果比較到某一個小數(shù)位不相等,提前跳出循環(huán),也就是循環(huán)只執(zhí)行了i+1次,i的值也就是精確小數(shù)位數(shù)。string庫string是一個標(biāo)準(zhǔn)庫,包含了一些實用的字符串常量和類。這個模塊是一個名為string.py的程序文件,可以在Python安裝路徑下的lib文件夾中(如C:\Python311\Lib)找到。如果想查看string庫中定義的所有內(nèi)容,可以在IDLE的交互式解釋器中使用幫助函數(shù)來查看,即:help(string)。string庫string庫中定義的一些常量和類常量/類功能ascii_letters包含所有字母的字符串a(chǎn)scii_lowercase包含所有小寫字母的字符串a(chǎn)scii_uppercase包含所有大寫字母的字符串digits包含0~9的字符串punctuation包含所有ASCII標(biāo)點符號的字符串Template字符串模板類,用于替換字符串中的變量每一位可能是0~9或小數(shù)點。本例中使用了連接運算符、成員運算符和string庫中的digits常量。【例3-1】判斷用戶輸入的是否是數(shù)字變量valid用來判定輸入是否是數(shù)字,先假定是數(shù)字,即賦值為True。循環(huán)判斷用戶輸入的每一個字符是否是0~9或小數(shù)點,循環(huán)次數(shù)由用戶輸入的字符串長度決定,一旦發(fā)現(xiàn)某個字符不是數(shù)字,輸出該字符不是0~9或小數(shù)點的提示信息,將valid賦值為False,提前退出循環(huán)。如果循環(huán)結(jié)束后,valid的值還是True,說明輸入的每一個字符都是0~9或小數(shù)點,那么輸入的就是數(shù)字,給用戶一個提示信息。最后的分支結(jié)構(gòu)是一個單分支語句,即沒有else部分。運行兩次程序,分別輸入“3.1415926”和“pi”,輸出結(jié)果分別是“Itisanumber.”和“pisnotadigitorfloatingpoint.”。注意:第二次輸入“pi”后,程序依次判斷,遇到“p”就發(fā)現(xiàn)不是0~9或小數(shù)點,給出提示信息后,退出循環(huán),不再判斷后續(xù)字符?!纠?-1】判斷用戶輸入的是否是數(shù)字字符串方法有很多,使用方法和函數(shù)的區(qū)別在于,字符串函數(shù)的參數(shù)是字符串,而字符串方法是隸屬于字符串這個類的功能,調(diào)用方法是點成員(<string>.<method>)的方式。3.3.4字符串的常用方法用于判定字符串內(nèi)容的方法3.3.4字符串的常用方法方法功能s.isalnum()s只包含字母或數(shù)字時返回True,否則返回Falses.isalpha()s只包含字母時返回True,否則返回Falses.isdigit()s只包含數(shù)字時返回True,否則返回Falses.islower()如果s中至少包含一個區(qū)分大小寫的字符且這些字符都是小寫,則返回True,否則返回Falses.isspace()s只包含空格時返回True,否則返回Falses.isupper()如果s中至少包含一個區(qū)分大小寫的字符且這些字符都是大寫,則返回True,否則返回False用于查找字符串內(nèi)容的方法3.3.4字符串的常用方法方法功能s.count(sub[,start[,end]])返回sub在s中start和end范圍內(nèi)出現(xiàn)的次數(shù)s.endswith(suffix[,start[,end])判斷在s中start和end范圍內(nèi)是否以suffix結(jié)束,如果是則返回True,否則返回Falses.find(sub[,start[,end])在s中start和end范圍內(nèi)查找sub,如果沒找到返回-1,如果找到,返回開始的下標(biāo)s.index(sub[,start[,end]])返回sub在s中start和end范圍內(nèi)第一次出現(xiàn)的索引號,如果沒找到,出現(xiàn)值錯誤(ValueError)s.startswith(prefix[,start[,end])判斷在s中start和end范圍內(nèi)是否以prefix開頭,如果是則返回True,否則返回False用于改變字符串內(nèi)容的方法3.3.4字符串的常用方法方法功能s.capitalize()返回將s首字母大寫的字符串,s不變s.lower()返回將s中所有大寫字母轉(zhuǎn)換為小寫的字符串,s不變s.lstrip()返回去掉s開頭空格的字符串,s不變s.replace(old,new,num=-1)返回把s中的old替換成new、替換次數(shù)不超過num次的字符串,num為-1時表示替換所有,s不變s.rstrip()返回去掉s末尾空格的字符串,s不變s.strip()返回去掉s開頭和末尾空格的字符串,s不變s.title()返回將s中所有單詞首字母大寫的字符串,s不變s.upper()返回將s中所有小寫字母轉(zhuǎn)換為大寫的字符串,s不變以上方法并不改變所屬的字符串對象本身,而是返回一個新的字符串。用于分解和連接字符串的的方法3.3.4字符串的常用方法方法功能s.join(seq)以s作為分隔符,將seq中的所有元素合并為一個字符串s.partition(sep)從sep出現(xiàn)的第一個位置起,把s劃分為一個包含sep之前的字符、sep和sep之后字符的三元組s.split(sep=None,num=-1)以sep為分隔符分解s,None表示以空格分隔,分解次數(shù)不超過num次,num為-1時表示沒有限制,返回包含多個子串的列表本章案例中從文本文件中讀取出pi值存放于pi_text中,每10位一行,第二行和第三行行首還有兩個空格,需要進行一些處理才能和計算出來的pi值進行逐位比較。首先我們調(diào)用字符串的replace()方法,用空串去替換空格,也就是刪去字符串中的空格,如下所示:pi_text=pi_text.replace('','')#刪去字符串中的空格replace()方法在調(diào)用時要采用點成員方式,即前面要加上所屬的字符串對象和“.”,其第一個參數(shù)是要被替換的子串,第二個參數(shù)是用什么樣的子串去替換,第三個參數(shù)指定替換的次數(shù),默認(rèn)是找到所有要被替換的子串全都替換掉,這里取默認(rèn)值。3.3.4字符串的常用方法接下來,我們調(diào)用split()方法以換行符為分割符對字符串對象進行分解,返回包含分解后子串的列表,然后再調(diào)用join()方法以空串作為分隔符把這個列表中的子串連接為一個字符串,結(jié)果就是把換行符去掉了,如下所示:pi_text=''.join(pi_text.split('\n'))#去掉字符串中的換行符將新產(chǎn)生的字符串再次賦值給pi_text,再按照切片運算符中所述,截取小數(shù)部分,即可用來與同樣截取小數(shù)部分的pi_str進行逐一對比了。3.3.4字符串的常用方法3.4列表和元組列表和元組也是序列類型,它們和字符串既有類似之處,也有不同之處。字符串是字符的序列,而列表(list)和元組(tuple)可以是任意對象的序列,而且這些對象可以屬于不同類型。3.4.1列表和元組的表示創(chuàng)建列表或元組列表用方括號表示,元組用圓括號表示,其中的不同元素用逗號分隔。列表和元組里的每個元素可以是任意對象。如下語句創(chuàng)建了一個存儲了不同項數(shù)(2~9)的列表:item_values=[2,3,4,5,6,7,8,9]需要注意的是,元組中只有一個元素時,需要在這個元素后面加上逗號,即使后面沒有第二個元素,比如:x=(2,)創(chuàng)建列表或元組不能寫成:x=(2)這是為了消除歧義,因為圓括號也可以用來表示運算的優(yōu)先級,后者相當(dāng)于:x=2此外,用逗號分隔一些值,也能自動地創(chuàng)建元組,比如:a,b,c=2,3,4賦值號右邊元組中的元素對應(yīng)賦值給左邊元組中的元素,相當(dāng)于:(a,b,c)=(2,3,4)創(chuàng)建列表或元組用列表的轉(zhuǎn)換函數(shù)list()可以把一個字符串或元組轉(zhuǎn)換為列表,類似地,用元組的轉(zhuǎn)換函數(shù)tuple()可以把一個字符串或列表轉(zhuǎn)換為元組,比如:list('3.14')和tuple('3.14')的結(jié)果分別是:['3','.','1','4']和('3','.','1','4’)。經(jīng)常在循環(huán)中用到的range()函數(shù)的返回值,是一個可迭代的范圍對象,也可以通過list()或tuple()將其轉(zhuǎn)換為列表或元組。比如:list(range(10))的結(jié)果是[0,1,2,3,4,5,6,7,8,9]。列表和元組中的單個元素和字符串類似,列表和元組中的單個元素也是通過索引號(下標(biāo))來獲取的。和字符串不同的是,我們可以對列表中的單個元素進行修改,卻不能對字符串中的單個字符進行修改,也不能對元組中的單個元素進行修改,比如:pi_str='3.15'pi_lst=list(pi_str)pi_tup=tuple(pi_str)pi_str[-1]='4'pi_lst[-1]='4'pi_tup[-1]='4'執(zhí)行第四條語句會出現(xiàn)類型錯誤(TypeError),提示字符串對象不支持元素賦值。第五條語句執(zhí)行成功,將pi_lst最后一個元素'5'改為'4'。第六條語句再次出現(xiàn)類型錯誤,提示元組對象不支持元素賦值。列表和元組中的單個元素這是因為字符串和元組在Python中都是不可修改的(immutable)數(shù)據(jù)類型,而列表則是一種可以修改的(mutable)數(shù)據(jù)類型。想要修改字符串中的某一個字符,需要對整個字符串進行重新賦值,比如:pi_str='3.14'。想要修改元組中的某一個元素,也需要對整個元組進行重新賦值,比如:pi_tup=('3','.','1','4’)。既然不可修改,為什么可以重新賦值呢?回憶一下1.5節(jié)中所描述的變量賦值過程,給變量賦值就像是給一個值貼上黃色的小便箋,重新賦值就像是把變量的名字貼在了另外一個值上,原來那個值并沒有被修改。適用于字符串的比較運算符、邏輯運算符、連接運算符、切片運算符、成員運算符也適用于列表和元組。由于列表和元組可以包含任意類型的元素,在使用比較運算符時,需要是同種類型的元素方可比較。3.4.2列表和元組的運算符根據(jù)1.4.2中的變量命名規(guī)則來判定?!纠?-2】判定一個變量名是否合法有效keyword是一個關(guān)于關(guān)鍵字的模塊,其中定義了一個常量kwlist,是一個包含所有關(guān)鍵字的列表,每一個關(guān)鍵字用字符串表示。首先使用列表的成員運算符,判斷用戶輸入的字符串是否在kwlist列表中,如果在,提示用戶這是一個關(guān)鍵字,即非法。如果不是關(guān)鍵字,繼續(xù)判斷輸入的第一個字符是否以字母或下劃線開頭,如果不是,提示用戶首字符非法。如果首字符合法,接著判斷其它字符,使用切片運算符截取從2個字符開始的字符串。本例的控制結(jié)構(gòu)較為復(fù)雜,最外層是一個分支結(jié)構(gòu)(雙分支),在else語句下又嵌套了一個分支結(jié)構(gòu)(雙分支),內(nèi)層的else語句下又嵌套了一個循環(huán)結(jié)構(gòu)(for循環(huán)),在循環(huán)體內(nèi)又嵌套了一個分支結(jié)構(gòu)(單分支),所以我們看到最內(nèi)層的語句縮進了4層。這個例子也體現(xiàn)了Python強制縮進的好處,如果不強制縮進,程序員又沒有分層縮進的編程習(xí)慣,嵌套層次一多,程序可讀性就大大降低了。運行程序,測試各種輸入的運行結(jié)果?!纠?-2】判定一個變量名是否合法有效除了以上命名規(guī)則外,一般也不建議采用內(nèi)置函數(shù)名作為變量名。如果使用內(nèi)置函數(shù)名作為變量名,那么這個內(nèi)置函數(shù)就會因為名字被覆蓋而無法使用?!纠?-2】判定一個變量名是否合法有效適用于字符串的max()、min()、len()函數(shù)也適用于列表和元組。上一節(jié)中講到列表和元組的類型轉(zhuǎn)換函數(shù)分別為list()和tuple()。本小節(jié)介紹sum()、sorted()和zip()函數(shù)。3.4.3列表和元組的函數(shù)sum()函數(shù)sum()函數(shù)的功能是求和,其參數(shù)可以是包含數(shù)字元素的列表或元組,不可以是字符串。由于列表和元組都可以包含任意個元素,sum()函數(shù)因此就可以用來求任意多個數(shù)字的和,只要把這些數(shù)字添加到列表或元組中就可以了。sum()函數(shù)可以有第二個參數(shù),指定求和的起始值,不指定的話,默認(rèn)值為0。比如:sum([1,2,3],1)以上函數(shù)調(diào)用的結(jié)果為7。sorted()函數(shù)sorted()函數(shù)的功能是排序,其參數(shù)可以是字符串、列表或元組,函數(shù)的返回值是排好序的列表。如果參數(shù)是列表或元組,要求其中的所有元素具有同種類型,方可進行比較和排序,類似的還有max()和min()函數(shù)。sorted()函數(shù)還可以指定reverse參數(shù),默認(rèn)值為False,即按升序排序,如果想按降序排列,可以指定reverse參數(shù)為True。比如:sorted('bca',reverse=True)sorted(['b','c','a'],reverse=True)sorted(('b','c','a'),reverse=True)以上函數(shù)調(diào)用的結(jié)果均為:['c','b','a']。zip()函數(shù)zip()函數(shù)將多個可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的對象。如果可迭代對象的長度不同,則以短的為準(zhǔn)。比如:x=[1,2,3]y=['a','b','c']z=zip(x,y)z就是一個zip對象,可以調(diào)用list()或tuple()函數(shù)將其轉(zhuǎn)換為列表或元組,list(z)的結(jié)果為:[(1,'a'),(2,'b'),(3,'c')]zip()函數(shù)zip()函數(shù)可以理解為將多個可迭代對象(如x和y)壓縮為一個(如z)。zip()函數(shù)也可以用來解壓縮,使用“*”可以將一個zip對象解壓為多個元組,比如:x,y=zip(*z)將z解壓到x和y,x的值為(1,2,3),y的值為('a','b','c')。適用于字符串的count()、index()方法同樣也適用于列表和元組。此外,列表還有一些常用方法,其中append()方法最為常用,我們經(jīng)常先創(chuàng)建一個空列表,然后逐項添加。3.4.4列表和元組的方法方法功能lst.append(obj)將obj添加至lst末尾lst.clear()清空lst中的所有元素lst.copy()返回lst的一個復(fù)本lst.insert(index,obj)在index的位置插入objlst.pop(index=-1)刪除并且返回index處的元素,index為-1時表示最后一項lst.remove(value)刪除第一次出現(xiàn)value的元素lst.reverse()顛倒lst中元素的順序lst.sort(reverse=False)對lst中的元素進行排序,默認(rèn)升序,指定reverse為True時降序記住,列表是一個可以修改的數(shù)據(jù)類型,所以可以有添加、修改、刪除這些操作。本章案例中為了記錄不同項數(shù)計算出來的pi值以及他們的精確小數(shù)位數(shù),我們定義了3個列表:item_values、pi_values、accu_values,首先賦值為空列表。3.4.4列表和元組的方法fromdecimalimportDecimal#引入Decimal類pi=3a,b,c=2,3,4item_values=[]#不同項數(shù)pi_values=[]#不同項數(shù)計算出來的pi值accu_values=[]#不同項數(shù)計算出pi值的精確小數(shù)位數(shù)foriinrange(2,300000):ifnoti%2:

pi+=Decimal(4/(a*b*c))#提高計算精度else:

pi-=Decimal(4/(a*b*c))

item_values.append(i)#把項數(shù)添加進列表

pi_values.append(pi)#把pi值添加進列表

a,b,c=a+2,b+2,c+23.4.4列表和元組的方法一邊計算pi值一邊調(diào)用append()方法給item_values和pi_values添加元素,循環(huán)結(jié)束后,兩個列表的元素就添加好了。#將列表中的每一個pi值與文本文件中存儲的pi值比較forpiinpi_values:

pi_str=str(pi)

pi_str=pi_str[2:]#截取小數(shù)部分foriinrange(len(pi_str)):ifpi_str[i]!=pi_text[i]:#不相等,說明精度到上一個小數(shù)位break

accu_values.append(i)#把精確小數(shù)位數(shù)添加進列表3.4.4列表和元組的方法由于列表也是一個序列,可以直接用于for循環(huán),每一次循環(huán)迭代從pi_values列表中獲取一個元素,將其轉(zhuǎn)換為字符串并截取小數(shù)部分,與文本文件中讀取出來的pi_text進行比較。內(nèi)層循環(huán)結(jié)束之后,調(diào)用append()方法將精確小數(shù)位數(shù)添加至accu_values列表。3.5文件接下來我們要做的,就是從文本文件中讀取pi_text的值,以及將從2~299999項計算出結(jié)果的精確度變化以折線圖的方式展現(xiàn)出來。到目前為止,我們編寫的程序都是標(biāo)準(zhǔn)輸入和輸出,即由用戶從鍵盤輸入,將結(jié)果向顯示器輸出。這些輸入和輸出在程序運行結(jié)束后都無法保存,數(shù)據(jù)保存需要通過存儲在外存上的文件來完成,我們可以在程序開始時從文件讀取數(shù)據(jù),在程序結(jié)束時將結(jié)果保存到文件中。文件(file)的類型有很多種,本章主要介紹文本文件的使用。文件的基本操作包括打開、讀取、寫入和關(guān)閉,其中打開調(diào)用open()內(nèi)置函數(shù)完成,讀取、寫入和關(guān)閉都是調(diào)用文件對象的方法完成。3.5.1文件的基本操作open()函數(shù)open()函數(shù)的第一個參數(shù)用來指定打開的文件名字,第二個參數(shù)用來指定打開文件的模式,函數(shù)返回的是一個文件對象,如下所示:<object>=open(<name>,<mode>)符號打開模式r以只讀方式打開,如果文件不存在,出現(xiàn)文件找不到錯誤(FileNotFoundError)w以寫入的方式創(chuàng)建一個新的文件,如果文件已經(jīng)存在,則覆蓋。x以寫入的方式創(chuàng)建文件,如果文件已經(jīng)存在,出現(xiàn)文件存在錯誤(FileExistsError)。a以寫入的方式創(chuàng)建文件,如果文件已經(jīng)存在,添加到文件末尾b二進制模式t文本模式,默認(rèn)+更新文件,包括讀取和寫入open()函數(shù)本章案例中要想打開保留小數(shù)點后30位圓周率值的文本文件,可以寫如下代碼:pi_file=open("pi_30.txt",'r')我們只需要讀取文本內(nèi)容,以只讀方式打開即可。在指定文件名字的時候,要注意兩點:一是不能漏掉后綴名,這里即“.txt”;二是使用相對路徑,也就是說要打開的這個文件和程序文件在同一個文件夾下。也可以使用絕對路徑來指定文件的位置,比如:pi_file=open("C:\Python311\pi_30.txt",'r')文件的方法對于文本文件來說,讀取和寫入都要用到序列,要么是讀出或?qū)懭胍粋€字符串,要么就是讀取每行字符串放入一個列表或是寫入一個包含多行字符串的列表。方法功能f.close()關(guān)閉文件f.read(size=-1)從f的當(dāng)前游標(biāo)處讀取size個字節(jié)的內(nèi)容,若size為-1,則讀取全部剩余內(nèi)容f.readline()從f中讀取一整行字符串(包括末尾的換行符)。f.readlines()讀取f中的所有行,并返回一個列表,其中每一項就是一行字符串f.seek(offset,from)將游標(biāo)從from位置偏移offset個字節(jié),from為0表示文件頭,from為1表示當(dāng)前游標(biāo)位置,為2表示文件尾f.tell()返回當(dāng)前游標(biāo)在f中的位置,文件頭的位置為0f.write(str)將str寫入ff.writelines(seq)把seq中的全部內(nèi)容寫到f,一般來說seq中的每一項就是一行字符串(末尾有換行符),寫入f時也就寫入了多行讀取一個文本文件,統(tǒng)計其中的行數(shù)、字?jǐn)?shù)和字符數(shù)。file_name=input("Pleaseinputthetextfilename:")f=open(file_name,'r')text=f.read()f.close()print("Numberofcharacters:",len(text))print("Numberofwords:",len(text.split()))print("Numberoflines:",len(text.split('\n')))【例3-3】文本統(tǒng)計首先讓用戶輸入文件名,然后調(diào)用open()函數(shù)以只讀方式打開它。在打開文件后,游標(biāo)停留在文件頭的位置,用read()方法可一次性讀取文本文件中的所有內(nèi)容,讀完之后調(diào)用close()方法關(guān)閉文件。然后調(diào)用len()函數(shù)來分別統(tǒng)計其行數(shù)、字?jǐn)?shù)和字符數(shù),并將結(jié)果輸出。調(diào)用split()方法將讀取的文本分別按空格(默認(rèn))和換行符分隔成列表,其長度即為字?jǐn)?shù)和行數(shù)。運行程序,我們用“pi_30.txt”文件來測試一下,結(jié)果為:Pleaseinputthetextfilename:pi_30.txtNumberofcharacters:39Numberofwords:3Numberoflines:4行數(shù)是4而字?jǐn)?shù)是3,是因為第三行最后也有一個換行符,第四行是空行。字符數(shù)包括30個小數(shù)位、1個整數(shù)位、1個小數(shù)點、3個換行符、第二行和第三行每行2個空格?!纠?-3】文本統(tǒng)計我們還有一個存儲了圓周率1000000小數(shù)位的文本文件“pi_million.txt”。再次運行程序,結(jié)果如下:Pleaseinputthetextfilename:pi_million.txtNumberofcharacters:1030000Numberofwords:10000Numberoflines:10001同樣行數(shù)比字?jǐn)?shù)多了1,是因為最后有一行空行。1000000個小數(shù)位分布在10000行上,也就是每行100個小數(shù)位。字符數(shù)包括1000000個小數(shù)位、每行一個換行符、第一行1個整數(shù)位和1個小數(shù)點、其他行2個空格?!纠?-3】文本統(tǒng)計文件的方法本章案例也是打開文件后,一次性讀取文本文件中的所有內(nèi)容,讀完之后關(guān)閉文件,代碼如下:file_name=input("Pleaseinputthefilename(pivalue):")pi_file=open(file_name,'r')pi_text=pi_file.read()pi_file.close()讓用戶輸入文件名容易出錯,而以只讀方式打開文件時,如果文件找不到程序會報錯(FileNotFoundError)。下一小節(jié)將讓用戶從文件對話框中選擇文件。tkinter是Python開發(fā)圖形化用戶界面(GUI)的第三方庫,引入前也需要通過pip工具進行安裝。filedialog是tkinter庫中的一個包,其中定義了多個用來進行文件選擇的對話框類和函數(shù)。3.5.2tkinter中的filedialog函數(shù)功能askopenfile(mode='r')詢問一個要打開的文件名,并返回打開的文件,默認(rèn)打開方式是只讀askopenfilename()詢問一個要打開的文件名asksaveasfile(mode='w')詢問一個要另存為的文件名,并返回打開的文件,默認(rèn)打開方式是寫asksaveasfilename()詢問一個要另存為的文件名本章案例通過文件對話框來選擇要打開的文件,并讀取其中的內(nèi)容進行處理后與計算出來的pi值進行比較。fromtkinter.filedialogimportaskopenfilename#打開文件對話框file_name=askopenfilename()pi_file=open(file_name,'r')pi_text=pi_file.read()pi_file.close()pi_text=pi_text.replace('','')#刪去字符串中的空格pi_text=''.join(pi_text.split('\n'))#去掉字符串中的換行符pi_text=pi_text[2:]#截取小數(shù)部分3.5.2tkinter中的filedialog首先從filedialog包中引入askopenfilename()函數(shù),然后調(diào)用該函數(shù),程序運行時會出現(xiàn)文件打開對話框,用戶選擇文件后,該函數(shù)返回文件名。至此,本章案例除數(shù)據(jù)可視化部分已完成,將程序文件保存為ch03.py,運行程序,如果有錯誤則進行修正。調(diào)用print()函數(shù)輸出結(jié)果。試一試matplotlib是Python最常用的數(shù)據(jù)可視化第三方庫,引入前也需要通過pip工具進行安裝。pyplot是matplotlib庫中的一個包,用來進行交互式繪圖,主要包括散點圖和折線圖。引入方式如下:importmatplotlib.pyplotasplt3.6編程實踐:Matplotlib中的pyplot用散點圖的形式將【例2-4】的隨機漫步過程呈現(xiàn)出來,仍然假設(shè)日行一萬步,無需用戶輸入步數(shù)。【例3-4】隨機漫步可視化定義了兩個列表來存放每走一步后點的坐標(biāo),x_values用來存放橫坐標(biāo)的位置,y_values用來存放縱坐標(biāo)的位置,初始賦值就是原點的位置(0,0)。在隨機漫步一萬步的循環(huán)過程中,調(diào)用append()方法把每走一步新產(chǎn)生點的坐標(biāo)添加至列表中,循環(huán)結(jié)束后,兩個列表就存儲了所有點的坐標(biāo)。最后調(diào)用pyplot的scatter()方法繪制散點圖,第一個參數(shù)是橫坐標(biāo),第二個參數(shù)是縱坐標(biāo),第三個參數(shù)指定散點的大小,由于產(chǎn)生的點比較多,為了能看得更清晰,我們將點的大小設(shè)成了比較小的值,即s=1。為了突出隨機漫步的起點和終點,我們對這兩個點進行了特殊處理,(0,0)是起點,循環(huán)結(jié)束后的(x,y)是終點。將兩個點的顏色改為紅色,即:c='red';無邊框顏色,即:edgecolors='none';點的大小突出到50,即:s=50。再調(diào)用title()方法給散點圖加上標(biāo)題“RandomWalk”,字體大小為20;調(diào)用xlabel()方法設(shè)置x軸,字體大小為12;調(diào)用ylabel()方法設(shè)置y軸,字體大小為12;調(diào)用tick_params()方法設(shè)置兩個軸的刻度標(biāo)簽,字體大小為12。最后調(diào)用show()方法

溫馨提示

  • 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

提交評論