Python 3 基礎教程(第3版)(慕課版) 課件 第5章 程序控制結構_第1頁
Python 3 基礎教程(第3版)(慕課版) 課件 第5章 程序控制結構_第2頁
Python 3 基礎教程(第3版)(慕課版) 課件 第5章 程序控制結構_第3頁
Python 3 基礎教程(第3版)(慕課版) 課件 第5章 程序控制結構_第4頁
Python 3 基礎教程(第3版)(慕課版) 課件 第5章 程序控制結構_第5頁
已閱讀5頁,還剩62頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Python3基礎教程第3版慕課版單元5程序控制結構任務5-1:計算個人綜合所得稅【任務目標】【任務實施】演示過程……5.1.1

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

單分支if語句單分支if語句的基本結構如下。if條件表達式:

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

語句塊1else:

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

語句塊1elif條件表達式2:

語句塊2……elif條件表達式n:

語句塊nelse:

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

循環體else:

語句塊2else部分可以省略。object是一個可迭代對象。for語句執行時,依次將object中的數據賦值給變量var——該操作稱為迭代。var每賦值一次,則執行一次循環體。循環執行結束時,如果有else部分,則執行對應的語句塊。else部分只在正常結束循環時執行。如果用break跳出循環,則不會執行else部分。在for語句中,用n表示object中數據的位置索引,for語句循環的執行流程如圖所示示例代碼如下。#用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部分在循環正常結束時執行...print('loopover')...246loopover2.使用range()函數可以使用range()函數來生成包含連續多個整數的range對象,其基本格式為:range(end)range(start,end[,step])只指定一個參數(end)時,生成整數范圍為0~end-1。指定兩個參數(start和end)時,生成整數范圍為start~end-1。整數之間的差值為step,step默認為1。示例代碼如下。>>>forxinrange(3):...print(x)...012>>>forxinrange(-2,2):...print(x)...-2-101>>>forxinrange(-2,2,2):...print(x)...-20可在for循環中用多個變量來迭代序列對象,示例代碼如下。>>>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循環Python允許嵌套使用for循環,即在for循環內部使用for循環。例如,下面的代碼輸出100以內的素數——除了1和它本身之外不能被其他數整除的數是素數。print(1,2,3,end="") #1、2、3是素數,直接輸出,end=""使后續輸出不換行forxinrange(4,100):forninrange(2,x):ifx%n==0: #若余數為0,說明x不是素數,結束當前for循環breakelse:print(x,end='') #正常結束for循環,說明x是素數,輸出else:print('over')5.2.2無限循環:while1.while語句循環的基本結構while語句基本結構如下。while條件表達式:

循環體else:

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

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

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

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

n+=1 #累計獲得的回文數字個數

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

可能引發異常的代碼except異常類型名稱:

異常處理代碼else:

沒有發生異常時執行的代碼finally:

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

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

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

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

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

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

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

exceptTypeError: #異常處理

print('輸入數據錯誤,必須是正整數!')Python內置的常見異常類型AttributeError:訪問對象屬性出錯時引發的異常,例如訪問不存在的屬性或屬性不支持賦值等。EOFError:使用input()函數讀文件,遇到文件結束標志EOF時發生的異常。文件對象的read()和readline()方法遇到EOF時返回空字符串,不會引發異常。ImportError:導入模塊出錯引發的異常。IndexError:使用序列對象的下標超出范圍時引發的異常。StopIteration:迭代器沒有可執行迭代的迭代元素引發的異常。IndentationError:使用了不正確的縮進引發的異常。TabError:同時使用Tab鍵和空格導致縮進不一致引發的異常。TypeError:在運算或函數調用時,使用了不兼容的類型引發的異常。ZeroDivisionError:除數為0時引發的異常。5.3.1捕捉異常

1.捕捉多種異常使用多個except語句捕捉可能出現的多種異常如下。>>>x=[1,2]>>>try:...x[0]/0...exceptZeroDivisionError:...print('除0錯誤')...exceptIndexError:...print('索引下標超出范圍')...else:...print('沒有錯誤')...除0錯誤2.捕捉指定異常可以在except語句中同時指定要捕捉的多種異常,以便使用相同的異常處理代碼進行統一處理。在except語句中可以使用as為異常類創建一個實例對象>>>x=[1,2]>>>try:...x[0]/0 #此處引發除0異常...except(ZeroDivisionError,IndexError)asexp: #處理多種異常...print('出錯了:')...print('異常類型:',exp.__class__.__name__) #輸出異常類名稱...print('異常信息:',exp) #輸出異常信息...出錯了:異常類型:ZeroDivisionError異常信息:divisionbyzero3.捕捉所有異常except語句省略了異常類型,則不管發生何種類型的異常,均會執行except語句塊中的異常處理代碼>>>try:...2/0 #引發除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.異常處理結構的嵌套Python允許在異常處理結構的內部嵌套另一個異常處理結構。在發生異常時,沒有被內部捕捉處理的異常可以被外層捕捉。>>>x=[1,2]>>>try:...try:...5/0...exceptZeroDivisionError:...print('內部除0異常')...x[2]/2 #內部沒有捕捉的異常...exceptIndexError:...print('外層下標越界異常')5.使用finally語句在異常處理結構中,可以使用finally語句定義終止行為。不管try語句塊中是否發生異常,finally語句塊中的代碼都會執。try:print(5/0) #發生除0異常except:print('出錯了!’) #發生異常后執行該語句finally:print('finally部分已執行!’) #不管是否發生異常,都會執行該語句print('over') #異常處理結構的后續代碼5.3.2raise語句raise語句基本格式如下。raise異常類名 #創建異常類的實例對象,并引發異常raise異常類實例對象 #引發異常類實例對象對應的異常raise #重新引發剛發生的異常Python執行raise語句時,會引發異常并傳遞異常類的實例對象。1.用類名引發異常在raise語句中指定異常類名時,會創建該類的實例對象,然后引發異常,示例代碼如下。>>>raiseIndexError #引發異常 Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError2.用異常類實例對象引發異常可以直接使用異常類實例對象來引發異常,示例代碼如下。>>>x=IndexError() #創建異常類的實例對象>>>raisex #引發異常Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>3.傳遞異常不帶參數的raise語句可再次引發剛發生過的異常,其作用就是

溫馨提示

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

評論

0/150

提交評論