Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第5章 程序控制結(jié)構(gòu)_第1頁
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第5章 程序控制結(jié)構(gòu)_第2頁
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第5章 程序控制結(jié)構(gòu)_第3頁
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第5章 程序控制結(jié)構(gòu)_第4頁
Python 3 基礎(chǔ)教程(第3版)(慕課版) 課件 第5章 程序控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Python3基礎(chǔ)教程第3版慕課版單元5程序控制結(jié)構(gòu)任務(wù)5-1:計算個人綜合所得稅【任務(wù)目標(biāo)】【任務(wù)實施】演示過程……5.1.1

程序的基本控制結(jié)構(gòu)程序的三種基本結(jié)構(gòu)為:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)的程序按語句的先后順序依次執(zhí)行各條語句。通常,程序默認(rèn)為順序結(jié)構(gòu)Python總是從程序的第一條語句開始,按順序依次執(zhí)行語句。典型的順序結(jié)構(gòu)。#輸入兩個整數(shù),用不同的轉(zhuǎn)換方法a=eval(input('請輸入第1個整數(shù):'))b=int(input('請輸入第2個整數(shù):'))#將a轉(zhuǎn)換為浮點數(shù)輸出print('float(%s)='%a,float(a))print('格式化為浮點數(shù):%e,%f'%(a,b))#創(chuàng)建復(fù)數(shù)輸出print('complex(%s,%s)='%(a,b),complex(a,b))分支結(jié)構(gòu)指程序根據(jù)條件執(zhí)行不同的代碼塊。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu),示例代碼如下。ifx>0:print('%s是正數(shù)'%x) #條件x>0成立時執(zhí)行該語句else:print('%s小于等于0'%x) #條件x>0不成立時執(zhí)行該語句循環(huán)結(jié)構(gòu)指程序根據(jù)條件重復(fù)執(zhí)行同一個代碼塊示例代碼如下。forxinrange(5): #x依次取0、1、2、3、4print(x) #重復(fù)執(zhí)行該語句5次5.1.2分支結(jié)構(gòu)--if語句if語句可實現(xiàn)程序的分支結(jié)構(gòu)包括單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)分別可通過單分支if語句、雙分支if語句、多分支if語句實現(xiàn)。1.

單分支if語句單分支if語句的基本結(jié)構(gòu)如下。if條件表達(dá)式:

語句塊當(dāng)條件表達(dá)式計算結(jié)果為True時,執(zhí)行語句塊中的代碼否則,不執(zhí)行語句塊中的代碼。單分支if語句的執(zhí)行流程如圖所示示例代碼如下。>>>x=5>>>ifx>0:...print(x,'是正數(shù)')...5是正數(shù)2.雙分支if語句雙分支if語句的基本結(jié)構(gòu)如下。if條件表達(dá)式:

語句塊1else:

語句塊2當(dāng)條件表達(dá)式計算結(jié)果為True時,執(zhí)行語句塊1中的代碼;否則,執(zhí)行語句塊2中的代碼。雙分支if語句的執(zhí)行流程如圖所示示例代碼如下。>>>x=-5>>>ifx>0:...print(x,'是正數(shù)')...else:...print(x,'不是正數(shù)')...-5不是正數(shù)3.多分支if語句多分支if語句的基本結(jié)構(gòu)如下。if條件表達(dá)式1:

語句塊1elif條件表達(dá)式2:

語句塊2……elif條件表達(dá)式n:

語句塊nelse:

語句塊n+1else部分可以省略。多分支if語句的執(zhí)行流程如圖所示示例代碼如下。>>>x=85>>>ifx<60:...print('不及格')...elifx<70:...print('及格')...elifx<90:...print('中等')...else:...print('優(yōu)秀')...中等4.if…else三元表達(dá)式if…else三元表達(dá)式是簡化版的if…else語句,其基本格式如下。表達(dá)式1if條件表達(dá)式else表達(dá)式2當(dāng)條件表達(dá)式計算結(jié)果為True時,將表達(dá)式1的值作為三元表達(dá)式的結(jié)果;否則,將表達(dá)式2的值作為三元表達(dá)式的結(jié)果。示例代碼如下。>>>a=2>>>b=3>>>x=aifa<belseb #a<b結(jié)果為True,將a的值2賦值給x>>>x2>>>x=aifa>belseb #a>b結(jié)果為False,將b的值3賦值給x>>>x35.列表三元表達(dá)式基本格式如下。[表達(dá)式1,表達(dá)式2][條件表達(dá)式]當(dāng)條件表達(dá)式計算結(jié)果為False時,將表達(dá)式1的值作為三元表達(dá)式的值;否則,將表達(dá)式2的值作為三元表達(dá)式的值示例代碼如下。>>>x=5>>>y=10>>>[x,y][x<y] #x<y結(jié)果為True,返回y的值10>>>[x,y][x>y] #x>y結(jié)果為False,返回x的值55.1.3分支結(jié)構(gòu)語句——match語句match語句與C語言、Java語言中的switch語句類似,用于實現(xiàn)多分支結(jié)構(gòu),其基本結(jié)構(gòu)如下。match表達(dá)式:case模式1:分支1case模式2:分支2……case_:分支nmatch語句將表達(dá)式的值依次與case語句中的模式進(jìn)行匹配,如果匹配成功,則執(zhí)行對應(yīng)的分支。如果沒有匹配成功,則不執(zhí)行任何分支。“_”為通配符,可匹配任意值,即必定會匹配成功。1.匹配字面值match語句最簡單的形式是將一個目標(biāo)值與一個或多個字面值進(jìn)行匹配,示例代碼如下。#test5_10.py:判斷三原色x=input('請輸入一個表示顏色的字符:')matchx:case'r':print(x,'表示紅色')case'g':print(x,'表示綠色')case'b':print(x,'表示藍(lán)色')case_:print(x,'是無效字符')可以使用“|”符號在模式中組合多個字面值,示例代碼如下。#test5_11.py:根據(jù)成績輸出分級評語x=int(input('請輸入一個成績(在[0,100]中的整數(shù)):'))matchx//10:#取x除以10的整數(shù)case9|10:print(x,'優(yōu)秀')case7|8:print(x,'中等')case6:print(x,'及格')case_:print(x,'差或無效')2.在模式中使用變量match語句允許使用類似解包的模式,并可綁定變量,示例代碼如下。#test5_12.py:判斷二元組表示點的位置p=eval('('+input('請輸入點坐標(biāo)(逗號分隔):')+')')#將輸入的點坐標(biāo)轉(zhuǎn)換為元組matchp:case(0,0):print(p,'為坐標(biāo)原點')case(0,y):#匹配第1個值為0的任意二元組print(p,'為Y軸上的點')case(x,0):#匹配第2個值為0的任意二元組print(p,'為X軸上的點')case(x,y):#匹配任意二元組print(p,'不是坐標(biāo)軸上的點')case_:#匹配非二元組print(p,'不是二元組')3.使用嵌套模式match語句允許使用嵌套模式,如包含二元組的列表,示例代碼如下。#test5_13.py:使用嵌套模式匹配點列表p=[(2,0),(-2,0)]#預(yù)設(shè)二元組點列表matchp:case[]:print('點列表為空')case[(0,0)]:print('點列表只包含坐標(biāo)原點')case[(x,y)]:print('點列表包含一個不是坐標(biāo)原點的:(%s,%s)'%(x,y))case[(x1,0),(x2,0)]:print('點列表包含X軸上的兩個點:(%s,0),(%s,0)'%(x1,x2))case_:print('其他列表:',p)4.為模式添加匹配條件可以使用if子句為模式添加匹配條件,示例代碼如下。#test5_14.py:為模式添加匹配條件p=(2,0)#預(yù)設(shè)二元組matchp:case(x,y)ifx==y:print(p,'是直線y=x上的點')case(x,y):print(p,'不是直線y=x上的點')任務(wù)5-2:從文件中檢索指定唐詩【任務(wù)目標(biāo)】文件中按下面的格式保存了若干首唐詩。《春曉》作者:孟浩然春眠不覺曉,處處聞啼鳥。夜來風(fēng)雨聲,花落知多少。……編寫一個程序,輸入唐詩名稱,從文件中檢索唐詩并輸出,程序運(yùn)行結(jié)果如下。輸入唐詩名稱:登鸛雀樓《登鸛雀樓》作者:王之渙白日依山盡,黃河入海流。欲窮千里目,更上一層樓。【任務(wù)實施】演示過程……5.2循環(huán)結(jié)構(gòu)本節(jié)主要內(nèi)容:for循環(huán)while循環(huán)循環(huán)控制:continue、break5.2.1遍歷循環(huán):forfor語句實現(xiàn)遍歷循環(huán),其基本格式如下。forvarinobject:

循環(huán)體else:

語句塊2else部分可以省略。object是一個可迭代對象。for語句執(zhí)行時,依次將object中的數(shù)據(jù)賦值給變量var——該操作稱為迭代。var每賦值一次,則執(zhí)行一次循環(huán)體。循環(huán)執(zhí)行結(jié)束時,如果有else部分,則執(zhí)行對應(yīng)的語句塊。else部分只在正常結(jié)束循環(huán)時執(zhí)行。如果用break跳出循環(huán),則不會執(zhí)行else部分。在for語句中,用n表示object中數(shù)據(jù)的位置索引,for語句循環(huán)的執(zhí)行流程如圖所示示例代碼如下。#用x迭代元組中的對象,其中包含了一個嵌套的子元組>>>forxin(1,2,3,(4,5)): ...print(x)...123(4,5)>>>forxin'book’:#用x迭代字符串中的每個字符...print(x)...book>>>forxin(1,2,3): ...print(x*2)...else: #else部分在循環(huán)正常結(jié)束時執(zhí)行...print('loopover')...246loopover2.使用range()函數(shù)可以使用range()函數(shù)來生成包含連續(xù)多個整數(shù)的range對象,其基本格式為:range(end)range(start,end[,step])只指定一個參數(shù)(end)時,生成整數(shù)范圍為0~end-1。指定兩個參數(shù)(start和end)時,生成整數(shù)范圍為start~end-1。整數(shù)之間的差值為step,step默認(rèn)為1。示例代碼如下。>>>forxinrange(3):...print(x)...012>>>forxinrange(-2,2):...print(x)...-2-101>>>forxinrange(-2,2,2):...print(x)...-20可在for循環(huán)中用多個變量來迭代序列對象,示例代碼如下。>>>for(a,b)in((1,2),(3,4),(5,6)):...print(a,b)...123456#等價于fora,bin((1,2),(3,4),(5,6)):與賦值語句類似,可以用“*”表示給變量賦值一個列表,示例代碼如下。>>>for(a,*b)in((1,2,'abc'),(3,4,5)):...print(a,b)...1[2,'abc']3[4,5]4.嵌套的for循環(huán)Python允許嵌套使用for循環(huán),即在for循環(huán)內(nèi)部使用for循環(huán)。例如,下面的代碼輸出100以內(nèi)的素數(shù)——除了1和它本身之外不能被其他數(shù)整除的數(shù)是素數(shù)。print(1,2,3,end="") #1、2、3是素數(shù),直接輸出,end=""使后續(xù)輸出不換行forxinrange(4,100):forninrange(2,x):ifx%n==0: #若余數(shù)為0,說明x不是素數(shù),結(jié)束當(dāng)前for循環(huán)breakelse:print(x,end='') #正常結(jié)束for循環(huán),說明x是素數(shù),輸出else:print('over')5.2.2無限循環(huán):while1.while語句循環(huán)的基本結(jié)構(gòu)while語句基本結(jié)構(gòu)如下。while條件表達(dá)式:

循環(huán)體else:

語句塊2,else部分語句可以省略。while語句循環(huán)的執(zhí)行流程如圖所示。如果條件表達(dá)式始終為True,則構(gòu)造無限循環(huán)——也稱“死循環(huán)”。計算1+2+……+100。s=0n=1whilen<=100:s=s+nn=n+1print('1+2+...+100=',s)用while循環(huán)來輸出100以內(nèi)的素數(shù)。x=1whilex<100:n=2whilen<x-1:ifx%n==0:break #若余數(shù)為0,說明x不是素數(shù),結(jié)束當(dāng)前循環(huán)

n+=1else:print(x,end='') #正常結(jié)束循環(huán),說明x沒有被任何數(shù)整除,是素數(shù),輸出

x+=1else:print('over')2.嵌套使用while循環(huán)Python允許在while循環(huán)的內(nèi)部使用while循環(huán)。例如,下面的代碼輸出九九乘法表。a=1whilea<10:b=1whileb<=a:print('%d*%d=%2d'%(a,b,a*b),end='')b+=1print()a+=15.2.3循環(huán)控制:break和continue在for循環(huán)和while循環(huán)中可以使用break和continue語句。break語句用于跳出當(dāng)前循環(huán),即提前結(jié)束循環(huán)(包括跳過else)。continue則用于跳過循環(huán)體剩余語句,回到循環(huán)開頭開始下一次循環(huán)。用for循環(huán)找出100~999范圍內(nèi)的前10個回文數(shù)字——3位數(shù)中個位和百位相同的數(shù)字為回文數(shù)字。a=[]n=0forxinrange(100,999):s=str(x)ifs[0]!=s[-1]:continue #如果x不是回文數(shù)字,回到循環(huán)開頭,x取下一個值開始循環(huán)

a.append(x) #x是回文數(shù)字,將其加入列表

n+=1 #累計獲得的回文數(shù)字個數(shù)

ifn==10:break #找出10個回文數(shù)字時,跳出for循環(huán)print(a) #break跳出時,跳轉(zhuǎn)到該處執(zhí)行將上面的代碼中的for循環(huán)改為while循環(huán),可以實現(xiàn)相同的功能,代碼如下。a=[];n=0;x=100whilex<999:s=str(x)ifs[0]!=s[-1]:x=x+1continue #x如果不是回文數(shù)字,回到循環(huán)開頭,x取下一個值開始循環(huán)a.append(x) #x是回文數(shù)字,將其加入列表n+=1 #累計獲得的回文數(shù)字個數(shù)x=x+1ifn==10:break #找出10個回文數(shù)字時,跳出while循環(huán)print(a) #break跳出時,跳轉(zhuǎn)到該處執(zhí)行任務(wù)5-3:捕捉處理程序中的異常【任務(wù)目標(biāo)】修改下面的程序,為程序添加異常處理代碼,在程序出錯時輸出異常信息。#test5_26.py:捕捉處理程序中的異常whileTrue:n=eval(input('請輸入一個正整數(shù):'))ifn==-1:break#輸入-1時結(jié)束程序ifn<0:continue#計算n的階乘s=1forxinrange(2,n+1):#當(dāng)n不是整數(shù)時,會發(fā)生TypeError異常s*=xprint('%s!='%n,s)【任務(wù)實施】演示過程……5.3異常處理異常指程序在運(yùn)行過程中發(fā)生的錯誤,異常會導(dǎo)致程序意外終止。異常處理可捕捉程序中發(fā)生的異常,執(zhí)行相應(yīng)的處理代碼,避免程序意外終止。程序中的語法錯誤不屬于異常。異常處理基本結(jié)構(gòu)異常處理的基本結(jié)構(gòu)如下。try:

可能引發(fā)異常的代碼except異常類型名稱:

異常處理代碼else:

沒有發(fā)生異常時執(zhí)行的代碼finally:

不管是否發(fā)生異常,都會執(zhí)行的代碼在處理異常時,將可能引發(fā)異常的代碼放在try語句塊中。在except語句中指明捕捉處理的異常類型名稱,except語句塊中為異常處理代碼。程序運(yùn)行時,如果try語句塊中的代碼發(fā)生了指定異常,則執(zhí)行except語句塊。else語句塊中為沒有發(fā)生異常時執(zhí)行的代碼,else語句塊可以省略。finally部分的代碼不管是否發(fā)生異常都會執(zhí)行,可以省略finally語句塊。示例代碼whileTrue:n=eval(input('請輸入一個正整數(shù):'))ifn==-1:break #輸入為-1時結(jié)束程序

ifn<0:continue#計算n的階乘

s=1forxinrange(2,n+1): #當(dāng)n不是整數(shù)時,會發(fā)生TypeError異常

s*=xprint('%s!='%n,s)捕捉異常whileTrue:try:n=eval(input('請輸入一個正整數(shù):'))ifn==-1:break #輸入為-1時結(jié)束程序

ifn<0:continue#計算n的階乘

s=1forxinrange(2,n+1): #當(dāng)n不是整數(shù)時,會發(fā)生TypeError異常

s*=xprint('%s!='%n,s)

exceptTypeError: #異常處理

print('輸入數(shù)據(jù)錯誤,必須是正整數(shù)!')Python內(nèi)置的常見異常類型AttributeError:訪問對象屬性出錯時引發(fā)的異常,例如訪問不存在的屬性或?qū)傩圆恢С仲x值等。EOFError:使用input()函數(shù)讀文件,遇到文件結(jié)束標(biāo)志EOF時發(fā)生的異常。文件對象的read()和readline()方法遇到EOF時返回空字符串,不會引發(fā)異常。ImportError:導(dǎo)入模塊出錯引發(fā)的異常。IndexError:使用序列對象的下標(biāo)超出范圍時引發(fā)的異常。StopIteration:迭代器沒有可執(zhí)行迭代的迭代元素引發(fā)的異常。IndentationError:使用了不正確的縮進(jìn)引發(fā)的異常。TabError:同時使用Tab鍵和空格導(dǎo)致縮進(jìn)不一致引發(fā)的異常。TypeError:在運(yùn)算或函數(shù)調(diào)用時,使用了不兼容的類型引發(fā)的異常。ZeroDivisionError:除數(shù)為0時引發(fā)的異常。5.3.1捕捉異常

1.捕捉多種異常使用多個except語句捕捉可能出現(xiàn)的多種異常如下。>>>x=[1,2]>>>try:...x[0]/0...exceptZeroDivisionError:...print('除0錯誤')...exceptIndexError:...print('索引下標(biāo)超出范圍')...else:...print('沒有錯誤')...除0錯誤2.捕捉指定異常可以在except語句中同時指定要捕捉的多種異常,以便使用相同的異常處理代碼進(jìn)行統(tǒng)一處理。在except語句中可以使用as為異常類創(chuàng)建一個實例對象>>>x=[1,2]>>>try:...x[0]/0 #此處引發(fā)除0異常...except(ZeroDivisionError,IndexError)asexp: #處理多種異常...print('出錯了:')...print('異常類型:',exp.__class__.__name__) #輸出異常類名稱...print('異常信息:',exp) #輸出異常信息...出錯了:異常類型:ZeroDivisionError異常信息:divisionbyzero3.捕捉所有異常except語句省略了異常類型,則不管發(fā)生何種類型的異常,均會執(zhí)行except語句塊中的異常處理代碼>>>try:...2/0 #引發(fā)除0異常...except:...print('出錯了') ...出錯了sys.exc_info()方法sys.exc_info()方法返回一個三元組:(type,value,traceobj)type為異常類的類型,可用__name__屬性獲得異常類的名稱。value為異常類的實例對象,直接將其輸出可獲得異常描述信息。traceobj是一個堆棧跟蹤對象(traceback類的實例對象),使用traceback模塊的print_tb()方法可獲得堆棧跟蹤信息示例代碼>>>x=[1,2,3]>>>try:...print(x[3])...except:...importsys...x=sys.exc_info()...print('異常類型:%s'%x[0].__name__)...print('異常描述:%s'%x[1])...print('堆棧跟蹤信息:')...importtraceback...traceback.print_tb(x[2])4.異常處理結(jié)構(gòu)的嵌套Python允許在異常處理結(jié)構(gòu)的內(nèi)部嵌套另一個異常處理結(jié)構(gòu)。在發(fā)生異常時,沒有被內(nèi)部捕捉處理的異常可以被外層捕捉。>>>x=[1,2]>>>try:...try:...5/0...exceptZeroDivisionError:...print('內(nèi)部除0異常')...x[2]/2 #內(nèi)部沒有捕捉的異常...exceptIndexError:...print('外層下標(biāo)越界異常')5.使用finally語句在異常處理結(jié)構(gòu)中,可以使用finally語句定義終止行為。不管try語句塊中是否發(fā)生異常,finally語句塊中的代碼都會執(zhí)。try:print(5/0) #發(fā)生除0異常except:print('出錯了!’) #發(fā)生異常后執(zhí)行該語句finally:print('finally部分已執(zhí)行!’) #不管是否發(fā)生異常,都會執(zhí)行該語句print('over') #異常處理結(jié)構(gòu)的后續(xù)代碼5.3.2raise語句raise語句基本格式如下。raise異常類名 #創(chuàng)建異常類的實例對象,并引發(fā)異常raise異常類實例對象 #引發(fā)異常類實例對象對應(yīng)的異常raise #重新引發(fā)剛發(fā)生的異常Python執(zhí)行raise語句時,會引發(fā)異常并傳遞異常類的實例對象。1.用類名引發(fā)異常在raise語句中指定異常類名時,會創(chuàng)建該類的實例對象,然后引發(fā)異常,示例代碼如下。>>>raiseIndexError #引發(fā)異常 Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError2.用異常類實例對象引發(fā)異常可以直接使用異常類實例對象來引發(fā)異常,示例代碼如下。>>>x=IndexError() #創(chuàng)建異常類的實例對象>>>raisex #引發(fā)異常Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>3.傳遞異常不帶參數(shù)的raise語句可再次引發(fā)剛發(fā)生過的異常,其作用就是

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論