版權(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]):
'gotit!' found=
True
else:x=x[1:]if
notfound:
'notfound!!!'whilex:
ifmatch(x[0]):
'gotit!'
breakx=x[1:]else:
'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
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度集合大合集人員管理篇
- 單位管理制度匯編大合集人力資源管理
- 《家具導(dǎo)購(gòu)圣經(jīng)》課件
- 單位管理制度分享匯編職員管理篇十篇
- 單位管理制度分享大全職工管理十篇
- 2024教科室工作計(jì)劃
- 單位管理制度呈現(xiàn)合集職工管理篇十篇
- 《投資管理復(fù)習(xí)》課件
- 《市場(chǎng)考察報(bào)告》課件
- 《廣告效果的測(cè)定》課件
- 電氣領(lǐng)域知識(shí)培訓(xùn)課件
- 金融產(chǎn)品分類介紹
- 2024-2025學(xué)年上學(xué)期深圳初中語(yǔ)文七年級(jí)期末模擬卷2
- 河南省鄭州市2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期期末考試試題含解析
- BOSS GT-6效果處理器中文說(shuō)明書
- 2024廣東煙草專賣局校園招聘筆試管理單位遴選500模擬題附帶答案詳解
- 2024房地產(chǎn)合同更名申請(qǐng)表
- 病例報(bào)告表(樣板)
- 定金協(xié)議書范文范本簡(jiǎn)單一點(diǎn)
- 劉潤(rùn)年度演講2024
- 初三第一學(xué)期沖刺中考期末家長(zhǎng)會(huì)
評(píng)論
0/150
提交評(píng)論