Python語言基礎與應用 課件 劉瓊 第4-7章 程序的控制結構-文件和數據格式化_第1頁
Python語言基礎與應用 課件 劉瓊 第4-7章 程序的控制結構-文件和數據格式化_第2頁
Python語言基礎與應用 課件 劉瓊 第4-7章 程序的控制結構-文件和數據格式化_第3頁
Python語言基礎與應用 課件 劉瓊 第4-7章 程序的控制結構-文件和數據格式化_第4頁
Python語言基礎與應用 課件 劉瓊 第4-7章 程序的控制結構-文件和數據格式化_第5頁
已閱讀5頁,還剩234頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

4.1程序流程圖

4.2順序結構

4.3條件表達式

4.4選擇結構

4.5循環(huán)結構

4.6程序的異常處理

4.7random庫

4.8精選案例第4章程序的控制結構考綱考點

程序的三種控制結構

程序的分支結構:

單分支結構、二分支結構、多分支結構

程序的循環(huán)結構:

遍歷循環(huán)、無限循環(huán)、break和continue循環(huán)控制

程序的異常處理:try-except

random庫知識導圖4.1程序流程圖

程序由三種基本結構構成:順序結構、選擇結構、循環(huán)結構。結構化的程序設計往往會使用流程圖進行描述。程序流程圖是用一系列圖形、流程線和文字說明描述程序的基本操作和控制流程。流程圖的基本元素下圖所示:??起止框是一個圓角矩形,表示程序的開始或結束,每個程序只能有一個開始和一個結束;判斷框是一個菱形框,用于判斷框內條件是否成立,允許有一個入口,2個或2個以上出口,根據判斷的結果選擇不同的執(zhí)行路徑;處理框是一個矩形框,表示確定的處理和步驟,一個流程圖中可有多個處理框;輸入輸出框是一個平行四邊形,表示數據的輸入或經過處理后結果的輸出,輸入可有0個或多個,輸出至少有1個;注釋框是用來增加對程序的說明解釋或標注的;流向線是帶箭頭的直線或者曲線,用于指示程序的執(zhí)行路徑;連接點是一個圓形,可以將多個流程圖連接起來,常用于多個流程圖的拼接。4.2順序結構??順序結構是結構化程序設計中最基本最直接的一種結構,程序會依照其書寫順序從前到后依次執(zhí)行語句。順序結構的流程圖如下圖所示,先按順序執(zhí)行完語句塊1,然后再按順序執(zhí)行語句塊2。其中,語句塊1和語句塊2可以表示一個或一組順序執(zhí)行的語句。??常見的順序結構中通常會包含有賦值語句和輸入、輸出語句等。如第二章所提到的賦值號構成賦值語句;input()和eval()函數構成的輸入語句;還有用print()函數構成的輸出語句。順序結構是其他更復雜結構(如選擇結構和循環(huán)結構)的基礎。4.3條件表達式??python中的關系運算符如下表所示:4.3.1關系運算符操作符<

<=>

>===!=說明小于小于等于大于大于等于等于不等于??在python中使用關系運算符的一個重要前提是,操作數之間必須可比較大小。Python中字符串大小的比較是基于字符的Unicode編碼值,示例代碼如下:>>>7>8#比較數值大小False>>>"china"<"China"#比較字符串大小False>>>[5,6,7]<[5,6,8]#比較列表的大小True>>>{5,6,7}<{5,6,7,8}#集合的比較主要是測試包含關系True>>>"567">45#字符串和數字無可比性Traceback(mostrecentcalllast):File"<pyshell#10>",line1,in<module>"567">45TypeError:unorderabletypes:str()>int()??

python中的關系運算符可以連用,且其含義與日常含義一致。示例代碼如下:>>>2<3<4#等價于2<3且3<4True>>>3<5>2#等價于5>2且3<5True??關系表達式有惰性求值的特點,惰性求值是一種在需要時才計算值的策略,這種策略在處理大量數據時可以大大提高效率。示例代碼如下:>>>abc#abc沒有賦值Traceback(mostrecentcalllast):File"<pyshell#13>",line1,in<module>abcNameError:name'abc'isnotdefined>>>1>2>abc#惰性求值,只計算1>2就可得出結果,所以沒必要計算2>abcFalse??邏輯運算符not、and和or可以對條件進行邏輯組合或運算,構成更加復雜的條件表達式。其功能說明下表4.3.2邏輯運算符運算符說明舉例not邏輯非,對操作數的邏輯狀態(tài)取反。如果操作數為True,則結果為False;如果操作數為False,則結果為True。notTrue結果為Falseand邏輯與,當兩側的操作數都為True時,結果為True;否則為False。TrueandFalse結果為Falseor邏輯或,當兩側的操作數中至少有一個為True時,結果為True;否則為False。TrueorFalse結果為True??邏輯運算的一般的例子,示例代碼如下:>>>x=80>>>x<100andx>10True>>>x>100orx<10False>>>notx>100True??and和or的惰性求值,示例代碼如下:>>>12<3anda>10#此時a沒被定義,但關系表達式卻可以得到結果False>>>12<3ora>10#12<3為False,需要計算a>10,但a沒被定義,出錯Traceback(mostrecentcalllast):File"<pyshell#21>",line1,in<module>12<3ora>10NameError:name'a'isnotdefined??在python中邏輯運算符兩側操作數還可以是數值表達式。對and和or而言,其最終運算后的結果是最后一個被計算的表達式的值。對not而言,其結果依然是True或False,True對應非零值,False對應零。示例代碼如右:>>>x=5>>>7andx+1#7非0為True,需要計算x+1才能確定值,結果為66>>>7orx+1#7非0為True,不需要計算x+1,結果為77>>>0and7#0為False,不需要計算后面的7,結果為00>>>0or7#0為False,需要計算后面的7,結果為77>>>not5#5非0為True,notTrue,結果為FalseFalse>>>not0#0為False,notFalse,結果為TrueTrue??用于測試一個對象是否為另一個對象的元素。示例代碼如下:4.3.3成員測試運算符in>>>3in[4,3,7]#測試3是否在列表[4,3,7]中True>>>5inrange(1,10,1)#range()函數用來生成指定范圍數字True>>>'abc'in'abcdefg'#子字符串測試True>>>foriin(3,5,7):#循環(huán),成員遍歷

print(i,end='\t')3 5 7 ??Python中位運算符只能用于整數,直接操作整數的二進制位。在執(zhí)行位運算時應當首先將整數轉換為二進制數,然后再使用位運算操作。4.3.3位運算符1.&(按位與):對兩個整數的每一位執(zhí)行與操作,如果兩個相應的二進制位都為1,則結果為1,否則為0。這通常用于屏蔽掉某些位或檢查特定位的狀態(tài)。2.|(按位或):對兩個整數的每一位執(zhí)行或操作,如果兩個相應的二進制位至少有一個為1,則結果為1,否則為0。這常用于設置特定位的狀態(tài),而不改變其他位。3.^(按位異或):對兩個整數的每一位執(zhí)行異或操作,如果兩個相應的二進制位有一個為1且另一個為0,則結果為1,否則為0。異或運算常用于加密、錯誤檢測和數據交換等場景。??4.~(按位取反):對一個整數的每一位執(zhí)行非操作,將1變?yōu)?,0變?yōu)?。這是一個單目運算符,通常用于生成補碼或翻轉所有位的狀態(tài)5.<<(左移):左移將整數的所有位向左移動指定的位數,符號位保持不變,低位用0填充,相當于乘以2的指定次方6.>>(右移):右移將整數的所有位向右移動指定的位數,對于Python中的有符號整數,高位通常保持符號位不變(算術右移),低位丟棄,相當于除以2的指定次方(向下取整)。??示例代碼如下:>>>5<<2#把二進制數101左移2位,則為二進制數1010020>>>5>>2#把二進制數101右移2位取整,則為二進制數11>>>3&7#位與運算3>>>3|8#位或運算11>>>3^5#位異或運算6>>>~5#把二進制數00000101按位取反,則為二進制數11111010-6??用來測試兩個對象是否同一個,如果是則返回True,否則返回False;如果是同一個,兩者具有相同的內存地址。示例代碼如下:4.3.5同一性測試運算符is>>>x=[300,300,300]>>>x[0]isx[1]#同一個值在內存中只有一份True>>>x=[1,2,3]>>>y=[1,2,3]>>>xisy#x和y不是同一個列表對象False>>>x[0]isy[0]True>>>x=y>>>xisy#x和y指向同一個列表對象True??運算符優(yōu)先級順序由高到低總結,如表所示4.3.6運算優(yōu)先級運算符說明(優(yōu)先級由高到低)**指數(最高優(yōu)先級)~按位翻轉*/%//乘、除、取模、整除+-加、減>><<右移、左移&位與^|位異或、位或<=<>>=比較運算==!=等于

不等于=%=/=//=-=+=*=**=賦值類操作符isisnot同一性運算符innotin成員運算符notorand邏輯運算符??實際使用中可記住以下簡單規(guī)則:1.乘除優(yōu)先加減2.位運算和算術運算>比較運算>賦值運算條件表達式有一些特殊用法,Python語言中條件表達式的值只要不是False、0(或0.0,0j等)、空值None、空列表、空元組、空集合、空字典、空字符串、空range()對象或其他空迭代對象,均被認為True.也就是所有合法的Python表達式都可以作為條件表達式,包括含有函數調用的表達式。4.4選擇結構??在實際的編程過程中,常常需要解決這樣一類問題,要求根據某些條件的邏輯結果來決定要執(zhí)行的程序語句。這種根據條件判斷選擇不同執(zhí)行語句的運行方式就是選擇結構,也稱為分支結構。在PYTHON中實現分支結構的語句是if語句,而根據分支結構所實現的分支數的不同,可分為單分支結構、雙分支結構和多分支結構。??單分支選擇結構其語法格式如下所示。其中表達式后面的冒號“:”是不可或缺的,它表示一個語句塊的開始,縮進表達<語句塊>與if的包含關系,一般是四個空格為縮進單位。4.4.1單分支選擇結構if<條件表達式>:<語句塊>執(zhí)行過程:當if后面表達式值為True或者為與True等價的值時,則執(zhí)行語句塊中的語句序列,然后程序接著執(zhí)行if語句結束后的下一條語句。當結果為False或者為與False等價的值時,則語句塊中的語句會被跳過去,直接執(zhí)行if語句結束后的下一條語句.其流程圖如右所示:??例4-1判斷輸入的字符串是否為回文字符串?;匚淖址侵刚蜃x和反向讀都一樣的字符串,例如,12321、madam、level等。以下用單分支結構實現,代碼如下:#判斷輸入的字符串是否為回文字符串str=input("請輸入一個字符串或數值:")ifstr==str[::-1]:print("這是一個回文字符串.")問題:在實際執(zhí)行中,以上程序當條件為假時,沒有給用戶任何信息?如何解決???Python中的雙分支結構if-else語句是Python中最基本的控制流語句之一,二分支結構的特點是它根據條件的結果來執(zhí)行不同的代碼塊。語法格式如下:4.4.2雙分支選擇結構if<條件表達式>:<語句塊1>else:<語句塊2>執(zhí)行過程:當if后面表達式值為True或者為與True等價的值時,則執(zhí)行語句塊1中的語句序列;當結果為False或者為與False等價的值時,則執(zhí)行語句塊2中的語句序列。簡單說,二分支結構根據條件的True或False結果產生兩條路徑。其流程圖如右所示。??例4-2用雙分支結構完成判斷輸入的字符串是否為回文字符串,會使程序更完整。代碼如下:#判斷輸入的字符串是否為回文字符串str=input("請輸入一個字符串或數值:")ifstr==str[::-1]:print("這是一個回文字符串.")else:print("這不是一個回文字符串.")其運行結果如下:請輸入一個字符串或數值:12321這是一個回文字符串.請輸入一個字符串或數值:12345這不是一個回文字符串.??雙分支結構還有一種更簡潔的表達方式,是用一個三元運算符構成,其表達式中還可能嵌套三元運算符,實現與分支結構相似的效果。其語法格式如下:<表達式1>if<條件>else<表達式2>當條件中的值為True或者為與True等價的值時,則整個三元表達式的值為表達式1的值,否則為表達式2的值。示例代碼如下:>>>x=5>>>print("yes")ifx>2elseprint("no")yes>>>print("yes"ifx>2else"no")#與上一條代碼含義是不同的yes>>>y=7ifx>10else8#觀察一下賦值的優(yōu)先級>>>y8說明:此結構是一種表達式,不是語句??if-elif-else描述python的多分支選擇結構,語句格式如下:4.4.3多分支選擇結構if<條件表達式1>:<語句塊1>elif<條件表達式2>:<語句塊2>…elif<條件表達式n>:<語句塊n>else:<語句塊n+1>??執(zhí)行過程:當if后面條件表達式1值為True或者為與True等價的值時,則執(zhí)行語句塊1中的語句序列;否則計算條件表達式2的值,若其值為True,則執(zhí)行語句塊2中的語句序列;依次類推,若所有條件表達式的值都為False,則執(zhí)行else后面的語句塊n+1。其流程圖如下圖所示:??例4-3根據月份判斷所在季節(jié)。程序分析:首先需要明確季節(jié)的劃分標準。一般來說,北半球的季節(jié)劃分如下:春季:3月、4月、5月夏季:6月、7月、8月秋季:9月、10月、11月冬季:12月、1月、2月另外,我們還需要做一個用戶輸入的月份是否合法的驗證,即如果輸入了1-12之外的數據,則數據輸入是不合法的。由以上分析可知,我們需要一個5分支結構語句。??代碼如下:month=int(input("請輸入月份(1-12):"))ifmonth<1ormonth>12:print("月份輸入不合法")elif3<=month<=5:print("春季")elif6<=month<=8:print("夏季")elif9<=month<=11:print("秋季")else:print("冬季")??例4-4設計一個問答式計算器。程序分析:程序功能是接收用戶輸入的兩個數字(num1和num2)和一個運算符(+、-、*、/之一,并將其存儲到字符串變量operator中),然后根據運算符執(zhí)行相應的數學運算,并輸出結果。程序的核心在于其分支結構,根據運算符的不同,設計不同的分支。在處理除法運算時,需要關注除數是否為0,當除數為0時會導致運算錯誤或程序崩潰。因此在除的分支中使用了一個嵌套的if-else結構,使用exit()函數來在出現錯誤時立即終止程序,以免程序非正常中止。另外,程序設計還需要考慮如果輸入的運算符不是+、-、*、/中的任何一個,則打印一條錯誤消息并退出程序,表示不支持該運算符。??代碼如下:num1=float(input("請輸入第一個數字:"))num2=float(input("請輸入第二個數字:"))operator=input("請輸入運算符(+、-、*、/):")ifoperator=="+":result=num1+num2elifoperator=="-":result=num1-num2elifoperator=="*":result=num1*num2elifoperator=="/":ifnum2!=0:result=num1/num2else:print("除數不能為0")exit()else:print("不支持的運算符")exit()說明:exit()是Python中的一個內置函數,用于立即終止當前進程的執(zhí)行。當exit()被調用時,Python解釋器會停止執(zhí)行當前的程序,并退出4.5循環(huán)結構??循環(huán)結構是用來重復執(zhí)行一段代碼的機制,Python提供了兩種主要的循環(huán)結構:遍歷循環(huán)和無限循環(huán)。遍歷循環(huán)使用保留字for依次提取遍歷結構各元素進行處理,一般用于循環(huán)次數可以提前確定的情況,特別適用于枚舉、遍歷序列或迭代對象中元素的場合。無限循環(huán)使用保留字while根據判斷條件執(zhí)行程序,一般用于循環(huán)次數難以提前確定的情況下,當然循環(huán)次數可以確定的情況下也可以用。??循環(huán)結構的流程圖如下圖所示:??循環(huán)是先從遍歷結構中提取元素,放在循環(huán)變量中,然后執(zhí)行語句塊內容,反復執(zhí)行以上操作,直到遍歷結構中元素全部取完了為止,for語句的循環(huán)執(zhí)行次數是根據遍歷結構中元素個數確定的。4.5.1for循環(huán)??語句格式如下:for循環(huán)的通常結構for<循環(huán)變量>in<遍歷結構>:<語句塊>說明:

遍歷結構可以是字符串、文件、range()函數或組合數據類型等。??(1)遍歷結構為字符串。示例代碼如下:>>>foriin"China": print(i)其運行結果為 China??(2)遍歷結構為range()函數,range()函數格式如下:

range(start,stop[,step])說明:start:序列的起始值,默認為0(可選參數)。stop:序列的結束值,但不包括該值(必選參數)。step:序列中每個數字之間的差,即步長,默認為1(可選參數)。當只有一個參數時,range(stop)將生成從0到stop-1的整數序列。如果有兩個參數,range(start,stop)將生成從start到stop-1的整數序列。如果有三個參數,range(start,stop,step)將生成從start開始,以step為步長,直到但不包括stop的整數序列。??例4-5計算1-100的累加和。程序分析:要計算從1到100的累加和。加法是從1加到100,加法操作是一個反復執(zhí)行的過程,而反復執(zhí)行就是循環(huán)。為了實現這個目標,使用for循環(huán)和range()函數。首先,初始化一個變量s為0,用于存儲累加和。然后,使用for循環(huán)來遍歷從1到100的整數序列。可以使用range()函數來生成這個整數序列。range(1,101)表示生成一個從1開始(包括1),到101結束(不包括101)的整數序列。因此,這個序列包含了從1到100的整數。在每次循環(huán)中,將循環(huán)變量i的值加到s上,實現累加的效果。循環(huán)結束后,s的值就是從1到100的累加和。最后,使用print()函數來輸出計算結果。??代碼如下:s=0foriinrange(1,101):s=s+iprint("從1加到100的和為{}".format(s))??(3)遍歷結構為列表例4-6連接列表words=['我','喜歡','Python']中的字符串。程序分析:輸入題目已經給出,即為words=['我','喜歡','Python'],要求輸出列表中所有字符串連接成的單一字符串。字符串連接可使用“+”進行,因為是反復操作,所以使用for循環(huán)來遍歷列表中的每個元素,在循環(huán)體內,使用字符串連接操作“+”將當前字符串添加到結果字符串中。??代碼如下:

words=['我','喜歡','Python']sentence=''forwordinwords:sentence+=wordprint("連接后的字符串:",sentence)??語句格式如下:for循環(huán)的擴展結構for<循環(huán)變量>in<遍歷結構>:<語句塊1>else:<語句塊2>執(zhí)行過程:當for循環(huán)正常執(zhí)行之后,程序才會繼續(xù)執(zhí)行else語句中內容,即else語句只在循環(huán)正常執(zhí)行之后才執(zhí)行。由于循環(huán)的非正常結束,往往是因為執(zhí)行了break語句而造成的,在遍歷循環(huán)的擴展模式中,這種情況是不會執(zhí)行else中的語句的,所以,我們常常使用這種結構跟蹤循環(huán)是否已經通過break跳出了循環(huán)。??例4-7找水果。代碼如下:fruits=["apple","banana","cherry"]x=input("Pleaseenterafruitword:")forfruitinfruits:iffruit==x:print("Found"+x+"!")breakelse:print("Didnotfind"+x+".")第一次運行結果如下:Pleaseenterafruitword:peachDidnotfindpeach.在這次運行中,我們要找水果peach,但是peach不在水果列表中,因此if語句條件不滿足,break不會執(zhí)行,循環(huán)正常結束,則執(zhí)行else后面的print()語句第二次運行結果如下:Pleaseenterafruitword:cherryFoundcherry!在本次運行中,我們要找的水果cherry在列表中,因此if語句條件滿足,則執(zhí)行了break,循環(huán)中斷,則else不被執(zhí)行。??while是python中保留的可以用來實現條件循環(huán)的語句.首先對條件進行判斷,如果滿足條件則執(zhí)行語句塊,反復執(zhí)行以上操作,直到條件不滿足,從循環(huán)中退出,執(zhí)行與while同級別縮進的后續(xù)語句。4.5.2while循環(huán)??語句格式如下:while循環(huán)的通常結構while<條件>:<語句塊>說明:while語句是先判斷條件再確定是否循環(huán),所以其最少執(zhí)行次數可以是0次;在語句塊中,應當有使循環(huán)能夠中止的語句或者令循環(huán)條件能夠不滿足的語句,否則會造成死循環(huán),也就是無限循環(huán)。??例4-8計算n!。代碼如下:n=int(input("請輸入一個正整數n:"))factorial=1i=1whilei<=n:factorial*=ii+=1print(n,"的階乘為:",factorial)??語句格式如下:while循環(huán)的擴展結構while<條件>:<語句塊1>else:<語句塊2>執(zhí)行過程:當while循環(huán)正常執(zhí)行之后,程序會繼續(xù)執(zhí)行else語句中內容??理解循環(huán)需求:在開始編寫循環(huán)代碼之前,首先要清楚地理解問題的需求,確定循環(huán)的次數、循環(huán)的條件以及每次循環(huán)中需要執(zhí)行的操作。選擇合適的循環(huán)結構:根據問題的特點,選擇合適的循環(huán)結構,如for循環(huán)(適用于已知循環(huán)次數的情況)或while循環(huán)(適用于循環(huán)次數不確定,但循環(huán)條件明確的情況)。初始化循環(huán)變量:循環(huán)開始前,需要初始化循環(huán)變量,這些變量通常用于控制循環(huán)的次數或作為循環(huán)條件的判斷依據。循環(huán)結構編程思路總結??設置循環(huán)條件:循環(huán)條件是決定循環(huán)是否繼續(xù)執(zhí)行的關鍵因素。條件設置不當可能導致循環(huán)無法終止(無限循環(huán))或提前終止(未達到預期效果)。更新循環(huán)變量:在每次循環(huán)迭代結束后,需要更新循環(huán)變量的值,以確保循環(huán)能夠正確進行下一次迭代或最終終止。??注意循環(huán)體內的操作:循環(huán)體內的操作應該清晰、簡潔且高效。避免在循環(huán)體內進行不必要的計算或執(zhí)行與循環(huán)目的無關的操作??紤]循環(huán)的退出條件:在設計循環(huán)時,應始終考慮循環(huán)的退出條件,確保循環(huán)能夠在滿足條件時正確退出,避免程序陷入死循環(huán)。??break和continue是循環(huán)結構中兩個輔助循環(huán)控制的保留字。它們允許在循環(huán)過程中根據特定條件來中斷或跳過循環(huán),從而更靈活地控制循環(huán)的執(zhí)行流程。4.5.3break和continue??用于提前終止當前循環(huán),并立即退出該循環(huán)結構。當遇到break時,程序將跳出包含它的最內層循環(huán),并繼續(xù)執(zhí)行緊跟在該循環(huán)之后的語句。如果有二層或多層循環(huán),則break退出最內層循環(huán)。break語句foriinrange(1,11):ifi==5:print("遇到5,使用break中斷循環(huán)")breakprint(i)其運行結果為:1234遇到5,使用break中斷循環(huán)??用來結束當前當次循環(huán),即提前結束本輪循環(huán),接著執(zhí)行下一輪循環(huán)。將上面的代碼中的break語句用continue語句代替,示例代碼如下:continue語句foriinrange(1,11):ifi==5:print("遇到5,使用continue中斷循環(huán)")continueprint(i)其運行結果為:1234遇到5,使用continue中斷循環(huán)6789104.6程序的異常處理??異常是在程序執(zhí)行過程中發(fā)生的運行錯誤,例如,訪問不存在的變量或索引超出范圍等。異常會導致序的突然中止和崩潰,譬如我們常遇到的死機,也是程序異常的一種。如果我們能夠預測并處理這些異常,能夠做到即使出現異常,程序也能穩(wěn)定順利的繼續(xù)執(zhí)行下去,就大大提高了程序的健壯性和可靠性??Python提供了一個強大的異常處理機制,允許我們捕獲和處理異常,以確保程序的穩(wěn)定性和可靠性。異常處理的基本結構是使用try和except語句塊,基本的語法格式如下:try:<語句塊1>except:<語句塊2>執(zhí)行過程:語句塊1是正常執(zhí)行的程序內容,當執(zhí)行這個語句塊發(fā)生異常時,則執(zhí)行except保留字后面的語句塊2,以保證程序像洪水一樣,一條分支堵塞了,但還是可以從另一條分支正常退出。??例4-9:編寫一個程序,用戶連續(xù)輸入數字進行除法運算,直到用戶決定停止。如果用戶輸入0作為除數,程序應該捕獲這個異常,并打印出"除數不能為零!"的提示信息。如果用戶輸入的不是數字,程序也應該捕獲這個異常,并打印出"請輸入有效的數字!"的提示信息。當用戶輸入"q"或者"quit"時,程序應該退出循環(huán)并結束。??程序分析:

這個題目有非常明確的需求描述,因此就不再做進一步的需求分析,我們可以從數據處理入手。輸入:用戶的輸入,可能是一個數字、也可能是非數字字符,或者"q"或"quit"。處理:進行除法運算、異常處理、輸入驗證和循環(huán)控制。輸出:除法結果或錯誤提示信息。算法選擇方面,由于循環(huán)次數是由用戶輸入決定的,使用whileTrue循環(huán)來允許用戶連續(xù)進行除法運算。在循環(huán)內使用try-except結構來捕獲可能出現的異常,如零除錯誤或輸入不是數字的情況。當用戶輸入"q"或"quit"時,使用break語句來退出循環(huán)。??whileTrue:try:num1=input("請輸入第一個數字(或輸入'q'或'quit'退出):")ifnum1.lower()in['q','quit']:print("程序已退出。")breaknum2=float(input("請輸入第二個數字:"))result=float(num1)/num2print("結果為:",result)exceptZeroDivisionError:print("除數不能為零!")exceptValueError:print("請輸入有效的數字!")4.7random庫在日常生活中,隨機數生成的需求是非常常見的。Python的random庫為我們提供了多種生成隨機數的方法。對于初學者來說,掌握這個庫是非常有必要的。random庫是Python的標準庫之一,用于生成偽隨機數。為什么說是偽隨機數呢?因為計算機生成的數實際上是可預測的,只不過看起來像是隨機的。??函數函數格式描述randomrandom.random()生成一個[0.0,1.0)之間的隨機浮點數。randintrandom.randint(a,b)生成一個[a,b]之間的隨機整數。choicerandom.choice(sequence)從給定的序列中隨機選擇一個元素。shufflerandom.shuffle(sequence)將序列的元素隨機排列,原地修改序列。randrangerandom.randrange(start,stop[,step])返回一個在range(start,stop,step)內的隨機整數。samplerandom.sample(population,k)返回從序列或集合中選擇的k個不重復的元素組成的列表。用于隨機抽樣。uniformrandom.uniform(a,b)返回一個在[a,b]范圍內的隨機浮點數。seedrandom.seed([x])改變隨機數生成器的種子。可用于實驗的可重復性。getrandbitsrandom.getrandbits(k)生成一個k比特長的隨機整數。random庫的常用函數??random()函數生成的隨機數具有均勻分布的特性,也就是說,在[0.0,1.0)這個區(qū)間內的任何一個子區(qū)間內,隨機數出現的概率都是相等的。示例代碼如下:>>>importrandom>>>random.random()0.0477604166455704>>>random.random()0.5385641354279169>>>random.random()0.7650205055372885??

randint()函數在需要隨機選擇一定范圍內的整數時非常有用,示例代碼如下:>>>random.randint(1,3)2>>>random.randint(1,3)3>>>random.randint(1,3)3>>>random.randint(1,3)1說明:產生1,2,3中包括1和3的隨機數,隨機數的意思是當輸入“random.randint(1,3)”按下回車鍵后,是無法預測會出現什么結果,只能預估結果是1,2,3中的任意一個數。??choice(sequence)函數中,sequence參數是一個序列類型的數據。示例代碼如下:>>>fruits=['蘋果','香蕉','橙子','葡萄','西瓜']>>>random.choice(fruits)'西瓜'>>>random.choice(fruits)'香蕉'>>>random.choice(fruits)'西瓜'說明:choice(fruits)從列表fruits中隨機選擇一個元素輸出。這個函數非常適合用于需要隨機選擇元素的場景,比如抽獎、隨機推薦等??shuffle(sequence)函數,也就是洗牌。示例代碼如下:>>>fruits=['蘋果','香蕉','橙子','葡萄','西瓜']>>>random.shuffle(fruits)>>>fruits['蘋果','橙子','葡萄','香蕉','西瓜']>>>random.shuffle(fruits)>>>fruits['橙子','蘋果','葡萄','西瓜','香蕉']說明:這種隨機排序非常像我們平時玩牌時的洗牌操作。shuffle()函數會直接修改傳入的序列,而不是返回一個新的序列,所以在該函數調用之后,傳入的序列本身的元素順序會被改變。??

randrange(start,stop[,step])函數的參數與Python內置的range()函數非常相似,包括一個起始值(start)、一個結束值(stop)以及一個可選的步長(step)。函數會返回在[start,stop)范圍內的一個隨機整數,也就是說,start是包括在內的,但是stop是不包括的。如果指定了步長參數,那么返回的隨機數減去起始值后,將是步長的整數倍,并且在指定的范圍內。??示例代碼如下:>>>random.randrange(1,8,3)4>>>random.randrange(1,8,3)1>>>random.randrange(1,8,3)7>>>random.randrange(1,8,3)4說明:從1到8步長為3的整數有1,4,7,所以random.randrange(1,8,3)其實就是產生1,4,7中的任意一個數。與random.randint()函數相比,random.randrange()函數更加靈活,因為它允許指定步長。這使得我們可以更加方便地生成一些具有特定規(guī)律的隨機數序列。例如,我們可以使用random.randrange(0,10,2)來生成0到9之間的隨機偶數。??sample(population,k)的參數有兩個:總體(population)和樣本大小(k)??傮w可以是一個序列(如列表、元組、字符串等),也可以是一個集合或字典。樣本大小k是一個正整數,表示要從總體中選擇的元素個數。函數會返回一個包含k個元素的列表,這些元素是從總體中隨機選擇的,而且不會重復。如果總體的元素個數小于k,那么函數會拋出一個ValueError異常。??示例代碼如下:>>>fruits=['蘋果','香蕉','橙子','葡萄','西瓜']>>>random.sample(fruits,4)['橙子','西瓜','蘋果','香蕉']>>>random.sample(fruits,4)['葡萄','蘋果','香蕉','西瓜']>>>random.sample(fruits,4)['葡萄','香蕉','蘋果','橙子']說明:sample()函數在需要從總體中隨機選擇一部分不重復元素時非常有用。比如,在機器學習中,我們經常需要從數據集中隨機選擇一部分樣本進行訓練或測試,這時就可以使用random.sample()函數來實現。??uniform(a,b)函數的參數a和b分別表示隨機浮點數的下限和上限,函數會返回[a,b)范圍內的一個隨機浮點數,也就是說,下限a是包括在內的,但是上限b是不包括的。>>>random.uniform(2,8)2.9651717456012774>>>random.uniform(2,8)7.305198549349988>>>random.uniform(2,8)3.5016755851835706說明:uniform()函數在需要生成指定范圍內的隨機浮點數時非常有用。比如,在模擬程序、游戲、數值計算等領域中,我們經常需要生成一些具有特定分布的隨機數,這時就可以使用uniform()函數來實現。??seed([x])函數,參數x被稱為隨機數的種子,如果每次生成隨機數之前都設定相同的種子,那么每次生成的隨機數序列也將是相同的,這樣就可以保證在相同條件下,隨機數生成的結果是可復現的。如果不設置種子值(即直接調用random.seed()),那么系統會默認使用當前的系統時間作為種子。seed()函數只是設置了隨機數生成器的種子,并不會直接生成隨機數。如果需要生成隨機數,還需要調用其他隨機數生成函數,比如random()、randint()、choice()等。??示例代碼如下:>>>from?random?import?*>>>seed(10)>>>random()0.5714025946899135>>>random()0.4288890546751146>>>seed(10)???#再次設置相同的種子,則后續(xù)產生的隨機數相同>>>random()0.5714025946899135>>>random()0.4288890546751146說明:seed()函數是一個非常有用的函數,可以幫助我們控制Python程序中生成的隨機數序列,從而提高程序的重復性和可預測性。??

getrandbits(k)函數返回一個介于0和2k(包含0,但不包含2k)之間的隨機整數,每個值都以相等的概率產生。>>>random.getrandbits(3)3>>>random.getrandbits(3)2>>>random.getrandbits(3)1>>>random.getrandbits(3)6>>>random.getrandbits(3)7說明:getrandbits(3)可能返回0、1、2、3、4、5、6或7,每個數字的概率都是1/8。這個函數在需要生成指定長度的隨機二進制數字(或者說比特串)時非常有用。4.8精選案例??例4-10猜拳游戲設計。在這個經典的游戲中,玩家需要與電腦隨機生成的選擇進行比賽。玩家可以選擇“石頭”、“剪刀”或“布”,然后與電腦的選擇進行比較,根據規(guī)則判斷勝負。程序分析:首先生成電腦的選擇:使用random庫生成“石頭”、“剪刀”、“布”三者中的一個。接下來獲取用戶的輸入,用戶需要輸入“石頭”、“剪刀”、“布”中的一個。然后比較和判斷勝負:根據游戲規(guī)則,“石頭”贏“剪刀”、“剪刀”贏“布”、“布”贏“石頭”。通過比較用戶和電腦的選擇,判斷勝負。??完整程序如下所示:importrandom#獲取玩家輸入player_choice=input("請輸入你的選擇(石頭/剪刀/布):")#生成電腦的選擇computer_choice=random.choice(["石頭","剪刀","布"])print("玩家選擇了:",player_choice)print("電腦選擇了:",computer_choice)#判斷勝負ifplayer_choice==computer_choice:print("平局!")elif(player_choice=="石頭"andcomputer_choice=="剪刀")or\(player_choice=="剪刀"andcomputer_choice=="布")or\(player_choice=="布"andcomputer_choice=="石頭"):print("恭喜你,你贏了!")else:print("很遺憾,你輸了!")??在這個代碼中,我們直接使用了random.choice函數來隨機生成電腦的選擇。但是,在實際操作中,往往會出現用戶輸入出現失誤的情況,此時,程序就會直接崩潰,為了解決這個問題,我們可以在程序中加入異常處理部分,提高程序的健壯性。??完整程序如下:importrandomwhileTrue:try:#獲取玩家選擇

player_choice=input("請輸入你的選擇(石頭/剪刀/布):")#如果玩家輸入不在選項內,則提示用戶并跳過此次循環(huán)

ifplayer_choicenotin["石頭","剪刀","布"]:print("無效的輸入,請重新輸入!")continue#生成電腦的選擇

computer_choice=random.choice(["石頭","剪刀","布"])print("玩家選擇了:",player_choice)print("電腦選擇了:",computer_choice)#判斷勝負

ifplayer_choice==computer_choice:print("平局!")elif(player_choice=="石頭"andcomputer_choice=="剪刀")or\(player_choice=="剪刀"andcomputer_choice=="布")or\(player_choice=="布"andcomputer_choice=="石頭"):print("恭喜你,你贏了!")else:print("很遺憾,你輸了!")breakexceptExceptionase:print("發(fā)生了一個錯誤:",str(e))本章小結本章講解了程序的三種控制結構,具體講解了分支結構的三種類型:單分支結構、二分支結構合多分支結構,以及判斷條件的組合。進一步具體講解了循環(huán)結構的兩種類型:遍歷循環(huán)和無限循環(huán),以及循環(huán)控制符break和continue。最后,講解了程序的基本異常處理方法和random函數的使用。通過精選的實例幫助讀者理解程序結構和異常處理的運用。5.1函數的基本用法

5.2函數的參數傳遞

5.3函數的遞歸調用

5.4變量的作用域

5.5精選案例第5章函數考綱考點

函數的定義和使用

函數的參數傳遞:可選參數傳遞、參數名稱傳遞、函數的返回值

變量的作用域:局部變量和全局變量知識導圖5.1函數的基本用法函數是一段具有特定功能的、可重用的語句組,通過函數名來表示和調用。經過定義,一組語句等價于一個函數,在需要使用這組語句的地方,直接調用函數名稱即可。因此,函數的使用包括兩部分:函數的定義和函數的調用。??5.1.1函數的定義在Python中,定義一個函數使用def保留字,函數定義包括兩部分:函數名和函數體,函數名用于標識函數,函數體中則包含了實現特定功能的代碼塊。語法形式如下:def<函數名>(<形參列表>):<函數體>return<返回值列表>函數名:用于唯一標識這個函數,符合標識符的命名規(guī)則。形參列表:代表了函數的輸入值,在函數內部進行計算和操作,是在函數定義時聲明的參數,可以有零個、一個或多個,多個參數由逗號分隔,當沒有參數時也要保留圓括號。形式參數不需要聲明類型,也不需要指定函數返回值類型。函數體:是函數每次被調用時執(zhí)行的代碼,由一行或多行語句組成。??例如,一個乘法函數,示例代碼如下:defmultiply_numbers(a,b):returna*b說明:multiply_numbers是一個乘法函數,它接受兩個參數a和b,然后使用“*”運算符計算這兩個數字的乘積,并返回結果。由于需要返回值,所以要使用return和返回值列表。函數也可以沒有返回值,沒有返回值的函數,僅表示執(zhí)行了函數體部分的代碼功能。??例如,問候函數,示例代碼如下:defmultiply_numbers(a,b):returna*b說明:該函數沒有返回值,僅在調用時執(zhí)行語句“print("Hello,{}!".format(name))”。當一個函數被定義后,它僅僅只是一段存在于代碼中的靜態(tài)代碼塊。它不會自行執(zhí)行,也不會對程序產生任何影響。只有當函數被調用時,它才會被激活,并執(zhí)行其中的代碼。調用函數可以理解為給函數發(fā)出一個執(zhí)行的命令,使其從靜態(tài)變?yōu)閯討B(tài)。??5.1.2函數的調用調用函數的基本語法格式如下:<函數名>(<實參列表>)例如,對乘法函數的完整調用過程,示例代碼如下:defmultiply_numbers(a,b):#乘法函數的定義

returna*bprint(multiply_numbers(3,5))#乘法函數的調用說明:一般而言實參列表必須與形參列表一一對應??函數是從“print(multiply_numbers(3,5))”語句開始被調用,最后執(zhí)行完函數內容后,也是回到了“print(multiply_numbers(3,5))”語句調用的位置;函數中有兩個形參a,b,調用函數的print()語句也有兩個實參3,5;完整的程序中,函數要先定義好才能被調用,所以通常情況下函數定義放在程序的開始部分,或者至少在函數調用之前。??5.1.3函數的返回值函數通過return語句來返回值,可以返回任何類型的值,包括整數、浮點數、字符串、列表、字典等,函數也可以返回多個值,實際上是通過返回一個元組來實現的。示例代碼如下:>>>defexap(x,y,z): returnx*y+z>>>s=exap(3,5,7)>>>print(s)22說明:理解函數如何通過return語句返回計算結果,并且這個返回值可以被賦值給其他變量或用于其他計算。??如何在Python中定義一個返回多個值的函數,并如何調用這樣的函數來獲取這些返回值。函數可以返回元組,這個元組可以包含任意數量的元素,每個元素都是函數內部計算的一個結果。>>>defexap(x,y,z): returnx*y+z,x+y+z,x*y%z>>>print(exap(3,5,7))(22,15,1)??return語句可以將結果返回給調用者,但只要return語句被執(zhí)行,函數的執(zhí)行將立即結束,無論是否有其余的代碼。示例代碼如下:defexample_func():print("Beforereturnstatement")return"Hello"print("Afterreturnstatement")#這行代碼將不會被執(zhí)行print(example_func())其運行結果為:BeforereturnstatementHello??如果函數中沒有return語句,或者return后面沒有跟任何值,那么該函數將返回None,示例代碼如下:defno_return():x=3print(no_return())其運行結果為:None??函數的返回值可以被賦值給一個變量,或者用于其他計算,初學者往往把在函數內部使用print()函數進行輸出視為返回值,請務必區(qū)分清楚,返回值是需要明確使用return語句的。??5.1.4lambda函數在python中,有時候我們可能只需要一個簡單的函數,只使用一次,并不需要給它起個名字。lambda函數的語法通常使用關鍵字"lambda"來表示。它后面緊跟著參數列表,然后是一個冒號和一個表達式,表示函數的返回值,其語法格式如下:<函數名>=lambda<參數>:<表達式>這種格式等價于:def<函數名>(<參數>):return<表達式>??lambda函數可以接受任意數量的參數,但只能返回一個表達式的值。例如,計算兩個數的和。示例代碼如下:>>>f=lambdax,y:x+y>>>f(7,8)15說明:一般而言建議謹慎使用lambda函數,lambda函數主要用作一些特定函數或方法的參數,它有一些固定使用方式,建議逐步掌握。一般情況,建議初學者使用def定義的普通函數。??5.1.5pass語句pass語句在Python中表示一個空操作,即它不執(zhí)行任何實際的操作或產生任何效果。它只是一個占位符,用于在語法上需要一個語句,但實際上不需要執(zhí)行任何操作時使用。pass語句的語法非常簡單,只需要使用關鍵字pass即可。它沒有任何參數或額外的語法要求。示例代碼如下:defmy_function():pass說明:函數my_function()什么都不做,調用它不會有任何效果。??pass語句的主要作用是保持程序結構的完整性。在編寫代碼時,有時我們可能需要定義一個函數或類的結構,但暫時還沒有實現具體的功能。這時,我們可以使用pass語句作為一個臨時的占位符,以確保程序的語法正確性。稍后,我們可以再來填充具體的實現代碼。需要注意的是,pass語句只是一個臨時的占位符,不應該被用于實際的程序邏輯中。一旦程序的功能實現完成,應該及時替換掉pass語句,以確保程序的完整性和可讀性。5.2函數的參數傳遞??函數的參數傳遞是函數中數據交互的核心機制之一,理解并掌握參數傳遞的概念,將使我們能夠編寫出更加準確、高效且符合預期的代碼。函數的參數傳遞是通過形參和實參的交互實現的。??5.2.1形參和實參形式參數,簡稱“形參”,是在定義函數時使用的,形式參數的命名只要符合“標識符”命名規(guī)則即可。調用函數時傳遞的參數稱為“實際參數”,簡稱“實參”。當函數定義和調用時,無論有沒有參數,一對括號必須有。定義函數時不需要聲明形式參數類型,解釋器會根據實參的類型自動推斷形參類型。??例如,比較大小,找較大值。示例代碼如下:defprintMax(a,b):ifa>b:print(a,"較大值")else:print(b,"較大值")printMax(10,20)??在Python中,參數傳遞是通過對象引用來進行的,當向函數傳遞參數時,實際上是傳遞了對象的引用。如果在函數內部修改了對象的值,這個修改會對外部參數造成影響嗎?這需要分成兩種情況來討論。??當傳遞一個列表或字典這樣的可變對象時,函數內部對變量的修改會影響到函數外部的原始對象可變對象參數傳遞b=[10,20]print("b的初始引用為:",id(b))deff2(m):print("m的初始引用為:",id(m))m.append(30)print("m運算后的引用:",id(m))f2(b)#調用f2,實參為bprint("調用結束后b的引用為:",id(b))print("調用結束后b的值為:",b)print("調用結束后m的值為:",m)其運行結果為:b的初始引用為:2361275969416m的初始引用為:2361275969416m運算后的引用:2361275969416調用結束后b的引用為:2361275969416調用結束后b的值為:[10,20,30]Traceback(mostrecentcalllast):File"D:/可變對象.py",line10,in<module>print("調用結束后m的值為:",m)NameError:name'm'isnotdefined??對于不可變類型的參數,如整數、浮點數和字符串,在函數內部直接修改形參的值不會影響實參。不可變對象參數傳遞b=3print("b的初始引用為:",id(b))defadd1(a):print("a的初始引用為:",id(a))a+=1print("運算后a的引用為:",id(a))print("運算后a的值為:",a)add1(b)#調用add1()函數,實參為bprint("調用結束后b的引用為:",id(b))print("調用結束后b的值為:",b)print("調用結束后a的值為:",a)其運行結果為:b的初始引用為:1985553168a的初始引用為:1985553168運算后a的引用為:1985553200運算后a的值為:4調用結束后b的引用為:1985553168調用結束后b的值為:3Traceback(mostrecentcalllast):File"D:/不可變對象.py",line11,in<module>print("調用結束后a的值為:",a)NameError:name'a'isnotdefined??python采用的是基于值的自動內在管理模式,變量并不直接存儲值,而是存儲值的引用。從此角度而言,在python語言中,函數不存在傳值調用。??5.2.2位置參數傳遞在python中,位置參數傳遞是一種基本的傳遞方式。它要求當函數被調用時,實參和形參的順序必須嚴格一致,并且實參和形參的數量必須相同。>>>defadd(a,b,c):#所有形參都是位置參數

print(a,b,c) returna+b+c>>>add(2,3,4)#調用add(),實參分別為2,3,42349>>>add(2,4,3)2439>>>add(1,2,3,4)#實參與形參數量不同,出錯Traceback(mostrecentcalllast):File"<pyshell#27>",line1,in<module>add(1,2,3,4)TypeError:add()takes3positionalargumentsbut4weregiven??5.2.3可選參數傳遞可選參數的傳遞是一種靈活且方便的函數調用機制。在調用函數時是否為默認參數傳遞實參是可選的,具有較大的靈活性??蛇x參數是在函數定義的時候設定的,當函數被調用時,如果沒有傳入對應的參數值,就會使用函數定義時的可選參數的默認值替代,函數定義時的語法格式如下:def<函數名>(<必選參數列表>,<可選參數>=<默認值>):<函數體>return<返回值列表>??可選參數一般都放置在必選參數的后面,即定義函數時,先給出所有必選參數,然后再分別列出每個可選參數及對應的默認值,否則會提示語法錯誤。>>>defgreet(name,prefix="Hello,"): print(prefix+name)>>>greet("Mike")Hello,Mike>>>greet("Jone",prefix="Hi,")Hi,Jone??5.2.4參數名稱傳遞參數名稱的傳遞通常指的是在函數調用時,通過指定參數的名稱來傳遞對應的值,其語法格式如下:<函數名>(<參數名>=<實際值>)示例代碼如下:>>>defgreet(name,prefix="Hello,"): print(prefix+name)>>>greet(name="Mike")Hello,Mike>>>greet(prefix="Hi,",name="Mike")Hi,Mike??5.2.5可變長度參數的傳遞可變長度參數的傳遞指的是在函數調用時,可以傳遞不定數量的參數。Python提供了兩種形式*args和**kwargs,這兩種形式是在函數定義時使用的,使用這兩種形式就意味著允許函數接收不確定數量的實際參數,并在函數體內部訪問這些參數。??

溫馨提示

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

評論

0/150

提交評論