版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章程序的控制結(jié)構(gòu)信息學(xué)院2024引言5.1案例:標(biāo)普500行業(yè)數(shù)據(jù)分析5.2分支結(jié)構(gòu)5.3循環(huán)結(jié)構(gòu)5.4CSV文件5.5編程實(shí)踐:錯(cuò)誤處理5.6本章小結(jié)5.7習(xí)題本章將深入學(xué)習(xí)分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。在此基礎(chǔ)上還將學(xué)習(xí)常用的CSV數(shù)據(jù)文件。在章首案例的指引下,通過控制程序的執(zhí)行流程完成較為復(fù)雜的數(shù)據(jù)分析和處理工作。在編程實(shí)踐中,還將學(xué)習(xí)如何通過代碼來捕獲和處理程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤。5.1案例:標(biāo)普500行業(yè)數(shù)據(jù)分析標(biāo)準(zhǔn)普爾500指數(shù)(S&P500Index)是一個(gè)記錄美國(guó)500家上市公司的股票指數(shù),該指數(shù)占美國(guó)股票市場(chǎng)市值的80%。目前標(biāo)普500指數(shù)含有505只股票,因?yàn)橛?家公司有2類股,比如Google的母公司Alphabet就有A類股和C類股。本章案例從DataHub上搜集并下載的是2014年標(biāo)普500的財(cái)務(wù)數(shù)據(jù)文件“constituents_financials.csv”,讀取其中的數(shù)據(jù)進(jìn)行行業(yè)分析,比如各行業(yè)的股票數(shù)占比和總市值占比情況。CSV(CommaSeparatedValue)是一種用來存儲(chǔ)數(shù)據(jù)的純文本文件格式,可以用記事本、寫字板或電子表格軟件(如MicrosoftExcel)打開。首先通過文件對(duì)話框來選擇要打開的文件,注意這里的文件類型限定為CSV文件(*.csv)。5.1案例:標(biāo)普500行業(yè)數(shù)據(jù)分析找到文件后,程序出現(xiàn)如下提示:Numberofstocks(N)orMarketCapitalization(M)(Enterforexit):輸入“N”的結(jié)果如左圖所示,輸入“M”的結(jié)果如右圖所示。5.1案例:標(biāo)普500行業(yè)數(shù)據(jù)分析無論從股票數(shù)還是總市值來看,信息技術(shù)業(yè)、金融業(yè)、非必需消費(fèi)品業(yè)、醫(yī)療健康業(yè)、工業(yè)都位居前五,其中信息技術(shù)業(yè)領(lǐng)先優(yōu)勢(shì)明顯,其次是金融業(yè)。從股票數(shù)來看,從高到低依次是非必需消費(fèi)品業(yè)(16.63%)、信息技術(shù)業(yè)(13.85%)、金融業(yè)(13.47%)、工業(yè)(13.27%)和醫(yī)療健康業(yè)(12.08%)。從總市值來看,從高到低依次是信息技術(shù)業(yè)(27.05%)、金融業(yè)(13.84%)、醫(yī)療健康業(yè)(13.05%)、非必需消費(fèi)品業(yè)(12.92%)和工業(yè)(9.70%)。5.1案例:標(biāo)普500行業(yè)數(shù)據(jù)分析之后,程序再次出現(xiàn)選擇提示,可以再次輸入“N”或“M”。如果二者都不是,出現(xiàn)“Wronginput,pleasetryagain.”的提示信息。如果用戶什么也不輸入直接回車,程序結(jié)束。這樣的程序設(shè)計(jì)可以讓用戶在一次程序運(yùn)行的過程中進(jìn)行多次輸入選擇,即使輸入錯(cuò)誤也可以再次輸入,而無需每次都重新運(yùn)行一次程序。5.1案例:標(biāo)普500行業(yè)數(shù)據(jù)分析Python的分支結(jié)構(gòu)使用if語(yǔ)句來構(gòu)成,包括單分支語(yǔ)句、雙分支語(yǔ)句和多分支語(yǔ)句。第1章中已經(jīng)介紹過if-else雙分支語(yǔ)句,在前面的幾章中也已經(jīng)使用過更為簡(jiǎn)單的if單分支語(yǔ)句,本節(jié)主要介紹if-elif-else多分支語(yǔ)句。5.2分支結(jié)構(gòu)多分支結(jié)構(gòu)可以用嵌套的雙分支語(yǔ)句來實(shí)現(xiàn),但使用多分支結(jié)構(gòu)更加簡(jiǎn)潔、直觀。多分支語(yǔ)句即在else后直接跟if形成一個(gè)elif的單一分支,其語(yǔ)法形式如下:if<condition-1>:<case-1-statements>elif<condition-2>:<case-2-statements>…elif<condition-n>:<case-n-statements>else:<default-statements>5.2.1if-elif-else多分支語(yǔ)句5.2.1if-elif-else多分支語(yǔ)句任何能被400整除的年份都是閏年;在剩下的年份中,任何能被100整除的年份都不是閏年;在剩下的年份中,任何能被4整除的年份都是閏年;其他年份都不是閏年?!纠?-1】判定某年是否為閏年根據(jù)規(guī)則采用多分支結(jié)構(gòu)判定是否為閏年,如果是閏年,isLeapYear賦值為True,如果不是則賦值為False。運(yùn)行程序,輸入“2000”,觀察結(jié)果。再次運(yùn)行程序,輸入“1800”,觀察結(jié)果。第三次運(yùn)行程序,輸入“1840”,,觀察結(jié)果。最后一次運(yùn)行程序,輸入你的出生年份,觀察結(jié)果?!纠?-1】判定某年是否為閏年P(guān)ython中的條件表達(dá)式允許你在一行語(yǔ)句中根據(jù)不同的條件來進(jìn)行不同的賦值,其語(yǔ)法形式如下:XifCelseY先執(zhí)行中間的ifC,如果值為True,就將左邊的X作為結(jié)果返回,否則將右邊的Y作為結(jié)果返回。比如:c=aifa>belseb如果a大于b,條件表達(dá)式的結(jié)果為a,否則為b,然后將結(jié)果賦值給c,即c總是a和b中的最大值。用雙分支結(jié)構(gòu)為:ifa>b:
c=aelse:
c=b5.2.2條件表達(dá)式一年分為十二星座,分別是魔羯座(12/22~01/19)、水瓶座(01/20~02/18)、雙魚座(02/19~03/20)、白羊座(03/21~04/19)、金牛座(04/20~05/20)、雙子座(05/21~06/20)、巨蟹座(06/21~07/22)、獅子座(07/23~08/22)、處女座(08/23~09/22)、天秤座(09/23~10/22)、天蝎座(10/23~11/21)、射手座(11/22~12/21)?!纠?-2】查詢出生日期的星座由用戶輸入兩位的月份和兩位的日期,用“/”分隔,然后調(diào)用split()方法對(duì)輸入的字符串進(jìn)行分割,分別賦值給mm和dd,并將dd轉(zhuǎn)換為整數(shù)。采用多分支結(jié)構(gòu)判斷mm的值,由于一個(gè)月內(nèi)前后有兩種不同的星座,采用條件表達(dá)式來判斷dd在哪一個(gè)日期范圍并將相應(yīng)的星座賦值給const,如果月份有誤,const賦值為空串。采用條件表達(dá)式來判斷輸入是否有效,如果有效輸出星座查詢結(jié)果,否則提示輸入錯(cuò)誤。5.3循環(huán)結(jié)構(gòu)第1章中已經(jīng)介紹過for語(yǔ)句,本節(jié)主要介紹while語(yǔ)句。和分支結(jié)構(gòu)一樣,循環(huán)結(jié)構(gòu)也可以嵌套,嵌套循環(huán)比較復(fù)雜,要特別注意程序執(zhí)行的流程。5.3.1while語(yǔ)句for循環(huán)在循環(huán)開始的時(shí)候迭代次數(shù)就已經(jīng)確定了,到達(dá)迭代次數(shù)后,循環(huán)就終止了。如果我們?cè)谘h(huán)開始的時(shí)候無法確定迭代的次數(shù),就需要用到while語(yǔ)句。while循環(huán)也稱為條件循環(huán),其語(yǔ)法形式如下:while<condition>:<statements><condition>為條件表達(dá)式,其值為布爾型,即True或False。只要條件表達(dá)式的值為True,while下的語(yǔ)句塊(循環(huán)體)就會(huì)不斷被循環(huán)執(zhí)行;如果想要終止循環(huán),就要想辦法使條件表達(dá)式的值變?yōu)镕alse。死循環(huán)(infiniteloop)while語(yǔ)句功能強(qiáng)大,for語(yǔ)句的功能都可以用while語(yǔ)句實(shí)現(xiàn),反之則不然。我們來看一個(gè)簡(jiǎn)單的例子,循環(huán)輸出0-9的數(shù)字。用for語(yǔ)句實(shí)現(xiàn)的代碼如下:foriinrange(10):print(i)其中i是循環(huán)變量,會(huì)自動(dòng)遍歷range(10)中的所有值,在遍歷結(jié)束后循環(huán)即終止。死循環(huán)(infiniteloop)而在while結(jié)構(gòu)中并沒有循環(huán)變量,也不會(huì)自動(dòng)終止,需要自行定義并賦值,通過條件來控制循環(huán)是否繼續(xù)執(zhí)行。用while語(yǔ)句實(shí)現(xiàn)的代碼如下:i=0whilei<10:print(i)
i+=1如果忘記在循環(huán)體中對(duì)i的值進(jìn)行累加,程序執(zhí)行結(jié)果會(huì)怎樣?不斷被執(zhí)行、停不下來的循環(huán)被稱為死循環(huán)。程序執(zhí)行發(fā)生死循環(huán)時(shí),可以在IDLE解釋器中通過快捷鍵“Ctrl+C”或者Shell菜單下的“InterruptExecution”來強(qiáng)行終止程序運(yùn)行。試一試交互式循環(huán)(interactiveloop)交互式循環(huán)是while語(yǔ)句常用的一種循環(huán)模式,在每一次循環(huán)迭代中由用戶輸入數(shù)據(jù),程序進(jìn)行數(shù)據(jù)處理,然后詢問用戶是否還要繼續(xù)輸入數(shù)據(jù)。moredata=Truewhilemoredata:#getdataitemfromuser#processdataitem#askuserifthereismoredata其中布爾變量moredata表示是否還要繼續(xù)輸入數(shù)據(jù),初值為True,在用戶沒有更多數(shù)據(jù)需要輸入時(shí),將其賦值為False,循環(huán)終止。平均績(jī)點(diǎn)=∑(課程學(xué)分×課程績(jī)點(diǎn))÷∑課程學(xué)分課程績(jī)點(diǎn)的計(jì)算方法不同高校各有不同,這里采用如下方法:4.5(95~100)、4.0(90~94)、3.5(85~89)、3.0(80~84)、2.5(75~79)、2.0(70~74)、1.5(65~69)、1.0(60~64)、0(60以下)?!纠?-3】計(jì)算平均績(jī)點(diǎn)(GPA)為了計(jì)算平均績(jī)點(diǎn),定義了三個(gè)累加變量totalCourses、totalCredits和totalGradePoints,賦初值為0。通過while循環(huán)來不斷獲取用戶輸入的課程學(xué)分和課程成績(jī)?!纠?-3】計(jì)算平均績(jī)點(diǎn)(GPA)在用戶每次循環(huán)迭代后,詢問用戶是否還有更多課程要輸入,如果用戶輸入“N”或者“n”,則將more賦值為False,循環(huán)條件不再滿足,退出循環(huán)。為了用戶輸入方便,如果需要繼續(xù)輸入,直接回車即可,或者輸入其他任意字符。運(yùn)行程序,輸入第一門課(學(xué)分2、成績(jī)94),程序問“Morecourses?(Y/N)”,直接輸入回車?yán)^續(xù)輸入第二門課(學(xué)分3,成績(jī)88),程序再問“Morecourses?(Y/N)”,輸入“n”,循環(huán)結(jié)束,輸出“2courses;5credits;GPAis3.70.”。再次運(yùn)行程序,輸入截止目前你所有課程的學(xué)分和成績(jī),看看你的平均績(jī)點(diǎn)是多少??!纠?-3】計(jì)算平均績(jī)點(diǎn)(GPA)標(biāo)記控制循環(huán)一直處理數(shù)據(jù)直到數(shù)據(jù)達(dá)到一個(gè)標(biāo)記循環(huán)結(jié)束的特殊值,這個(gè)特殊值(標(biāo)記)可以是任意值,但要和要處理的數(shù)據(jù)值有所區(qū)別。其一般形式為:#getthefirstdataitem#whileitemisnotthesentinel:#processtheitem#getthenextdataitem循環(huán)開始之前讀取第一個(gè)數(shù)據(jù)項(xiàng),如果這個(gè)數(shù)據(jù)項(xiàng)的值就是標(biāo)記,循環(huán)不會(huì)被執(zhí)行,數(shù)據(jù)也不會(huì)被處理。標(biāo)記控制循環(huán)(sentinelloop)如果第一個(gè)數(shù)據(jù)項(xiàng)不是標(biāo)記,循環(huán)被執(zhí)行,數(shù)據(jù)被處理,并獲取下一個(gè)數(shù)據(jù)項(xiàng),如此循環(huán)迭代,直到被輸入的數(shù)據(jù)項(xiàng)是標(biāo)記,循環(huán)結(jié)束。一個(gè)典型的標(biāo)記是空字符串,如果用戶什么也沒輸入而是直接按下回車鍵,input函數(shù)返回的就是空串,以此作為標(biāo)記來結(jié)束循環(huán),既方便用戶,也不會(huì)和要處理的數(shù)據(jù)混淆。本章案例中用戶可以循環(huán)選擇查看行業(yè)的股票只數(shù)占比情況或是市值占比情況,變量choice用來接收用戶的選擇,“N”表示股票只數(shù),“M”表示市值,如果用戶想終止循環(huán)退出程序,可以直接回車。標(biāo)記控制循環(huán)(sentinelloop)importmatplotlib.pyplotasplt#數(shù)據(jù)可視化工具#繪制餅圖,根據(jù)用戶選擇顯示市值占比或股票只數(shù)占比choice
=input("Numberofstocks(N)orMarketCapitalization(M)(Enterforexit):")whilechoice:ifchoice.upper()=='N':plt.pie(num,labels=sector,autopct='%5.2f%%')plt.title("Numberofstocks",fontsize=16)plt.show()elifchoice.upper()=='M':plt.pie(market_cap,labels=sector,autopct='%5.2f%%')plt.title("MarketCapitalization",fontsize=16)plt.show()else:print("Wronginput,pleasetryagain.")choice=input("Numberofstocks(N)orMarketCapitalization(M)(Enterforexit)")標(biāo)記控制循環(huán)(sentinelloop)注意:接收用戶的輸入語(yǔ)句出現(xiàn)了兩次,第一次在循環(huán)之前,第二次在循環(huán)體內(nèi)的最后。我們?cè)诘?章中已經(jīng)學(xué)習(xí)了如何利用matplotlib庫(kù)中的pyplot包繪制散點(diǎn)圖和折線圖,本章案例調(diào)用pyplot包的pie()方法來繪制餅圖。變量num和market_cap分別是存放行業(yè)的股票總數(shù)和總市值的列表,作為繪制餅圖的主要數(shù)據(jù)源,列表中的每個(gè)元素對(duì)應(yīng)餅圖中的一個(gè)扇形;labels參數(shù)是各個(gè)扇形的標(biāo)簽,這里就是存放行業(yè)數(shù)據(jù)的變量sector;autopct參數(shù)設(shè)置餅圖內(nèi)各個(gè)扇形百分比的顯示格式,“%d%%”是整數(shù)百分比,“%0.2f%%”是兩位小數(shù)百分比。標(biāo)記控制循環(huán)(sentinelloop)第3章中(3.3和3.4)介紹過break語(yǔ)句可以用來跳出for循環(huán),對(duì)于while循環(huán)也適用。如上的標(biāo)記控制循環(huán)使用break語(yǔ)句可以采用如下形式:whileTrue:#getdataitem#ifdataitemisthesentinel:break#processdataitemwhileTrue是一個(gè)死循環(huán),但我們可以在循環(huán)體中加入條件判斷,當(dāng)某個(gè)條件滿足時(shí),就退出循環(huán),從而避免死循環(huán)的發(fā)生。使用break語(yǔ)句退出循環(huán)后,循環(huán)體中后面的語(yǔ)句就不會(huì)被執(zhí)行,因此無需使用else語(yǔ)句。半途退出循環(huán)(loopandahalf)下面我們對(duì)【例5-1】進(jìn)行修改,使得程序循環(huán)運(yùn)行,可以判定多個(gè)年份是否為閏年,直到用戶輸入“-1”為止:whileTrue:
year=int(input("Year(-1forexit):"))ifyear==-1:breakifyear%400==0:
isLeapYear=Trueelifyear%100==0:
isLeapYear=Falseelifyear%4==0:
isLeapYear=Trueelse:
isLeapYear=FalseifisLeapYear:print(year,"isaleapyear.")else:print(year,"isnotaleapyear.")半途退出循環(huán)(loopandahalf)5.3.2嵌套循環(huán)在嵌套循環(huán)中,內(nèi)層循環(huán)出現(xiàn)在外層循環(huán)的循環(huán)體中,外層循環(huán)的每一次迭代,都包含內(nèi)部循環(huán)的全部迭代。設(shè)計(jì)嵌套循環(huán)的最好方法是:先設(shè)計(jì)好外層循環(huán)而不去考慮內(nèi)層細(xì)節(jié),再去設(shè)計(jì)內(nèi)層循環(huán)不用考慮外層細(xì)節(jié)。凱撒密碼(Caesarcipher)是一種位移替換密碼,將某個(gè)明文字母做N位偏移得到密文,位數(shù)N就是凱撒密碼加密和解密的密鑰。比如,位數(shù)為3時(shí),A變成D、B變成E、C變成F、……、X變成A、Y變成B、Z變成C。大寫和小寫字母都可以加密,非字母字符不變。【例5-4】凱撒密碼外層是一個(gè)while死循環(huán),循環(huán)體內(nèi)有一個(gè)退出條件,即輸入信息(變量orig)為空串時(shí)?!纠?-4】凱撒密碼通過內(nèi)層for循環(huán)對(duì)于輸入信息的每一個(gè)字符(變量ch)進(jìn)行處理。變量pos是字符相對(duì)于“A”或“a”的位置,首先從字母轉(zhuǎn)換成相應(yīng)的ASCII值,由于是循環(huán)位移,加上位移數(shù)后還需要對(duì)26求余,得到新的ASCII值后再轉(zhuǎn)換成字符?!纠?-4】凱撒密碼5.4CSV文件本節(jié)介紹常用的數(shù)據(jù)文件之一:CSV文件。CSV(CommaSeparatedValue)是具有特殊格式的純文本文件,通常用來存儲(chǔ)表格數(shù)據(jù)。5.4.1CSV格式CSV文件由多行組成,表示表格數(shù)據(jù)中的記錄。每條記錄則由多個(gè)字段組成,字段間的分隔符最常見的是逗號(hào)或制表符,通常所有記錄都有完全相同的字段序列。CSV文件可以使用Windows附件中的記事本或?qū)懽职宕蜷_,也可以使用Office中的Excel應(yīng)用程序通過簡(jiǎn)單的轉(zhuǎn)換后打開。5.4.1CSV格式5.4.2CSV庫(kù)Python提供了csv標(biāo)準(zhǔn)庫(kù)對(duì)CSV格式的文件進(jìn)行讀取和寫入,引入它之后就可以調(diào)用其中的函數(shù)進(jìn)行操作。函數(shù)功能reader(f)讀取文件對(duì)象f,返回一個(gè)迭代器對(duì)象,可以用來遍歷文件中的每一行數(shù)據(jù)writer(f)寫入文件對(duì)象f,返回一個(gè)csv編碼器對(duì)象,調(diào)用其方法可以將數(shù)據(jù)寫入文件,其中writerow()方法寫入一行,writerows()方法寫入多行【例5-5】輸入課程數(shù)據(jù)存入文件變量course是存放課程學(xué)分和成績(jī)的元組,courses是存放所有course的列表。以追加的形式打開文件“credit_score.csv”。由于CSV文件中行與行之間本身就有換行符,使用默認(rèn)值會(huì)出現(xiàn)空行,因此將newline參數(shù)賦值為空串。調(diào)用csv庫(kù)的writer()函數(shù),返回csv編碼器對(duì)象賦值給變量csvWriter,調(diào)用該對(duì)象的writerows()方法將所有的課程數(shù)據(jù)寫入文件。運(yùn)行程序,輸入第一門課(學(xué)分2、成績(jī)94),程序問“Morecourses?(Y/N)”,直接輸入回車?yán)^續(xù)輸入第二門課(學(xué)分3,成績(jī)88),程序再問“Morecourses?(Y/N)”,輸入“n”,循環(huán)結(jié)束,輸入的課程數(shù)據(jù)被保存至文件“credit_score.csv”。再次運(yùn)行程序,添加更多課程數(shù)據(jù)至該文件?!纠?-5】輸入課程數(shù)據(jù)存入文件【例5-6】讀取課程數(shù)據(jù)并計(jì)算GPA調(diào)用csv庫(kù)的reader()函數(shù),返回迭代器對(duì)象并轉(zhuǎn)換成列表賦值給變量courses。使用for循環(huán)遍歷courses中的每一門課,每一門課包含兩個(gè)元素,第一個(gè)是學(xué)分,第二個(gè)是成績(jī),轉(zhuǎn)換成整型后分別賦值給變量credit和score。運(yùn)行程序,假設(shè)文件中包含之前輸入的兩門課程,則輸出“2courses;5credits;GPAis3.70.”。5.4.2CSV庫(kù)本章案例要從文件“constituents_financials.csv”中讀取標(biāo)普500的財(cái)務(wù)數(shù)據(jù),并進(jìn)行行業(yè)數(shù)據(jù)分析。從文件中讀取數(shù)據(jù)的代碼如下:importcsvf=open("constituents_financials.csv",'r')sp500=list(csv.reader(f))#轉(zhuǎn)換成列表,每個(gè)元素即一行f.close()5.4.2CSV庫(kù)CSV文件中還包括標(biāo)題行。標(biāo)題行和數(shù)據(jù)行不同,因此分開進(jìn)行處理,代碼如下:title=sp500[0]#第一行是標(biāo)題sector_ind=title.index('Sector')#獲得行業(yè)的下標(biāo)market_ind=title.index('MarketCap')#獲得市值的下標(biāo)sp500=sp500[1:]5.4.2CSV庫(kù)接下來從數(shù)據(jù)記錄中找出所有行業(yè),代碼如下:sector=set()#行業(yè)的集合foreachinsp500:
sector.add(each[sector_ind])sector=tuple(sector)#轉(zhuǎn)換成元組sector為集合類型,重復(fù)的行業(yè)不會(huì)被添加進(jìn)去。sector_ind是之前找出的“Sector”字段的下標(biāo)。為后續(xù)數(shù)據(jù)處理方便,將變量sector轉(zhuǎn)換為元組。5.4.2CSV庫(kù)接下來就是最重要的行業(yè)數(shù)據(jù)分析,得到所有行業(yè)的股票總數(shù)和總市值,代碼如下:num,market_cap=[],[]#股票總數(shù)和總市值的列表forsecinsector:#對(duì)每個(gè)行業(yè)循環(huán)
num_sec=0#每個(gè)行業(yè)的股票總數(shù)
market_cap_sec=0#每個(gè)行業(yè)的總市值foreachinsp500:#對(duì)每只股票循環(huán)ifeach[sector_ind]==sec:
num_sec+=1
market_cap_sec+=int(each[market_ind])
num.append(num_sec)
market_cap.append(market_cap_sec)5.4.2CSV庫(kù)變量num是存放所有行業(yè)股票數(shù)的列表,變量market_cap是存放所有行業(yè)總市值的列表。外循環(huán)遍歷sector中的每一個(gè)行業(yè),累加變量num_sec和market_cap_sec分別用來統(tǒng)計(jì)該行業(yè)的股票數(shù)和總市值,統(tǒng)計(jì)好后添加至相應(yīng)的列表num和market_cap。內(nèi)循環(huán)則是對(duì)某一個(gè)行業(yè)sec進(jìn)行統(tǒng)計(jì)的過程,遍歷sp500中的每一只股票,如果屬于sec這個(gè)行業(yè),則對(duì)num_sec和market_cap_sec進(jìn)行累加。由于CSV文件是純文本文件,讀取出來的數(shù)據(jù)要進(jìn)行數(shù)值運(yùn)算,需要轉(zhuǎn)換成數(shù)值類型。至此,本章案例除錯(cuò)誤處理部分已完成,將程序文件保存為ch05.py,將數(shù)據(jù)文件“constituents_financials.csv”與程序文件保存至同一路徑下,運(yùn)行程序,如有錯(cuò)誤則進(jìn)行修正。試一試5.5編程實(shí)踐:錯(cuò)誤處理程序設(shè)計(jì)語(yǔ)言提供的錯(cuò)誤處理機(jī)制使得程序員可以通過代碼來捕獲和處理程序運(yùn)行時(shí)的錯(cuò)誤,而不是運(yùn)行時(shí)一發(fā)生錯(cuò)誤程序就崩潰,出現(xiàn)一段“Traceback”的錯(cuò)誤提示。錯(cuò)誤處理機(jī)制保證即使程序運(yùn)行出現(xiàn)錯(cuò)誤,程序的控制權(quán)還掌握在程序員手中。5.5編程實(shí)踐:錯(cuò)誤處理Python中的錯(cuò)誤處理是通過一種特殊的控制結(jié)構(gòu)(try-except)來完成的,這種結(jié)構(gòu)類似于分支結(jié)構(gòu),其語(yǔ)法形式如下:try:<statements>except<error-1>:<error-1statements>…except<error-n>:<error-nstatements>5.5編程實(shí)踐:錯(cuò)誤處理Python遇到try語(yǔ)句時(shí),就會(huì)嘗試執(zhí)行其中的語(yǔ)句塊,如果執(zhí)行過程中沒有發(fā)生錯(cuò)誤,執(zhí)行結(jié)束后程序就會(huì)轉(zhuǎn)移到try-except結(jié)構(gòu)之后的語(yǔ)句開始執(zhí)行。如果發(fā)生了錯(cuò)誤,Python就會(huì)去查找與錯(cuò)誤類型匹配的except子句,并執(zhí)行其中的語(yǔ)句塊進(jìn)行錯(cuò)誤處理,try語(yǔ)句塊中的剩余語(yǔ)句不會(huì)被執(zhí)行。如果找不到對(duì)應(yīng)錯(cuò)誤類型的except字句,程序仍然會(huì)崩潰并出現(xiàn)“Traceback”的錯(cuò)誤提示。在【例5-1】中,如果程序運(yùn)行時(shí),用戶沒有輸入正確的年份,而是輸入“abcd”,那么在將用戶的輸入轉(zhuǎn)換成數(shù)值型進(jìn)行運(yùn)算時(shí)就會(huì)發(fā)生“ValueError”?!纠?-7】給例1加入循環(huán)和錯(cuò)誤處理【例5-7】給例1加入循環(huán)和錯(cuò)誤處理最外層加入while循環(huán),將可能出錯(cuò)的語(yǔ)句放在try語(yǔ)句塊中,加入捕獲值錯(cuò)誤的except子句。如果用戶輸入不正確,執(zhí)行到第3行語(yǔ)句時(shí)出錯(cuò),程序轉(zhuǎn)向except子句并執(zhí)行其中的語(yǔ)句塊,即提示用戶輸入正確的年份,然后開始下一次循環(huán)迭代。【例5-7】給
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療器械臨床試驗(yàn)相關(guān)知識(shí)考核試題及答案
- 2025制式裝修合同協(xié)議書
- 2025肉類供貨合同樣本
- 2025借款合同和貸款合同
- 2025無償贈(zèng)與合同范文
- 江蘇省昆山學(xué)年度第一學(xué)期工會(huì)工作參考計(jì)劃
- mod法培訓(xùn)心得模板
- bog回收協(xié)議模板
- 電子設(shè)備合同歸檔操作手冊(cè)
- 信息技術(shù)基礎(chǔ)設(shè)施管理規(guī)章
- 2024年管理學(xué)理論考核試題及答案
- 地理信息系統(tǒng)試卷及答案
- 干部考察延伸談話范圍
- 2023全球信息技術(shù)報(bào)告
- (新)公共常識(shí)知識(shí)考試復(fù)習(xí)題庫(kù)800題(含答案)
- 叉車維修檢驗(yàn)原始記錄
- Invoice商業(yè)發(fā)票模板
- 施工過程三檢記錄表
- 商務(wù)信函中的模糊語(yǔ)言及其翻譯策略的中期報(bào)告
- 業(yè)務(wù)下單流程標(biāo)準(zhǔn)規(guī)范
- “家園”協(xié)力小班幼兒勞動(dòng)教育的實(shí)踐研究 論文
評(píng)論
0/150
提交評(píng)論