版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
4.1程序流程圖
4.2順序結(jié)構(gòu)
4.3條件表達式
4.4選擇結(jié)構(gòu)
4.5循環(huán)結(jié)構(gòu)
4.6程序的異常處理
4.7random庫
4.8精選案例第4章程序的控制結(jié)構(gòu)考綱考點
程序的三種控制結(jié)構(gòu)
程序的分支結(jié)構(gòu):
單分支結(jié)構(gòu)、二分支結(jié)構(gòu)、多分支結(jié)構(gòu)
程序的循環(huán)結(jié)構(gòu):
遍歷循環(huán)、無限循環(huán)、break和continue循環(huán)控制
程序的異常處理:try-except
random庫知識導圖4.1程序流程圖
程序由三種基本結(jié)構(gòu)構(gòu)成:順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。結(jié)構(gòu)化的程序設(shè)計往往會使用流程圖進行描述。程序流程圖是用一系列圖形、流程線和文字說明描述程序的基本操作和控制流程。流程圖的基本元素下圖所示:??起止框是一個圓角矩形,表示程序的開始或結(jié)束,每個程序只能有一個開始和一個結(jié)束;判斷框是一個菱形框,用于判斷框內(nèi)條件是否成立,允許有一個入口,2個或2個以上出口,根據(jù)判斷的結(jié)果選擇不同的執(zhí)行路徑;處理框是一個矩形框,表示確定的處理和步驟,一個流程圖中可有多個處理框;輸入輸出框是一個平行四邊形,表示數(shù)據(jù)的輸入或經(jīng)過處理后結(jié)果的輸出,輸入可有0個或多個,輸出至少有1個;注釋框是用來增加對程序的說明解釋或標注的;流向線是帶箭頭的直線或者曲線,用于指示程序的執(zhí)行路徑;連接點是一個圓形,可以將多個流程圖連接起來,常用于多個流程圖的拼接。4.2順序結(jié)構(gòu)??順序結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計中最基本最直接的一種結(jié)構(gòu),程序會依照其書寫順序從前到后依次執(zhí)行語句。順序結(jié)構(gòu)的流程圖如下圖所示,先按順序執(zhí)行完語句塊1,然后再按順序執(zhí)行語句塊2。其中,語句塊1和語句塊2可以表示一個或一組順序執(zhí)行的語句。??常見的順序結(jié)構(gòu)中通常會包含有賦值語句和輸入、輸出語句等。如第二章所提到的賦值號構(gòu)成賦值語句;input()和eval()函數(shù)構(gòu)成的輸入語句;還有用print()函數(shù)構(gòu)成的輸出語句。順序結(jié)構(gòu)是其他更復雜結(jié)構(gòu)(如選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu))的基礎(chǔ)。4.3條件表達式??python中的關(guān)系運算符如下表所示:4.3.1關(guān)系運算符操作符<
<=>
>===!=說明小于小于等于大于大于等于等于不等于??在python中使用關(guān)系運算符的一個重要前提是,操作數(shù)之間必須可比較大小。Python中字符串大小的比較是基于字符的Unicode編碼值,示例代碼如下:>>>7>8#比較數(shù)值大小False>>>"china"<"China"#比較字符串大小False>>>[5,6,7]<[5,6,8]#比較列表的大小True>>>{5,6,7}<{5,6,7,8}#集合的比較主要是測試包含關(guān)系True>>>"567">45#字符串和數(shù)字無可比性Traceback(mostrecentcalllast):File"<pyshell#10>",line1,in<module>"567">45TypeError:unorderabletypes:str()>int()??
python中的關(guān)系運算符可以連用,且其含義與日常含義一致。示例代碼如下:>>>2<3<4#等價于2<3且3<4True>>>3<5>2#等價于5>2且3<5True??關(guān)系表達式有惰性求值的特點,惰性求值是一種在需要時才計算值的策略,這種策略在處理大量數(shù)據(jù)時可以大大提高效率。示例代碼如下:>>>abc#abc沒有賦值Traceback(mostrecentcalllast):File"<pyshell#13>",line1,in<module>abcNameError:name'abc'isnotdefined>>>1>2>abc#惰性求值,只計算1>2就可得出結(jié)果,所以沒必要計算2>abcFalse??邏輯運算符not、and和or可以對條件進行邏輯組合或運算,構(gòu)成更加復雜的條件表達式。其功能說明下表4.3.2邏輯運算符運算符說明舉例not邏輯非,對操作數(shù)的邏輯狀態(tài)取反。如果操作數(shù)為True,則結(jié)果為False;如果操作數(shù)為False,則結(jié)果為True。notTrue結(jié)果為Falseand邏輯與,當兩側(cè)的操作數(shù)都為True時,結(jié)果為True;否則為False。TrueandFalse結(jié)果為Falseor邏輯或,當兩側(cè)的操作數(shù)中至少有一個為True時,結(jié)果為True;否則為False。TrueorFalse結(jié)果為True??邏輯運算的一般的例子,示例代碼如下:>>>x=80>>>x<100andx>10True>>>x>100orx<10False>>>notx>100True??and和or的惰性求值,示例代碼如下:>>>12<3anda>10#此時a沒被定義,但關(guān)系表達式卻可以得到結(jié)果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中邏輯運算符兩側(cè)操作數(shù)還可以是數(shù)值表達式。對and和or而言,其最終運算后的結(jié)果是最后一個被計算的表達式的值。對not而言,其結(jié)果依然是True或False,True對應非零值,F(xiàn)alse對應零。示例代碼如右:>>>x=5>>>7andx+1#7非0為True,需要計算x+1才能確定值,結(jié)果為66>>>7orx+1#7非0為True,不需要計算x+1,結(jié)果為77>>>0and7#0為False,不需要計算后面的7,結(jié)果為00>>>0or7#0為False,需要計算后面的7,結(jié)果為77>>>not5#5非0為True,notTrue,結(jié)果為FalseFalse>>>not0#0為False,notFalse,結(jié)果為TrueTrue??用于測試一個對象是否為另一個對象的元素。示例代碼如下:4.3.3成員測試運算符in>>>3in[4,3,7]#測試3是否在列表[4,3,7]中True>>>5inrange(1,10,1)#range()函數(shù)用來生成指定范圍數(shù)字True>>>'abc'in'abcdefg'#子字符串測試True>>>foriin(3,5,7):#循環(huán),成員遍歷
print(i,end='\t')3 5 7 ??Python中位運算符只能用于整數(shù),直接操作整數(shù)的二進制位。在執(zhí)行位運算時應當首先將整數(shù)轉(zhuǎn)換為二進制數(shù),然后再使用位運算操作。4.3.3位運算符1.&(按位與):對兩個整數(shù)的每一位執(zhí)行與操作,如果兩個相應的二進制位都為1,則結(jié)果為1,否則為0。這通常用于屏蔽掉某些位或檢查特定位的狀態(tài)。2.|(按位或):對兩個整數(shù)的每一位執(zhí)行或操作,如果兩個相應的二進制位至少有一個為1,則結(jié)果為1,否則為0。這常用于設(shè)置特定位的狀態(tài),而不改變其他位。3.^(按位異或):對兩個整數(shù)的每一位執(zhí)行異或操作,如果兩個相應的二進制位有一個為1且另一個為0,則結(jié)果為1,否則為0。異或運算常用于加密、錯誤檢測和數(shù)據(jù)交換等場景。??4.~(按位取反):對一個整數(shù)的每一位執(zhí)行非操作,將1變?yōu)?,0變?yōu)?。這是一個單目運算符,通常用于生成補碼或翻轉(zhuǎn)所有位的狀態(tài)5.<<(左移):左移將整數(shù)的所有位向左移動指定的位數(shù),符號位保持不變,低位用0填充,相當于乘以2的指定次方6.>>(右移):右移將整數(shù)的所有位向右移動指定的位數(shù),對于Python中的有符號整數(shù),高位通常保持符號位不變(算術(shù)右移),低位丟棄,相當于除以2的指定次方(向下取整)。??示例代碼如下:>>>5<<2#把二進制數(shù)101左移2位,則為二進制數(shù)1010020>>>5>>2#把二進制數(shù)101右移2位取整,則為二進制數(shù)11>>>3&7#位與運算3>>>3|8#位或運算11>>>3^5#位異或運算6>>>~5#把二進制數(shù)00000101按位取反,則為二進制數(shù)11111010-6??用來測試兩個對象是否同一個,如果是則返回True,否則返回False;如果是同一個,兩者具有相同的內(nèi)存地址。示例代碼如下:4.3.5同一性測試運算符is>>>x=[300,300,300]>>>x[0]isx[1]#同一個值在內(nèi)存中只有一份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)先級順序由高到低總結(jié),如表所示4.3.6運算優(yōu)先級運算符說明(優(yōu)先級由高到低)**指數(shù)(最高優(yōu)先級)~按位翻轉(zhuǎn)*/%//乘、除、取模、整除+-加、減>><<右移、左移&位與^|位異或、位或<=<>>=比較運算==!=等于
不等于=%=/=//=-=+=*=**=賦值類操作符isisnot同一性運算符innotin成員運算符notorand邏輯運算符??實際使用中可記住以下簡單規(guī)則:1.乘除優(yōu)先加減2.位運算和算術(shù)運算>比較運算>賦值運算條件表達式有一些特殊用法,Python語言中條件表達式的值只要不是False、0(或0.0,0j等)、空值None、空列表、空元組、空集合、空字典、空字符串、空range()對象或其他空迭代對象,均被認為True.也就是所有合法的Python表達式都可以作為條件表達式,包括含有函數(shù)調(diào)用的表達式。4.4選擇結(jié)構(gòu)??在實際的編程過程中,常常需要解決這樣一類問題,要求根據(jù)某些條件的邏輯結(jié)果來決定要執(zhí)行的程序語句。這種根據(jù)條件判斷選擇不同執(zhí)行語句的運行方式就是選擇結(jié)構(gòu),也稱為分支結(jié)構(gòu)。在PYTHON中實現(xiàn)分支結(jié)構(gòu)的語句是if語句,而根據(jù)分支結(jié)構(gòu)所實現(xiàn)的分支數(shù)的不同,可分為單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)。??單分支選擇結(jié)構(gòu)其語法格式如下所示。其中表達式后面的冒號“:”是不可或缺的,它表示一個語句塊的開始,縮進表達<語句塊>與if的包含關(guān)系,一般是四個空格為縮進單位。4.4.1單分支選擇結(jié)構(gòu)if<條件表達式>:<語句塊>執(zhí)行過程:當if后面表達式值為True或者為與True等價的值時,則執(zhí)行語句塊中的語句序列,然后程序接著執(zhí)行if語句結(jié)束后的下一條語句。當結(jié)果為False或者為與False等價的值時,則語句塊中的語句會被跳過去,直接執(zhí)行if語句結(jié)束后的下一條語句.其流程圖如右所示:??例4-1判斷輸入的字符串是否為回文字符串?;匚淖址侵刚蜃x和反向讀都一樣的字符串,例如,12321、madam、level等。以下用單分支結(jié)構(gòu)實現(xiàn),代碼如下:#判斷輸入的字符串是否為回文字符串str=input("請輸入一個字符串或數(shù)值:")ifstr==str[::-1]:print("這是一個回文字符串.")問題:在實際執(zhí)行中,以上程序當條件為假時,沒有給用戶任何信息?如何解決???Python中的雙分支結(jié)構(gòu)if-else語句是Python中最基本的控制流語句之一,二分支結(jié)構(gòu)的特點是它根據(jù)條件的結(jié)果來執(zhí)行不同的代碼塊。語法格式如下:4.4.2雙分支選擇結(jié)構(gòu)if<條件表達式>:<語句塊1>else:<語句塊2>執(zhí)行過程:當if后面表達式值為True或者為與True等價的值時,則執(zhí)行語句塊1中的語句序列;當結(jié)果為False或者為與False等價的值時,則執(zhí)行語句塊2中的語句序列。簡單說,二分支結(jié)構(gòu)根據(jù)條件的True或False結(jié)果產(chǎn)生兩條路徑。其流程圖如右所示。??例4-2用雙分支結(jié)構(gòu)完成判斷輸入的字符串是否為回文字符串,會使程序更完整。代碼如下:#判斷輸入的字符串是否為回文字符串str=input("請輸入一個字符串或數(shù)值:")ifstr==str[::-1]:print("這是一個回文字符串.")else:print("這不是一個回文字符串.")其運行結(jié)果如下:請輸入一個字符串或數(shù)值:12321這是一個回文字符串.請輸入一個字符串或數(shù)值:12345這不是一個回文字符串.??雙分支結(jié)構(gòu)還有一種更簡潔的表達方式,是用一個三元運算符構(gòu)成,其表達式中還可能嵌套三元運算符,實現(xiàn)與分支結(jié)構(gòu)相似的效果。其語法格式如下:<表達式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說明:此結(jié)構(gòu)是一種表達式,不是語句??if-elif-else描述python的多分支選擇結(jié)構(gòu),語句格式如下:4.4.3多分支選擇結(jié)構(gòu)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根據(jù)月份判斷所在季節(jié)。程序分析:首先需要明確季節(jié)的劃分標準。一般來說,北半球的季節(jié)劃分如下:春季:3月、4月、5月夏季:6月、7月、8月秋季:9月、10月、11月冬季:12月、1月、2月另外,我們還需要做一個用戶輸入的月份是否合法的驗證,即如果輸入了1-12之外的數(shù)據(jù),則數(shù)據(jù)輸入是不合法的。由以上分析可知,我們需要一個5分支結(jié)構(gòu)語句。??代碼如下: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設(shè)計一個問答式計算器。程序分析:程序功能是接收用戶輸入的兩個數(shù)字(num1和num2)和一個運算符(+、-、*、/之一,并將其存儲到字符串變量operator中),然后根據(jù)運算符執(zhí)行相應的數(shù)學運算,并輸出結(jié)果。程序的核心在于其分支結(jié)構(gòu),根據(jù)運算符的不同,設(shè)計不同的分支。在處理除法運算時,需要關(guān)注除數(shù)是否為0,當除數(shù)為0時會導致運算錯誤或程序崩潰。因此在除的分支中使用了一個嵌套的if-else結(jié)構(gòu),使用exit()函數(shù)來在出現(xiàn)錯誤時立即終止程序,以免程序非正常中止。另外,程序設(shè)計還需要考慮如果輸入的運算符不是+、-、*、/中的任何一個,則打印一條錯誤消息并退出程序,表示不支持該運算符。??代碼如下:num1=float(input("請輸入第一個數(shù)字:"))num2=float(input("請輸入第二個數(shù)字:"))operator=input("請輸入運算符(+、-、*、/):")ifoperator=="+":result=num1+num2elifoperator=="-":result=num1-num2elifoperator=="*":result=num1*num2elifoperator=="/":ifnum2!=0:result=num1/num2else:print("除數(shù)不能為0")exit()else:print("不支持的運算符")exit()說明:exit()是Python中的一個內(nèi)置函數(shù),用于立即終止當前進程的執(zhí)行。當exit()被調(diào)用時,Python解釋器會停止執(zhí)行當前的程序,并退出4.5循環(huán)結(jié)構(gòu)??循環(huán)結(jié)構(gòu)是用來重復執(zhí)行一段代碼的機制,Python提供了兩種主要的循環(huán)結(jié)構(gòu):遍歷循環(huán)和無限循環(huán)。遍歷循環(huán)使用保留字for依次提取遍歷結(jié)構(gòu)各元素進行處理,一般用于循環(huán)次數(shù)可以提前確定的情況,特別適用于枚舉、遍歷序列或迭代對象中元素的場合。無限循環(huán)使用保留字while根據(jù)判斷條件執(zhí)行程序,一般用于循環(huán)次數(shù)難以提前確定的情況下,當然循環(huán)次數(shù)可以確定的情況下也可以用。??循環(huán)結(jié)構(gòu)的流程圖如下圖所示:??循環(huán)是先從遍歷結(jié)構(gòu)中提取元素,放在循環(huán)變量中,然后執(zhí)行語句塊內(nèi)容,反復執(zhí)行以上操作,直到遍歷結(jié)構(gòu)中元素全部取完了為止,for語句的循環(huán)執(zhí)行次數(shù)是根據(jù)遍歷結(jié)構(gòu)中元素個數(shù)確定的。4.5.1for循環(huán)??語句格式如下:for循環(huán)的通常結(jié)構(gòu)for<循環(huán)變量>in<遍歷結(jié)構(gòu)>:<語句塊>說明:
遍歷結(jié)構(gòu)可以是字符串、文件、range()函數(shù)或組合數(shù)據(jù)類型等。??(1)遍歷結(jié)構(gòu)為字符串。示例代碼如下:>>>foriin"China": print(i)其運行結(jié)果為 China??(2)遍歷結(jié)構(gòu)為range()函數(shù),range()函數(shù)格式如下:
range(start,stop[,step])說明:start:序列的起始值,默認為0(可選參數(shù))。stop:序列的結(jié)束值,但不包括該值(必選參數(shù))。step:序列中每個數(shù)字之間的差,即步長,默認為1(可選參數(shù))。當只有一個參數(shù)時,range(stop)將生成從0到stop-1的整數(shù)序列。如果有兩個參數(shù),range(start,stop)將生成從start到stop-1的整數(shù)序列。如果有三個參數(shù),range(start,stop,step)將生成從start開始,以step為步長,直到但不包括stop的整數(shù)序列。??例4-5計算1-100的累加和。程序分析:要計算從1到100的累加和。加法是從1加到100,加法操作是一個反復執(zhí)行的過程,而反復執(zhí)行就是循環(huán)。為了實現(xiàn)這個目標,使用for循環(huán)和range()函數(shù)。首先,初始化一個變量s為0,用于存儲累加和。然后,使用for循環(huán)來遍歷從1到100的整數(shù)序列??梢允褂胷ange()函數(shù)來生成這個整數(shù)序列。range(1,101)表示生成一個從1開始(包括1),到101結(jié)束(不包括101)的整數(shù)序列。因此,這個序列包含了從1到100的整數(shù)。在每次循環(huán)中,將循環(huán)變量i的值加到s上,實現(xiàn)累加的效果。循環(huán)結(jié)束后,s的值就是從1到100的累加和。最后,使用print()函數(shù)來輸出計算結(jié)果。??代碼如下:s=0foriinrange(1,101):s=s+iprint("從1加到100的和為{}".format(s))??(3)遍歷結(jié)構(gòu)為列表例4-6連接列表words=['我','喜歡','Python']中的字符串。程序分析:輸入題目已經(jīng)給出,即為words=['我','喜歡','Python'],要求輸出列表中所有字符串連接成的單一字符串。字符串連接可使用“+”進行,因為是反復操作,所以使用for循環(huán)來遍歷列表中的每個元素,在循環(huán)體內(nèi),使用字符串連接操作“+”將當前字符串添加到結(jié)果字符串中。??代碼如下:
words=['我','喜歡','Python']sentence=''forwordinwords:sentence+=wordprint("連接后的字符串:",sentence)??語句格式如下:for循環(huán)的擴展結(jié)構(gòu)for<循環(huán)變量>in<遍歷結(jié)構(gòu)>:<語句塊1>else:<語句塊2>執(zhí)行過程:當for循環(huán)正常執(zhí)行之后,程序才會繼續(xù)執(zhí)行else語句中內(nèi)容,即else語句只在循環(huán)正常執(zhí)行之后才執(zhí)行。由于循環(huán)的非正常結(jié)束,往往是因為執(zhí)行了break語句而造成的,在遍歷循環(huán)的擴展模式中,這種情況是不會執(zhí)行else中的語句的,所以,我們常常使用這種結(jié)構(gòu)跟蹤循環(huán)是否已經(jīng)通過break跳出了循環(huán)。??例4-7找水果。代碼如下:fruits=["apple","banana","cherry"]x=input("Pleaseenterafruitword:")forfruitinfruits:iffruit==x:print("Found"+x+"!")breakelse:print("Didnotfind"+x+".")第一次運行結(jié)果如下:Pleaseenterafruitword:peachDidnotfindpeach.在這次運行中,我們要找水果peach,但是peach不在水果列表中,因此if語句條件不滿足,break不會執(zhí)行,循環(huán)正常結(jié)束,則執(zhí)行else后面的print()語句第二次運行結(jié)果如下:Pleaseenterafruitword:cherryFoundcherry!在本次運行中,我們要找的水果cherry在列表中,因此if語句條件滿足,則執(zhí)行了break,循環(huán)中斷,則else不被執(zhí)行。??while是python中保留的可以用來實現(xiàn)條件循環(huán)的語句.首先對條件進行判斷,如果滿足條件則執(zhí)行語句塊,反復執(zhí)行以上操作,直到條件不滿足,從循環(huán)中退出,執(zhí)行與while同級別縮進的后續(xù)語句。4.5.2while循環(huán)??語句格式如下:while循環(huán)的通常結(jié)構(gòu)while<條件>:<語句塊>說明:while語句是先判斷條件再確定是否循環(huán),所以其最少執(zhí)行次數(shù)可以是0次;在語句塊中,應當有使循環(huán)能夠中止的語句或者令循環(huán)條件能夠不滿足的語句,否則會造成死循環(huán),也就是無限循環(huán)。??例4-8計算n!。代碼如下:n=int(input("請輸入一個正整數(shù)n:"))factorial=1i=1whilei<=n:factorial*=ii+=1print(n,"的階乘為:",factorial)??語句格式如下:while循環(huán)的擴展結(jié)構(gòu)while<條件>:<語句塊1>else:<語句塊2>執(zhí)行過程:當while循環(huán)正常執(zhí)行之后,程序會繼續(xù)執(zhí)行else語句中內(nèi)容??理解循環(huán)需求:在開始編寫循環(huán)代碼之前,首先要清楚地理解問題的需求,確定循環(huán)的次數(shù)、循環(huán)的條件以及每次循環(huán)中需要執(zhí)行的操作。選擇合適的循環(huán)結(jié)構(gòu):根據(jù)問題的特點,選擇合適的循環(huán)結(jié)構(gòu),如for循環(huán)(適用于已知循環(huán)次數(shù)的情況)或while循環(huán)(適用于循環(huán)次數(shù)不確定,但循環(huán)條件明確的情況)。初始化循環(huán)變量:循環(huán)開始前,需要初始化循環(huán)變量,這些變量通常用于控制循環(huán)的次數(shù)或作為循環(huán)條件的判斷依據(jù)。循環(huán)結(jié)構(gòu)編程思路總結(jié)??設(shè)置循環(huán)條件:循環(huán)條件是決定循環(huán)是否繼續(xù)執(zhí)行的關(guān)鍵因素。條件設(shè)置不當可能導致循環(huán)無法終止(無限循環(huán))或提前終止(未達到預期效果)。更新循環(huán)變量:在每次循環(huán)迭代結(jié)束后,需要更新循環(huán)變量的值,以確保循環(huán)能夠正確進行下一次迭代或最終終止。??注意循環(huán)體內(nèi)的操作:循環(huán)體內(nèi)的操作應該清晰、簡潔且高效。避免在循環(huán)體內(nèi)進行不必要的計算或執(zhí)行與循環(huán)目的無關(guān)的操作??紤]循環(huán)的退出條件:在設(shè)計循環(huán)時,應始終考慮循環(huán)的退出條件,確保循環(huán)能夠在滿足條件時正確退出,避免程序陷入死循環(huán)。??break和continue是循環(huán)結(jié)構(gòu)中兩個輔助循環(huán)控制的保留字。它們允許在循環(huán)過程中根據(jù)特定條件來中斷或跳過循環(huán),從而更靈活地控制循環(huán)的執(zhí)行流程。4.5.3break和continue??用于提前終止當前循環(huán),并立即退出該循環(huán)結(jié)構(gòu)。當遇到break時,程序?qū)⑻霭淖顑?nèi)層循環(huán),并繼續(xù)執(zhí)行緊跟在該循環(huán)之后的語句。如果有二層或多層循環(huán),則break退出最內(nèi)層循環(huán)。break語句foriinrange(1,11):ifi==5:print("遇到5,使用break中斷循環(huán)")breakprint(i)其運行結(jié)果為:1234遇到5,使用break中斷循環(huán)??用來結(jié)束當前當次循環(huán),即提前結(jié)束本輪循環(huán),接著執(zhí)行下一輪循環(huán)。將上面的代碼中的break語句用continue語句代替,示例代碼如下:continue語句foriinrange(1,11):ifi==5:print("遇到5,使用continue中斷循環(huán)")continueprint(i)其運行結(jié)果為:1234遇到5,使用continue中斷循環(huán)6789104.6程序的異常處理??異常是在程序執(zhí)行過程中發(fā)生的運行錯誤,例如,訪問不存在的變量或索引超出范圍等。異常會導致序的突然中止和崩潰,譬如我們常遇到的死機,也是程序異常的一種。如果我們能夠預測并處理這些異常,能夠做到即使出現(xiàn)異常,程序也能穩(wěn)定順利的繼續(xù)執(zhí)行下去,就大大提高了程序的健壯性和可靠性??Python提供了一個強大的異常處理機制,允許我們捕獲和處理異常,以確保程序的穩(wěn)定性和可靠性。異常處理的基本結(jié)構(gòu)是使用try和except語句塊,基本的語法格式如下:try:<語句塊1>except:<語句塊2>執(zhí)行過程:語句塊1是正常執(zhí)行的程序內(nèi)容,當執(zhí)行這個語句塊發(fā)生異常時,則執(zhí)行except保留字后面的語句塊2,以保證程序像洪水一樣,一條分支堵塞了,但還是可以從另一條分支正常退出。??例4-9:編寫一個程序,用戶連續(xù)輸入數(shù)字進行除法運算,直到用戶決定停止。如果用戶輸入0作為除數(shù),程序應該捕獲這個異常,并打印出"除數(shù)不能為零!"的提示信息。如果用戶輸入的不是數(shù)字,程序也應該捕獲這個異常,并打印出"請輸入有效的數(shù)字!"的提示信息。當用戶輸入"q"或者"quit"時,程序應該退出循環(huán)并結(jié)束。??程序分析:
這個題目有非常明確的需求描述,因此就不再做進一步的需求分析,我們可以從數(shù)據(jù)處理入手。輸入:用戶的輸入,可能是一個數(shù)字、也可能是非數(shù)字字符,或者"q"或"quit"。處理:進行除法運算、異常處理、輸入驗證和循環(huán)控制。輸出:除法結(jié)果或錯誤提示信息。算法選擇方面,由于循環(huán)次數(shù)是由用戶輸入決定的,使用whileTrue循環(huán)來允許用戶連續(xù)進行除法運算。在循環(huán)內(nèi)使用try-except結(jié)構(gòu)來捕獲可能出現(xiàn)的異常,如零除錯誤或輸入不是數(shù)字的情況。當用戶輸入"q"或"quit"時,使用break語句來退出循環(huán)。??whileTrue:try:num1=input("請輸入第一個數(shù)字(或輸入'q'或'quit'退出):")ifnum1.lower()in['q','quit']:print("程序已退出。")breaknum2=float(input("請輸入第二個數(shù)字:"))result=float(num1)/num2print("結(jié)果為:",result)exceptZeroDivisionError:print("除數(shù)不能為零!")exceptValueError:print("請輸入有效的數(shù)字!")4.7random庫在日常生活中,隨機數(shù)生成的需求是非常常見的。Python的random庫為我們提供了多種生成隨機數(shù)的方法。對于初學者來說,掌握這個庫是非常有必要的。random庫是Python的標準庫之一,用于生成偽隨機數(shù)。為什么說是偽隨機數(shù)呢?因為計算機生成的數(shù)實際上是可預測的,只不過看起來像是隨機的。??函數(shù)函數(shù)格式描述randomrandom.random()生成一個[0.0,1.0)之間的隨機浮點數(shù)。randintrandom.randint(a,b)生成一個[a,b]之間的隨機整數(shù)。choicerandom.choice(sequence)從給定的序列中隨機選擇一個元素。shufflerandom.shuffle(sequence)將序列的元素隨機排列,原地修改序列。randrangerandom.randrange(start,stop[,step])返回一個在range(start,stop,step)內(nèi)的隨機整數(shù)。samplerandom.sample(population,k)返回從序列或集合中選擇的k個不重復的元素組成的列表。用于隨機抽樣。uniformrandom.uniform(a,b)返回一個在[a,b]范圍內(nèi)的隨機浮點數(shù)。seedrandom.seed([x])改變隨機數(shù)生成器的種子??捎糜趯嶒灥目芍貜托?。getrandbitsrandom.getrandbits(k)生成一個k比特長的隨機整數(shù)。random庫的常用函數(shù)??random()函數(shù)生成的隨機數(shù)具有均勻分布的特性,也就是說,在[0.0,1.0)這個區(qū)間內(nèi)的任何一個子區(qū)間內(nèi),隨機數(shù)出現(xiàn)的概率都是相等的。示例代碼如下:>>>importrandom>>>random.random()0.0477604166455704>>>random.random()0.5385641354279169>>>random.random()0.7650205055372885??
randint()函數(shù)在需要隨機選擇一定范圍內(nèi)的整數(shù)時非常有用,示例代碼如下:>>>random.randint(1,3)2>>>random.randint(1,3)3>>>random.randint(1,3)3>>>random.randint(1,3)1說明:產(chǎn)生1,2,3中包括1和3的隨機數(shù),隨機數(shù)的意思是當輸入“random.randint(1,3)”按下回車鍵后,是無法預測會出現(xiàn)什么結(jié)果,只能預估結(jié)果是1,2,3中的任意一個數(shù)。??choice(sequence)函數(shù)中,sequence參數(shù)是一個序列類型的數(shù)據(jù)。示例代碼如下:>>>fruits=['蘋果','香蕉','橙子','葡萄','西瓜']>>>random.choice(fruits)'西瓜'>>>random.choice(fruits)'香蕉'>>>random.choice(fruits)'西瓜'說明:choice(fruits)從列表fruits中隨機選擇一個元素輸出。這個函數(shù)非常適合用于需要隨機選擇元素的場景,比如抽獎、隨機推薦等??shuffle(sequence)函數(shù),也就是洗牌。示例代碼如下:>>>fruits=['蘋果','香蕉','橙子','葡萄','西瓜']>>>random.shuffle(fruits)>>>fruits['蘋果','橙子','葡萄','香蕉','西瓜']>>>random.shuffle(fruits)>>>fruits['橙子','蘋果','葡萄','西瓜','香蕉']說明:這種隨機排序非常像我們平時玩牌時的洗牌操作。shuffle()函數(shù)會直接修改傳入的序列,而不是返回一個新的序列,所以在該函數(shù)調(diào)用之后,傳入的序列本身的元素順序會被改變。??
randrange(start,stop[,step])函數(shù)的參數(shù)與Python內(nèi)置的range()函數(shù)非常相似,包括一個起始值(start)、一個結(jié)束值(stop)以及一個可選的步長(step)。函數(shù)會返回在[start,stop)范圍內(nèi)的一個隨機整數(shù),也就是說,start是包括在內(nèi)的,但是stop是不包括的。如果指定了步長參數(shù),那么返回的隨機數(shù)減去起始值后,將是步長的整數(shù)倍,并且在指定的范圍內(nèi)。??示例代碼如下:>>>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的整數(shù)有1,4,7,所以random.randrange(1,8,3)其實就是產(chǎn)生1,4,7中的任意一個數(shù)。與random.randint()函數(shù)相比,random.randrange()函數(shù)更加靈活,因為它允許指定步長。這使得我們可以更加方便地生成一些具有特定規(guī)律的隨機數(shù)序列。例如,我們可以使用random.randrange(0,10,2)來生成0到9之間的隨機偶數(shù)。??sample(population,k)的參數(shù)有兩個:總體(population)和樣本大小(k)。總體可以是一個序列(如列表、元組、字符串等),也可以是一個集合或字典。樣本大小k是一個正整數(shù),表示要從總體中選擇的元素個數(shù)。函數(shù)會返回一個包含k個元素的列表,這些元素是從總體中隨機選擇的,而且不會重復。如果總體的元素個數(shù)小于k,那么函數(shù)會拋出一個ValueError異常。??示例代碼如下:>>>fruits=['蘋果','香蕉','橙子','葡萄','西瓜']>>>random.sample(fruits,4)['橙子','西瓜','蘋果','香蕉']>>>random.sample(fruits,4)['葡萄','蘋果','香蕉','西瓜']>>>random.sample(fruits,4)['葡萄','香蕉','蘋果','橙子']說明:sample()函數(shù)在需要從總體中隨機選擇一部分不重復元素時非常有用。比如,在機器學習中,我們經(jīng)常需要從數(shù)據(jù)集中隨機選擇一部分樣本進行訓練或測試,這時就可以使用random.sample()函數(shù)來實現(xiàn)。??uniform(a,b)函數(shù)的參數(shù)a和b分別表示隨機浮點數(shù)的下限和上限,函數(shù)會返回[a,b)范圍內(nèi)的一個隨機浮點數(shù),也就是說,下限a是包括在內(nèi)的,但是上限b是不包括的。>>>random.uniform(2,8)2.9651717456012774>>>random.uniform(2,8)7.305198549349988>>>random.uniform(2,8)3.5016755851835706說明:uniform()函數(shù)在需要生成指定范圍內(nèi)的隨機浮點數(shù)時非常有用。比如,在模擬程序、游戲、數(shù)值計算等領(lǐng)域中,我們經(jīng)常需要生成一些具有特定分布的隨機數(shù),這時就可以使用uniform()函數(shù)來實現(xiàn)。??seed([x])函數(shù),參數(shù)x被稱為隨機數(shù)的種子,如果每次生成隨機數(shù)之前都設(shè)定相同的種子,那么每次生成的隨機數(shù)序列也將是相同的,這樣就可以保證在相同條件下,隨機數(shù)生成的結(jié)果是可復現(xiàn)的。如果不設(shè)置種子值(即直接調(diào)用random.seed()),那么系統(tǒng)會默認使用當前的系統(tǒng)時間作為種子。seed()函數(shù)只是設(shè)置了隨機數(shù)生成器的種子,并不會直接生成隨機數(shù)。如果需要生成隨機數(shù),還需要調(diào)用其他隨機數(shù)生成函數(shù),比如random()、randint()、choice()等。??示例代碼如下:>>>from?random?import?*>>>seed(10)>>>random()0.5714025946899135>>>random()0.4288890546751146>>>seed(10)???#再次設(shè)置相同的種子,則后續(xù)產(chǎn)生的隨機數(shù)相同>>>random()0.5714025946899135>>>random()0.4288890546751146說明:seed()函數(shù)是一個非常有用的函數(shù),可以幫助我們控制Python程序中生成的隨機數(shù)序列,從而提高程序的重復性和可預測性。??
getrandbits(k)函數(shù)返回一個介于0和2k(包含0,但不包含2k)之間的隨機整數(shù),每個值都以相等的概率產(chǎn)生。>>>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,每個數(shù)字的概率都是1/8。這個函數(shù)在需要生成指定長度的隨機二進制數(shù)字(或者說比特串)時非常有用。4.8精選案例??例4-10猜拳游戲設(shè)計。在這個經(jīng)典的游戲中,玩家需要與電腦隨機生成的選擇進行比賽。玩家可以選擇“石頭”、“剪刀”或“布”,然后與電腦的選擇進行比較,根據(jù)規(guī)則判斷勝負。程序分析:首先生成電腦的選擇:使用random庫生成“石頭”、“剪刀”、“布”三者中的一個。接下來獲取用戶的輸入,用戶需要輸入“石頭”、“剪刀”、“布”中的一個。然后比較和判斷勝負:根據(jù)游戲規(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函數(shù)來隨機生成電腦的選擇。但是,在實際操作中,往往會出現(xiàn)用戶輸入出現(xiàn)失誤的情況,此時,程序就會直接崩潰,為了解決這個問題,我們可以在程序中加入異常處理部分,提高程序的健壯性。??完整程序如下:importrandomwhileTrue:try:#獲取玩家選擇
player_choice=input("請輸入你的選擇(石頭/剪刀/布):")#如果玩家輸入不在選項內(nèi),則提示用戶并跳過此次循環(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))本章小結(jié)本章講解了程序的三種控制結(jié)構(gòu),具體講解了分支結(jié)構(gòu)的三種類型:單分支結(jié)構(gòu)、二分支結(jié)構(gòu)合多分支結(jié)構(gòu),以及判斷條件的組合。進一步具體講解了循環(huán)結(jié)構(gòu)的兩種類型:遍歷循環(huán)和無限循環(huán),以及循環(huán)控制符break和continue。最后,講解了程序的基本異常處理方法和random函數(shù)的使用。通過精選的實例幫助讀者理解程序結(jié)構(gòu)和異常處理的運用。5.1函數(shù)的基本用法
5.2函數(shù)的參數(shù)傳遞
5.3函數(shù)的遞歸調(diào)用
5.4變量的作用域
5.5精選案例第5章函數(shù)考綱考點
函數(shù)的定義和使用
函數(shù)的參數(shù)傳遞:可選參數(shù)傳遞、參數(shù)名稱傳遞、函數(shù)的返回值
變量的作用域:局部變量和全局變量知識導圖5.1函數(shù)的基本用法函數(shù)是一段具有特定功能的、可重用的語句組,通過函數(shù)名來表示和調(diào)用。經(jīng)過定義,一組語句等價于一個函數(shù),在需要使用這組語句的地方,直接調(diào)用函數(shù)名稱即可。因此,函數(shù)的使用包括兩部分:函數(shù)的定義和函數(shù)的調(diào)用。??5.1.1函數(shù)的定義在Python中,定義一個函數(shù)使用def保留字,函數(shù)定義包括兩部分:函數(shù)名和函數(shù)體,函數(shù)名用于標識函數(shù),函數(shù)體中則包含了實現(xiàn)特定功能的代碼塊。語法形式如下:def<函數(shù)名>(<形參列表>):<函數(shù)體>return<返回值列表>函數(shù)名:用于唯一標識這個函數(shù),符合標識符的命名規(guī)則。形參列表:代表了函數(shù)的輸入值,在函數(shù)內(nèi)部進行計算和操作,是在函數(shù)定義時聲明的參數(shù),可以有零個、一個或多個,多個參數(shù)由逗號分隔,當沒有參數(shù)時也要保留圓括號。形式參數(shù)不需要聲明類型,也不需要指定函數(shù)返回值類型。函數(shù)體:是函數(shù)每次被調(diào)用時執(zhí)行的代碼,由一行或多行語句組成。??例如,一個乘法函數(shù),示例代碼如下:defmultiply_numbers(a,b):returna*b說明:multiply_numbers是一個乘法函數(shù),它接受兩個參數(shù)a和b,然后使用“*”運算符計算這兩個數(shù)字的乘積,并返回結(jié)果。由于需要返回值,所以要使用return和返回值列表。函數(shù)也可以沒有返回值,沒有返回值的函數(shù),僅表示執(zhí)行了函數(shù)體部分的代碼功能。??例如,問候函數(shù),示例代碼如下:defmultiply_numbers(a,b):returna*b說明:該函數(shù)沒有返回值,僅在調(diào)用時執(zhí)行語句“print("Hello,{}!".format(name))”。當一個函數(shù)被定義后,它僅僅只是一段存在于代碼中的靜態(tài)代碼塊。它不會自行執(zhí)行,也不會對程序產(chǎn)生任何影響。只有當函數(shù)被調(diào)用時,它才會被激活,并執(zhí)行其中的代碼。調(diào)用函數(shù)可以理解為給函數(shù)發(fā)出一個執(zhí)行的命令,使其從靜態(tài)變?yōu)閯討B(tài)。??5.1.2函數(shù)的調(diào)用調(diào)用函數(shù)的基本語法格式如下:<函數(shù)名>(<實參列表>)例如,對乘法函數(shù)的完整調(diào)用過程,示例代碼如下:defmultiply_numbers(a,b):#乘法函數(shù)的定義
returna*bprint(multiply_numbers(3,5))#乘法函數(shù)的調(diào)用說明:一般而言實參列表必須與形參列表一一對應??函數(shù)是從“print(multiply_numbers(3,5))”語句開始被調(diào)用,最后執(zhí)行完函數(shù)內(nèi)容后,也是回到了“print(multiply_numbers(3,5))”語句調(diào)用的位置;函數(shù)中有兩個形參a,b,調(diào)用函數(shù)的print()語句也有兩個實參3,5;完整的程序中,函數(shù)要先定義好才能被調(diào)用,所以通常情況下函數(shù)定義放在程序的開始部分,或者至少在函數(shù)調(diào)用之前。??5.1.3函數(shù)的返回值函數(shù)通過return語句來返回值,可以返回任何類型的值,包括整數(shù)、浮點數(shù)、字符串、列表、字典等,函數(shù)也可以返回多個值,實際上是通過返回一個元組來實現(xiàn)的。示例代碼如下:>>>defexap(x,y,z): returnx*y+z>>>s=exap(3,5,7)>>>print(s)22說明:理解函數(shù)如何通過return語句返回計算結(jié)果,并且這個返回值可以被賦值給其他變量或用于其他計算。??如何在Python中定義一個返回多個值的函數(shù),并如何調(diào)用這樣的函數(shù)來獲取這些返回值。函數(shù)可以返回元組,這個元組可以包含任意數(shù)量的元素,每個元素都是函數(shù)內(nèi)部計算的一個結(jié)果。>>>defexap(x,y,z): returnx*y+z,x+y+z,x*y%z>>>print(exap(3,5,7))(22,15,1)??return語句可以將結(jié)果返回給調(diào)用者,但只要return語句被執(zhí)行,函數(shù)的執(zhí)行將立即結(jié)束,無論是否有其余的代碼。示例代碼如下:defexample_func():print("Beforereturnstatement")return"Hello"print("Afterreturnstatement")#這行代碼將不會被執(zhí)行print(example_func())其運行結(jié)果為:BeforereturnstatementHello??如果函數(shù)中沒有return語句,或者return后面沒有跟任何值,那么該函數(shù)將返回None,示例代碼如下:defno_return():x=3print(no_return())其運行結(jié)果為:None??函數(shù)的返回值可以被賦值給一個變量,或者用于其他計算,初學者往往把在函數(shù)內(nèi)部使用print()函數(shù)進行輸出視為返回值,請務必區(qū)分清楚,返回值是需要明確使用return語句的。??5.1.4lambda函數(shù)在python中,有時候我們可能只需要一個簡單的函數(shù),只使用一次,并不需要給它起個名字。lambda函數(shù)的語法通常使用關(guān)鍵字"lambda"來表示。它后面緊跟著參數(shù)列表,然后是一個冒號和一個表達式,表示函數(shù)的返回值,其語法格式如下:<函數(shù)名>=lambda<參數(shù)>:<表達式>這種格式等價于:def<函數(shù)名>(<參數(shù)>):return<表達式>??lambda函數(shù)可以接受任意數(shù)量的參數(shù),但只能返回一個表達式的值。例如,計算兩個數(shù)的和。示例代碼如下:>>>f=lambdax,y:x+y>>>f(7,8)15說明:一般而言建議謹慎使用lambda函數(shù),lambda函數(shù)主要用作一些特定函數(shù)或方法的參數(shù),它有一些固定使用方式,建議逐步掌握。一般情況,建議初學者使用def定義的普通函數(shù)。??5.1.5pass語句pass語句在Python中表示一個空操作,即它不執(zhí)行任何實際的操作或產(chǎn)生任何效果。它只是一個占位符,用于在語法上需要一個語句,但實際上不需要執(zhí)行任何操作時使用。pass語句的語法非常簡單,只需要使用關(guān)鍵字pass即可。它沒有任何參數(shù)或額外的語法要求。示例代碼如下:defmy_function():pass說明:函數(shù)my_function()什么都不做,調(diào)用它不會有任何效果。??pass語句的主要作用是保持程序結(jié)構(gòu)的完整性。在編寫代碼時,有時我們可能需要定義一個函數(shù)或類的結(jié)構(gòu),但暫時還沒有實現(xiàn)具體的功能。這時,我們可以使用pass語句作為一個臨時的占位符,以確保程序的語法正確性。稍后,我們可以再來填充具體的實現(xiàn)代碼。需要注意的是,pass語句只是一個臨時的占位符,不應該被用于實際的程序邏輯中。一旦程序的功能實現(xiàn)完成,應該及時替換掉pass語句,以確保程序的完整性和可讀性。5.2函數(shù)的參數(shù)傳遞??函數(shù)的參數(shù)傳遞是函數(shù)中數(shù)據(jù)交互的核心機制之一,理解并掌握參數(shù)傳遞的概念,將使我們能夠編寫出更加準確、高效且符合預期的代碼。函數(shù)的參數(shù)傳遞是通過形參和實參的交互實現(xiàn)的。??5.2.1形參和實參形式參數(shù),簡稱“形參”,是在定義函數(shù)時使用的,形式參數(shù)的命名只要符合“標識符”命名規(guī)則即可。調(diào)用函數(shù)時傳遞的參數(shù)稱為“實際參數(shù)”,簡稱“實參”。當函數(shù)定義和調(diào)用時,無論有沒有參數(shù),一對括號必須有。定義函數(shù)時不需要聲明形式參數(shù)類型,解釋器會根據(jù)實參的類型自動推斷形參類型。??例如,比較大小,找較大值。示例代碼如下:defprintMax(a,b):ifa>b:print(a,"較大值")else:print(b,"較大值")printMax(10,20)??在Python中,參數(shù)傳遞是通過對象引用來進行的,當向函數(shù)傳遞參數(shù)時,實際上是傳遞了對象的引用。如果在函數(shù)內(nèi)部修改了對象的值,這個修改會對外部參數(shù)造成影響嗎?這需要分成兩種情況來討論。??當傳遞一個列表或字典這樣的可變對象時,函數(shù)內(nèi)部對變量的修改會影響到函數(shù)外部的原始對象可變對象參數(shù)傳遞b=[10,20]print("b的初始引用為:",id(b))deff2(m):print("m的初始引用為:",id(m))m.append(30)print("m運算后的引用:",id(m))f2(b)#調(diào)用f2,實參為bprint("調(diào)用結(jié)束后b的引用為:",id(b))print("調(diào)用結(jié)束后b的值為:",b)print("調(diào)用結(jié)束后m的值為:",m)其運行結(jié)果為:b的初始引用為:2361275969416m的初始引用為:2361275969416m運算后的引用:2361275969416調(diào)用結(jié)束后b的引用為:2361275969416調(diào)用結(jié)束后b的值為:[10,20,30]Traceback(mostrecentcalllast):File"D:/可變對象.py",line10,in<module>print("調(diào)用結(jié)束后m的值為:",m)NameError:name'm'isnotdefined??對于不可變類型的參數(shù),如整數(shù)、浮點數(shù)和字符串,在函數(shù)內(nèi)部直接修改形參的值不會影響實參。不可變對象參數(shù)傳遞b=3print("b的初始引用為:",id(b))defadd1(a):print("a的初始引用為:",id(a))a+=1print("運算后a的引用為:",id(a))print("運算后a的值為:",a)add1(b)#調(diào)用add1()函數(shù),實參為bprint("調(diào)用結(jié)束后b的引用為:",id(b))print("調(diào)用結(jié)束后b的值為:",b)print("調(diào)用結(jié)束后a的值為:",a)其運行結(jié)果為:b的初始引用為:1985553168a的初始引用為:1985553168運算后a的引用為:1985553200運算后a的值為:4調(diào)用結(jié)束后b的引用為:1985553168調(diào)用結(jié)束后b的值為:3Traceback(mostrecentcalllast):File"D:/不可變對象.py",line11,in<module>print("調(diào)用結(jié)束后a的值為:",a)NameError:name'a'isnotdefined??python采用的是基于值的自動內(nèi)在管理模式,變量并不直接存儲值,而是存儲值的引用。從此角度而言,在python語言中,函數(shù)不存在傳值調(diào)用。??5.2.2位置參數(shù)傳遞在python中,位置參數(shù)傳遞是一種基本的傳遞方式。它要求當函數(shù)被調(diào)用時,實參和形參的順序必須嚴格一致,并且實參和形參的數(shù)量必須相同。>>>defadd(a,b,c):#所有形參都是位置參數(shù)
print(a,b,c) returna+b+c>>>add(2,3,4)#調(diào)用add(),實參分別為2,3,42349>>>add(2,4,3)2439>>>add(1,2,3,4)#實參與形參數(shù)量不同,出錯Traceback(mostrecentcalllast):File"<pyshell#27>",line1,in<module>add(1,2,3,4)TypeError:add()takes3positionalargumentsbut4weregiven??5.2.3可選參數(shù)傳遞可選參數(shù)的傳遞是一種靈活且方便的函數(shù)調(diào)用機制。在調(diào)用函數(shù)時是否為默認參數(shù)傳遞實參是可選的,具有較大的靈活性??蛇x參數(shù)是在函數(shù)定義的時候設(shè)定的,當函數(shù)被調(diào)用時,如果沒有傳入對應的參數(shù)值,就會使用函數(shù)定義時的可選參數(shù)的默認值替代,函數(shù)定義時的語法格式如下:def<函數(shù)名>(<必選參數(shù)列表>,<可選參數(shù)>=<默認值>):<函數(shù)體>return<返回值列表>??可選參數(shù)一般都放置在必選參數(shù)的后面,即定義函數(shù)時,先給出所有必選參數(shù),然后再分別列出每個可選參數(shù)及對應的默認值,否則會提示語法錯誤。>>>defgreet(name,prefix="Hello,"): print(prefix+name)>>>greet("Mike")Hello,Mike>>>greet("Jone",prefix="Hi,")Hi,Jone??5.2.4參數(shù)名稱傳遞參數(shù)名稱的傳遞通常指的是在函數(shù)調(diào)用時,通過指定參數(shù)的名稱來傳遞對應的值,其語法格式如下:<函數(shù)名>(<參數(shù)名>=<實際值>)示例代碼如下:>>>defgreet(name,prefix="Hello,"): print(prefix+name)>>>greet(name="Mike")Hello,Mike>>>greet(prefix="Hi,",name="Mike")Hi,Mike??5.2.5可變長度參數(shù)的傳遞可變長度參數(shù)的傳遞指的是在函數(shù)調(diào)用時,可以傳遞不定數(shù)量的參數(shù)。Python提供了兩種形式*args和**kwargs,這兩種形式是在函數(shù)定義時使用的,使用這兩種形式就意味著允許函數(shù)接收不確定數(shù)量的實際參數(shù),并在函數(shù)體內(nèi)部訪問這些參數(shù)。??
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版汽車融資租賃合同示范文本(含電子簽約)3篇
- 2025年度馬戲團專業(yè)演出設(shè)備租賃合同3篇
- 二零二五年度地熱資源打井開發(fā)與利用合同3篇
- 二零二五版模具行業(yè)財務顧問服務合同4篇
- 2025年度城市綠化工程苗木及配套設(shè)施采購年度合同3篇
- 二零二五年度民間借款合同(含金融消費者權(quán)益保護)
- 二零二五年度電子信息技術(shù)ICP證年審服務合同4篇
- 2025年保險科技的市場潛力
- 2025年度綠色農(nóng)業(yè)貸款合同4篇
- 課題申報參考:美對華VC脫鉤對中國企業(yè)關(guān)鍵核心技術(shù)突破的沖擊及間接掛鉤策略研究-共同所有權(quán)視角
- 暴發(fā)性心肌炎查房
- 口腔醫(yī)學中的人工智能應用培訓課件
- 工程質(zhì)保金返還審批單
- 【可行性報告】2023年電動自行車項目可行性研究分析報告
- 五月天歌詞全集
- 商品退換貨申請表模板
- 實習單位鑒定表(模板)
- 機械制造技術(shù)-成都工業(yè)學院中國大學mooc課后章節(jié)答案期末考試題庫2023年
- 數(shù)字媒體應用技術(shù)專業(yè)調(diào)研方案
- 2023年常州市新課結(jié)束考試九年級數(shù)學試卷(含答案)
- 正常分娩 分娩機制 助產(chǎn)學課件
評論
0/150
提交評論