《Python程序設(shè)計(jì)》課件第3章-選擇與循環(huán)_第1頁(yè)
《Python程序設(shè)計(jì)》課件第3章-選擇與循環(huán)_第2頁(yè)
《Python程序設(shè)計(jì)》課件第3章-選擇與循環(huán)_第3頁(yè)
《Python程序設(shè)計(jì)》課件第3章-選擇與循環(huán)_第4頁(yè)
《Python程序設(shè)計(jì)》課件第3章-選擇與循環(huán)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章選擇與循環(huán)條件表達(dá)式選擇和循環(huán)語(yǔ)句的執(zhí)行離不開對(duì)條件的判斷條件表達(dá)式算術(shù)運(yùn)算符:+、-、*、/、//、%、**關(guān)系運(yùn)算符:>、<、==、<=、>=、!=,可以連續(xù)使用:測(cè)試運(yùn)算符:in、notin、is、isnot邏輯運(yùn)算符:and、or、not,注意短路求值位運(yùn)算符:~、&、|、^、<<、>>不要再使用

“不等于”運(yùn)算符<>Python2支持<>運(yùn)算符,表示不等于,相當(dāng)于!=而Python3不再支持<>,只有!=運(yùn)算符“==”vs.運(yùn)算符“is”“==”測(cè)試值的相等性。Python運(yùn)行相等測(cè)試,遞歸地比較所有內(nèi)嵌對(duì)象“is”測(cè)試對(duì)象的一致性。Python測(cè)試二者是否是同一對(duì)象(即是否在同一內(nèi)存地址中)運(yùn)算符“==”vs.運(yùn)算符“is”但是,由于Python內(nèi)部“緩存復(fù)用”小的整數(shù)和字符串以期提高性能,當(dāng)對(duì)象是“短”字符串時(shí):這是因?yàn)樵赑ython內(nèi)部,暫時(shí)存儲(chǔ)并重復(fù)使用短字符串以優(yōu)化性能。實(shí)際上內(nèi)存里只有一個(gè)字符串“spam”供變量a和變量b分享當(dāng)使用長(zhǎng)一些的字符串時(shí),情況就符合預(yù)期:題外話:integercache注意觀察右圖。這是由于Python內(nèi)部緩存部分小值整數(shù)(-5至256范圍內(nèi)),而對(duì)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(比如內(nèi)置的列表、元組,以及用戶定義的類),都沒(méi)有這種緩存機(jī)制。==測(cè)試值的相等性,is運(yùn)算符測(cè)試內(nèi)存中對(duì)象的一致性,所以有右圖中的結(jié)果具體請(qǐng)見:/questions/15171695/whats-with-the-integer-cache-inside-pythonTruevs.False在Python中,與大多數(shù)程序設(shè)計(jì)語(yǔ)言一樣,整數(shù)0代表假(False),整數(shù)1代表真(True)除此之外,Python也把任意的空數(shù)據(jù)結(jié)構(gòu)視為假,把任意非空的數(shù)據(jù)結(jié)構(gòu)視為真在選擇和循環(huán)結(jié)構(gòu)中,條件表達(dá)式的值只要不是False、0(或0.0、0j等)、None、空列表、空元組、空集合、空字典、空字符串、空range對(duì)象或其他空迭代對(duì)象,Python解釋器均認(rèn)為與True等價(jià)從這個(gè)意義上來(lái)講,幾乎所有的Python合法表達(dá)式都可以作為條件表達(dá)式,包括含有函數(shù)調(diào)用的表達(dá)式條件表達(dá)式>>>if3:#使用整數(shù)作為條件表達(dá)式print55>>>a=[1,2,3]>>>ifa:#使用列表作為條件表達(dá)式printa [1,2,3]>>>a=[]>>>ifa:printaelse:print'empty'empty短路求值比較特殊的運(yùn)算符還有邏輯運(yùn)算符and和or,這兩個(gè)運(yùn)算符具有短路求值或惰性求值的特點(diǎn),即只計(jì)算必須計(jì)算的表達(dá)式的值以and為例,對(duì)于表達(dá)式“表達(dá)式1and表達(dá)式2”而言,如果“表達(dá)式1”的值為False或其他等價(jià)值,不論“表達(dá)式2”的值是什么,整個(gè)表達(dá)式的值都是False,此時(shí)“表達(dá)式2”的值無(wú)論是什么都不影響整個(gè)表達(dá)式的值,因此將不會(huì)被計(jì)算,從而減少不必要的計(jì)算和判斷在設(shè)計(jì)條件表達(dá)式時(shí),當(dāng)表示復(fù)雜條件時(shí)如果能夠巧妙利用邏輯運(yùn)算符and和or的短路求值特性,可以提高程序的運(yùn)行效率,減少不必要的計(jì)算與判斷選擇結(jié)構(gòu)選擇結(jié)構(gòu)通過(guò)判斷某些特定條件是否滿足來(lái)決定下一步的執(zhí)行流程單分支選擇結(jié)構(gòu)雙分支選擇結(jié)構(gòu)多分枝選擇結(jié)構(gòu)嵌套的選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu)iftest:statement雙分支選擇結(jié)構(gòu)iftest:statement1else:statement2多分支選擇結(jié)構(gòu)iftest1:statement1eliftest2:statement2eliftest3:statement3else:statement4嵌套的選擇結(jié)構(gòu)iftest1:statement1

iftest2: statement2

else: statement3eliftest4:statement4else:statement5雙分支選擇結(jié)構(gòu)的特殊寫法Python還支持如下形式的表達(dá)式:當(dāng)條件表達(dá)式test的值與True等價(jià)時(shí),表達(dá)式的值為statement1,否則表達(dá)式的值為statement2statement1iftestelsestatement2Python沒(méi)有switch語(yǔ)句下面的代碼演示了利用多分支選擇結(jié)構(gòu)將成績(jī)從百分制變換到等級(jí)制/questions/46701063/why-doesnt-python-have-switch-casedef

score_to_grade(score):

ifscore>

100:

return

'Invalidscore.score>100'

elifscore>=

90:

return

'A'

elifscore>=

80:

return

'B'

elifscore>=

70:

return

'C'

elifscore>=

60:

return

'D'

elifscore>=

0:

return

'E'

else:

return

'Invalidscore.score<0'while循環(huán)與for循環(huán)Python提供了兩種基本的循環(huán)結(jié)構(gòu)語(yǔ)句——while語(yǔ)句、for語(yǔ)句while循環(huán)一般用于循環(huán)次數(shù)難以提前確定的情況,當(dāng)然它也可以用于循環(huán)次數(shù)確定的情況for循環(huán)一般用于循環(huán)次數(shù)可以提前確定的情況,尤其是用于枚舉序列或迭代對(duì)象中的元素相同或不同的循環(huán)結(jié)構(gòu)之間都可以互相嵌套,實(shí)現(xiàn)更為復(fù)雜的邏輯while循環(huán)whiletest:statementwhile循環(huán)whiletest:statement1else:statement2while循環(huán)在Python中,while循環(huán)和for循環(huán)都可以帶else塊如果循環(huán)因?yàn)闂l件表達(dá)式不成立而自然結(jié)束(不是因?yàn)閳?zhí)行了break語(yǔ)句而結(jié)束),則執(zhí)行else結(jié)構(gòu)中的語(yǔ)句如果循環(huán)是因?yàn)閳?zhí)行了break語(yǔ)句而導(dǎo)致循環(huán)提前結(jié)束,則不執(zhí)行else中的語(yǔ)句whiletest1:statement1

iftest2:

break

#Exitloopnow,skip"else"below

iftest3:

continue

#Gototopofloopnow,totest1statement2else:statement3#Runifwedidn'thita"break"while循環(huán)和for循環(huán)的else塊只有當(dāng)循環(huán)正常離開時(shí)才會(huì)被執(zhí)行。換句話說(shuō),只有在至始至終沒(méi)有觸發(fā)break語(yǔ)句的情況下才會(huì)被執(zhí)行while循環(huán)要else有何用?else分句讓你捕捉循環(huán)的“另一條”出路,而不需要設(shè)定和檢查標(biāo)志位(flag)假設(shè)你要寫一個(gè)循環(huán)用于搜索列表的值,而且需要知道在離開循環(huán)后該值是否已經(jīng)被找到found=

Falsewhilexand

notfound:

ifmatch(x[0]):

print

'gotit!' found=

True

else:x=x[1:]if

notfound:

print

'notfound!!!'whilex:

ifmatch(x[0]):

print

'gotit!'

breakx=x[1:]else:

print

'notfound!!!'循環(huán)結(jié)構(gòu)的優(yōu)化為了優(yōu)化程序以獲得更高的效率和運(yùn)行速度,在編寫循環(huán)語(yǔ)句時(shí),應(yīng)盡量減少循環(huán)內(nèi)部不必要的計(jì)算,將與循環(huán)變量無(wú)關(guān)的代碼盡可能地提取到循環(huán)之外對(duì)于使用多重循環(huán)嵌套的情況,應(yīng)盡量減少內(nèi)層循環(huán)中不必要的計(jì)算,盡可能地向外提break和continue語(yǔ)句break語(yǔ)句在while循環(huán)和for循環(huán)中都可以使用一旦break語(yǔ)句被執(zhí)行,將使整個(gè)循環(huán)提前結(jié)束continue語(yǔ)句的作用是終止當(dāng)前循環(huán),并忽略continue之后的語(yǔ)句,然后回到循環(huán)的頂端,提前進(jìn)入下一次循環(huán)pass語(yǔ)句什么事也不做,只是起占位作用break和continue語(yǔ)句下面的代碼用來(lái)計(jì)算小于100的最大素?cái)?shù)(素?cái)?shù)是只能被1或者自己整除的自然數(shù)),請(qǐng)注意break語(yǔ)句和else子句的用法輸出:97forninrange(100,

1,

-1):

foriinrange(2,n):

ifn%i==

0:

break

else:

printn

breakbreak和continue語(yǔ)句刪除上面代碼中最后一個(gè)break語(yǔ)句,則可以用來(lái)輸出100以內(nèi)的所有素?cái)?shù)輸出:9789837973716761595347434137312923191713117532forninrange(100,

1,

-1):

foriinrange(2,n):

ifn%i==

0:

break

else:

printnbreak和continue語(yǔ)句編寫循環(huán)結(jié)構(gòu)代碼時(shí),需要警惕對(duì)continue語(yǔ)句執(zhí)行流程考慮不全面所產(chǎn)生的問(wèn)題例如,為了輸出10以內(nèi)的奇數(shù):左邊代碼的錯(cuò)誤是:一旦執(zhí)行continue語(yǔ)句,之后的“i+=1”將永遠(yuǎn)不再執(zhí)行,使得循環(huán)無(wú)法結(jié)束i=

1whilei<

10:

ifi%

2==0:

continue

print

ii+=1i=

0whilei<

10:i+=1

ifi%

2

==

0:

continue

printi番外:再談“引用”和“拷貝”正如前面講到過(guò)的,賦值操作生成對(duì)象的引用,而不是這個(gè)對(duì)象的拷貝在實(shí)際應(yīng)用中,“引用”往往就是你想要的(因?yàn)檫@使你可以在程序范圍內(nèi)任意傳遞“大型對(duì)象”而不必付出“拷貝”帶來(lái)的額外性能開銷)不過(guò),因?yàn)橘x值操作會(huì)產(chǎn)生相同對(duì)象的多個(gè)引用,你要清楚地意識(shí)到在原處修改可變對(duì)象時(shí)可能會(huì)影響程序中其它地方對(duì)相同對(duì)象的其它引用。例如:如果你不想要“引用”…你就要明確告訴Python:我要對(duì)這個(gè)象進(jìn)行‘拷貝’!“拷貝”實(shí)際上復(fù)制了該對(duì)象,從而避免了對(duì)象共享如果你的確需要“拷貝”,明確的說(shuō)出來(lái):列表的沒(méi)有限制條件的分片表達(dá)式(L[:])能復(fù)制列表字典、集合對(duì)象的copy方法(X.copy())能復(fù)制字典、集合有些內(nèi)置函數(shù)(如list())能生成拷貝(list(L))copy標(biāo)準(zhǔn)庫(kù)模塊能夠進(jìn)行拷貝但是,列表的[:]操作及字典的copy()方法只能做頂層復(fù)制…如果你需要一個(gè)深層嵌套的數(shù)據(jù)結(jié)構(gòu)的完整的、完全獨(dú)立的拷貝,那么你需要使用copy標(biāo)準(zhǔn)庫(kù)模塊:importcopycopied_x=copy.deepcopy(original_x)上述語(yǔ)句能夠遞歸地遍歷對(duì)象original_x來(lái)復(fù)制其所有的組成部分copy—shallowanddeepcopyoperations/2/library/copy.html/3/library/copy.htmlAssignmentstatementsinPythondonotcopyobjects,theycreatebindingsbetweenatargetandanobject.Forcollectionsthataremutableorcontainmutableitems,acopyissometimesneededsoonecanchangeonecopywithoutchangingtheother.Thismoduleprovidesgenericshallowanddeepcopyoperations:copy.copy(x)Returnashallowcopyofx.copy.deepcopy(x)Returnadeepcopyofx.shallowcopyvs.deepcopyThedifferencebetweenshallowcopyanddeepcopyisonlyrelevantforcompoundobjects(objectsthatcontainotherobjects,likelistsorclassinstances):Ashallowcopyconstructsanewcompoundobjectandthen(totheextentpossible)insertsreferencesintoittotheobjectsfoundintheoriginal.Adeepcopyconstructsanewcompoundobjectandthen,recursively,insertscopiesinto

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論