




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5.1條件表達(dá)式算術(shù)運(yùn)算符:+、-、*、/、//、%、**關(guān)系運(yùn)算符:>、<、==、<=、>=、!=,可以連續(xù)使用,如>>>1<2<3True>>>1<2>3False>>>1<3>2True測(cè)試運(yùn)算符:in、notin、is、isnot邏輯運(yùn)算符:and、or、not,注意短路求值位運(yùn)算符:~、&、|、^、<<、>>矩陣乘法運(yùn)算符:@5.1條件表達(dá)式在選擇和循環(huán)結(jié)構(gòu)中,條件表達(dá)式的值只要不是False、0(或0.0、0j等)、空值None、空列表、空元組、空集合、空字典、空字符串、空range對(duì)象或其他空迭代對(duì)象,Python解釋器均認(rèn)為與True等價(jià)。從這個(gè)意義上來講,幾乎所有的Python合法表達(dá)式都可以作為條件表達(dá)式,包括含有函數(shù)調(diào)用的表達(dá)式。5.1條件表達(dá)式>>>if3:#使用整數(shù)作為條件表達(dá)式
print(5)5>>>a=[1,2,3]>>>ifa:#使用列表作為條件表達(dá)式
print(a) [1,2,3]>>>a=[]>>>ifa: print(a)else:print('empty')empty5.1條件表達(dá)式>>>i=s=0>>>whilei<=10:#使用關(guān)系表達(dá)式作為條件表達(dá)式
s+=ii+=1>>>print(s)55>>>i=s=0>>>whileTrue:#使用常量True作為條件表達(dá)式
s+=ii+=1ifi>10: break>>>print(s)55>>>s=0>>>foriinrange(0,11,1):#遍歷迭代對(duì)象中的所有元素s+=i>>>print(s)55邏輯運(yùn)算符and和or以及關(guān)系運(yùn)算符具有惰性求值特點(diǎn)LK2K1K1K2KLL(1)or,并聯(lián)電路(2)and,串聯(lián)電路(3)not,短路5.1條件表達(dá)式5.1條件表達(dá)式關(guān)系運(yùn)算符也具有短路求值或惰性求值的特點(diǎn),只計(jì)算必須計(jì)算的表達(dá)式的值。以“and”為例,對(duì)于表達(dá)式“表達(dá)式1and表達(dá)式2”而言,如果“表達(dá)式1”的值為“False”或其他等價(jià)值時(shí),不論“表達(dá)式2”的值是什么,整個(gè)表達(dá)式的值都是“False”,此時(shí)“表達(dá)式2”的值無論是什么都不影響整個(gè)表達(dá)式的值,因此將不會(huì)被計(jì)算,從而減少不必要的計(jì)算和判斷。5.1條件表達(dá)式在設(shè)計(jì)條件表達(dá)式時(shí),如果能夠大概預(yù)測(cè)不同條件失敗的概率,并將多個(gè)條件根據(jù)“and”和“or”運(yùn)算的短路求值特性來組織先后順序,可以大幅度提高程序運(yùn)行效率。>>>defJoin(chList,sep=None):
return(sepor',').join(chList)>>>chTest=['1','2','3','4','5']>>>Join(chTest)'1,2,3,4,5'>>>Join(chTest,':')'1:2:3:4:5'>>>Join(chTest,'')'12345'5.1條件表達(dá)式在Python中,條件表達(dá)式中不允許使用賦值運(yùn)算符“=”。>>>ifa=3:SyntaxError:invalidsyntax>>>if(a=3)and(b=4): SyntaxError:invalidsyntax5.2.1單分支選擇結(jié)構(gòu)if表達(dá)式:
語句塊x=input('Inputtwonumber:')a,b=map(int,x.split())ifa>b:a,b=b,a#序列解包,交換兩個(gè)變量的值print(a,b)5.2.2雙分支結(jié)構(gòu)if表達(dá)式:
語句塊1else:
語句塊2>>>chTest=['1','2','3','4','5']>>>ifchTest: print(chTest)else: print('Empty')['1','2','3','4','5']5.2.2雙分支結(jié)構(gòu)Python還支持如下形式的表達(dá)式:value1ifconditionelsevalue2當(dāng)條件表達(dá)式condition的值與True等價(jià)時(shí),表達(dá)式的值為value1,否則表達(dá)式的值為value2。另外,在value1和value2中還可以使用復(fù)雜表達(dá)式,包括函數(shù)調(diào)用和基本輸出語句。這個(gè)結(jié)構(gòu)的表達(dá)式也具有惰性求值的特點(diǎn)。>>>a=5>>>print(6)ifa>3elseprint(5)6>>>print(6ifa>3else5)6>>>b=6ifa>13else9>>>b95.2.2雙分支結(jié)構(gòu)#此時(shí)還沒有導(dǎo)入math模塊>>>x=math.sqrt(9)if5>3elserandom.randint(1,100)NameError:name'math'isnotdefined>>>importmath#此時(shí)還沒有導(dǎo)入random模塊,但由于條件表達(dá)式5>3的值為True,所以可以正常運(yùn)行>>>x=math.sqrt(9)if5>3elserandom.randint(1,100)#此時(shí)還沒有導(dǎo)入random模塊,由于條件表達(dá)式2>3的值為False,需要計(jì)算第二個(gè)表達(dá)式的值,因此出錯(cuò)>>>x=math.sqrt(9)if2>3elserandom.randint(1,100)NameError:name'random'isnotdefined>>>importrandom>>>x=math.sqrt(9)if2>3elserandom.randint(1,100)5.2.3多分支結(jié)構(gòu)if表達(dá)式1:
語句塊1elif表達(dá)式2:
語句塊2elif表達(dá)式3:
語句塊3else:
語句塊4其中,關(guān)鍵字elif是elseif的縮寫。5.2.3多分支結(jié)構(gòu)利用多分支選擇結(jié)構(gòu)將成績(jī)從百分制變換到等級(jí)制。deffunc(score): ifscore>100: return'wrongscore.must<=100.' elifscore>=90: return'A'elifscore>=80: return'B'elifscore>=70: return'C'elifscore>=60: return'D'elifscore>=0: return'E'else: return'wrongscore.must>0' 5.2.4選擇結(jié)構(gòu)的嵌套if表達(dá)式1:語句塊1if表達(dá)式2:語句塊2else:語句塊3else:if表達(dá)式4:語句塊4注意:縮進(jìn)必須要正確并且一致。5.2.4選擇結(jié)構(gòu)的嵌套使用嵌套的選擇結(jié)構(gòu)實(shí)現(xiàn)百分制成績(jī)到等級(jí)制的轉(zhuǎn)換。>>>deffunc(score): degree='DCBAAE' ifscore>100orscore<0:return'wrongscore.mustbetween0and100.'else:index=(score-60)//10ifindex>=0:returndegree[index]else: returndegree[-1]5.2.5構(gòu)建跳轉(zhuǎn)表實(shí)現(xiàn)多分支選擇結(jié)構(gòu)使用列表、元組或字典可以很容易構(gòu)建跳轉(zhuǎn)表,在某些場(chǎng)合下可以更快速地實(shí)現(xiàn)類似于多分支選擇結(jié)構(gòu)的功能。funcDict={'1':lambda:print('Youinput1'),
'2':lambda:print('Youinput2'),
'3':lambda:print('Youinput3')}x=input('Inputanintegertocalldifferentfunction:')func=funcDict.get(x,None)iffunc:
func()else:
print('Wronginteger.')5.2.5選擇結(jié)構(gòu)應(yīng)用例3-1:面試資格確認(rèn)。age=24subject="計(jì)算機(jī)"college="非重點(diǎn)"if(age>25andsubject=="電子信息工程")or\(college=="重點(diǎn)"andsubject=="電子信息工程")or\(age<=28andsubject=="計(jì)算機(jī)"):print("恭喜,你已獲得我公司的面試機(jī)會(huì)!")else:print("抱歉,你未達(dá)到面試要求")5.2.5選擇結(jié)構(gòu)應(yīng)用例3-2:用戶輸入若干個(gè)分?jǐn)?shù),求所有分?jǐn)?shù)的平均分。每輸入一個(gè)分?jǐn)?shù)后詢問是否繼續(xù)輸入下一個(gè)分?jǐn)?shù),回答“yes”就繼續(xù)輸入下一個(gè)分?jǐn)?shù),回答“no”就停止輸入分?jǐn)?shù)。5.2.5選擇結(jié)構(gòu)應(yīng)用numbers=[]#使用列表存放臨時(shí)數(shù)據(jù)whileTrue:x=input('請(qǐng)輸入一個(gè)成績(jī):')try:#異常處理結(jié)構(gòu)numbers.append(float(x))except:print('不是合法成績(jī)')whileTrue:flag=input('繼續(xù)輸入嗎?(yes/no)').lower()ifflagnotin('yes','no'):#限定用戶輸入內(nèi)容必須為yes或noprint('只能輸入yes或no')else:breakifflag=='no':breakprint(sum(numbers)/len(numbers))5.2.5選擇結(jié)構(gòu)應(yīng)用例3-3:編寫程序,判斷今天是今年的第幾天。importtimedate=time.localtime()#獲取當(dāng)前日期時(shí)間year,month,day=date[:3]day_month=[31,28,31,30,31,30,31,31,30,31,30,31]ifyear%400==0or(year%4==0andyear%100!=0):#判斷是否為閏年day_month[1]=29ifmonth==1:print(day)else:print(sum(day_month[:month-1])+day)5.2.5選擇結(jié)構(gòu)應(yīng)用其中閏年判斷可以直接使用calendar模塊的方法。>>>calendar.isleap(2016)True>>>calendar.isleap(2015)False5.2.5選擇結(jié)構(gòu)應(yīng)用或者使用下面的方法直接計(jì)算今天是今年的第幾天>>>datetime.date.today().timetuple().tm_yday208>>>datetime.date(2015,7,25).timetuple().tm_yday2065.2.5選擇結(jié)構(gòu)應(yīng)用也可以使用datetime模塊提供的功能來計(jì)算>>>today=datetime.date.today()>>>todaydatetime.date(2015,7,27)>>>firstDay=datetime.date(today.year,1,1)>>>firstDaydatetime.date(2015,1,1)>>>daysDelta=today-firstDay+datetime.timedelta(days=1)>>>daysDelta.days2085.2.5選擇結(jié)構(gòu)應(yīng)用datetime還提供了其他功能>>>now=datetime.datetime.now()>>>nowdatetime.datetime(2015,12,6,16,1,6,313898)>>>now.replace(second=30)#替換日期時(shí)間中的秒datetime.datetime(2015,12,6,16,1,30,313898)>>>now+datetime.timedelta(days=5)#計(jì)算5天后的日期時(shí)間datetime.datetime(2015,12,11,16,1,6,313898)>>>now+datetime.timedelta(weeks=-5)#計(jì)算5周前的日期時(shí)間datetime.datetime(2015,11,1,16,1,6,313898)計(jì)算兩個(gè)日期之間相差多少天。defdaysBetween(year1,month1,day1,year2,month2,day2):fromdatetimeimportdatedif=date(year1,month1,day1)dif=dif-date(year2,month2,day2)returndif.daysprint(daysBetween(2016,12,11,2016,11,27))print(daysBetween(2016,12,11,2011,11,27))5.2.5選擇結(jié)構(gòu)應(yīng)用5.3.1for循環(huán)與while循環(huán)Python提供了兩種基本的循環(huán)結(jié)構(gòu)語句——while和for。while循環(huán)一般用于循環(huán)次數(shù)難以提前確定的情況,也可以用于循環(huán)次數(shù)確定的情況。for循環(huán)一般用于循環(huán)次數(shù)可以提前確定的情況,尤其是用于枚舉序列或迭代對(duì)象中的元素。一般優(yōu)先考慮使用for循環(huán)。相同或不同的循環(huán)結(jié)構(gòu)之間都可以互相嵌套,實(shí)現(xiàn)更為復(fù)雜的邏輯。5.3.1for循環(huán)與while循環(huán)while條件表達(dá)式: 循環(huán)體[else:#如果循環(huán)是因?yàn)閎reak結(jié)束的,就不執(zhí)行else中的代碼 else子句代碼塊]for取值in序列或迭代對(duì)象: 循環(huán)體[else:else子句代碼塊]5.3.2循環(huán)結(jié)構(gòu)的優(yōu)化為了優(yōu)化程序以獲得更高的效率和運(yùn)行速度,在編寫循環(huán)語句時(shí),應(yīng)盡量減少循環(huán)內(nèi)部不必要的計(jì)算,將與循環(huán)變量無關(guān)的代碼盡可能地提取到循環(huán)之外。對(duì)于使用多重循環(huán)嵌套的情況,應(yīng)盡量減少內(nèi)層循環(huán)中不必要的計(jì)算,盡可能地向外提。5.3.2循環(huán)結(jié)構(gòu)的優(yōu)化優(yōu)化前的代碼:digits=(1,2,3,4)foriinrange(1000):result=[]foriindigits:forjindigits:forkindigits:result.append(i*100+j*10+k)5.3.2循環(huán)結(jié)構(gòu)的優(yōu)化優(yōu)化后的代碼:foriinrange(1000):result=[]foriindigits:i=i*100forjindigits:j=j*10forkindigits:result.append(i+j+k)5.3.2循環(huán)結(jié)構(gòu)的優(yōu)化在循環(huán)中應(yīng)盡量引用局部變量,因?yàn)榫植孔兞康牟樵兒驮L問速度比全局變量略塊。另外,在使用模塊中的方法時(shí),可以通過將其直接導(dǎo)入來減少查詢次數(shù)和提高運(yùn)行速度。importtimeimportmathstart=time.time()#獲取當(dāng)前時(shí)間foriinrange(10000000):math.sin(i)print('TimeUsed:',time.time()-start)#輸出所用時(shí)間loc_sin=math.sinstart=time.time()foriinrange(10000000):loc_sin(i)print('TimeUsed:',time.time()-start)5.4break和continue語句break語句在while循環(huán)和for循環(huán)中都可以使用,一般放在if選擇結(jié)構(gòu)中,一旦break語句被執(zhí)行,將使得整個(gè)循環(huán)提前結(jié)束。continue語句的作用是終止當(dāng)前循環(huán),并忽略continue之后的語句,然后回到循環(huán)的頂端,提前進(jìn)入下一次循環(huán)。除非break語句讓代碼更簡(jiǎn)單或更清晰,否則不要輕易使用。5.4break和continue語句下面的代碼用來計(jì)算小于100的最大素?cái)?shù),注意break語句和else子句的用法。>>>forninrange(100,1,-1):foriinrange(2,n): ifn%i==0: breakelse: print(n) break 975.4break和continue語句刪除上面代碼中最后一個(gè)break語句,則可以用來輸出100以內(nèi)的所有素?cái)?shù)。>>>forninrange(100,1,-1):foriinrange(2,n): ifn%i==0: breakelse: print(n,end='')97898379737167615953474341373129231917131175325.4break和continue語句警惕continue可能帶來的問題:>>>i=0>>>whilei<10: ifi%2==0: continue print(i) i+=1永不結(jié)束的死循環(huán),Ctrl+C強(qiáng)行終止。5.4break和continue語句這樣子就不會(huì)有問題>>>foriinrange(10): ifi%2==0: continue print(i,end='')135795.4break和continue語句>>>foriinrange(10): ifi%2==0: i+=1#沒有用呀?jīng)]有用 continue print(i,end='')135795.4break和continue語句每次進(jìn)入循環(huán)時(shí)的i已經(jīng)不再是上一次的i,所以修改其值并不會(huì)影響循環(huán)的執(zhí)行。>>>foriinrange(7): print(id(i),':',i)10416692:010416680:110416668:210416656:310416644:410416632:510416620:65.5案例精選例5-4:計(jì)算1+2+3+…+100的值。s=0foriinrange(1,101):s=s+iprint('1+2+3+…+100=',s)print('1+2+3+…+100=',sum(range(1,101)))5.5案例精選例5-5:輸出序列中的元素。a_list=['a','b','mpilgrim','z','example']fori,vinenumerate(a_list):print('列表的第',i+1,'個(gè)元素是:',v)5.5案例精選例5-6:求1~100之間能被7整除,但不能同時(shí)被5整除的所有整數(shù)。foriinrange(1,101): ifi%7==0andi%5!=0: print(i)5.5案例精選例5-7:輸出“水仙花數(shù)”。所謂水仙花數(shù)是指1個(gè)3位的十進(jìn)制數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如:153是水仙花數(shù),因?yàn)?53=13+53+33。#傳統(tǒng)套路foriinrange(100,1000):#這里是序列解包的用法bai,shi,ge=map(int,str(i))ifge**3+shi**3+bai**3==i:print(i)5.5案例精選#函數(shù)式編程fornuminrange(100,1000):r=map(lambdax:int(x)**3,str(num))ifsum(r)==num:print(num)5.5案例精選例5-8:求平均分。score=[70,90,78,85,97,94,65,80]s=0foriinscore: s+=iprint(s/len(score))print(sum(score)/len(score))#更建議直接這樣做5.5案例精選例5-9:打印九九乘法表。foriinrange(1,10):forjinrange(1,i+1):print('{0}*{1}={2}'.format(i,j,i*j).ljust(6),end='')print()5.5案例精選例5-10:求200以內(nèi)能被17整除的最大正整數(shù)。foriinrange(200,0,-1): ifi%17==0: print(i) break5.5案例精選例5-11:判斷一個(gè)數(shù)是否為素?cái)?shù)。importmathn=input('Inputaninteger:')n=int(n)m=math.ceil(math.sqrt(n)+1)foriinrange(2,m):ifn%i==0andi<n:print('No')breakelse:print('Yes')5.5案例精選例5-12:雞兔同籠問題。假設(shè)共有雞、兔30只,腳90只,求雞、兔各有多少只。forjiinrange(0,31):if2*ji+(30-ji)*4==90:print('ji:',ji,'tu:',30-ji)5.5案例精選另一種計(jì)算方法>>>defdemo(tui,jitu):tu=(tui-jitu*2)/2ifint(tu)==tu:return(int(tu),int(jitu-tu))else:return'DataError' >>>demo(90,30)(15,15)>>>demo(90,31)(14,17)>>>demo(91,30)'DataError'5.5案例精選例5-13:編寫程序,輸出由1、2、3、4這四個(gè)數(shù)字組成的每位數(shù)都不相同的所有三位數(shù)。digits=(1,2,3,4)foriindigits:forjindigits:forkindigits:ifi!=jandj!=kandi!=k:print(i*100+j*10+k)3.5案例精選從代碼優(yōu)化的角度來講,上面這段代碼并不是很好,其中有些判斷完全可以在外層循環(huán)來做,從而提高運(yùn)行效率。digits=(1,2,3,4)foriindigits:forjindigits:ifj==i:continueforkindigits:ifk==iork==j:continueprint(i*100+j*10+k)5.5案例精選當(dāng)然,還可以進(jìn)一步優(yōu)化。defdemo1(data,k=3):assertk==3,'kmustbe3'foriindata:ifi==0:continueii=i*100forjindata:ifj==i:continuejj=j*10forkindata:ifk!=iandk!=j:print(ii+jj+k)5.5案例精選使用集合實(shí)現(xiàn)同樣功能。defdemo2(data,k=3):data=set(data)foriindata:ifi==0:continueii=i*100forjindata-{i}:jj=j*10forkindata-{i,j}:print(ii+jj+k)5.5案例精選例5-14:編寫程序,生成一個(gè)含有20個(gè)隨機(jī)數(shù)的列表,要求所有元素不相同,并且每個(gè)元素的值介于1到100之間。importrandomx=[]whileTrue:iflen(x)==20:breakn=random.randint(1,100)ifnnotinx:x.append(n)print(x)print(len(x))print(sorted(x))5.5案例精選如果用集合來做,會(huì)更簡(jiǎn)單一些。fromrandomimportrandintx=set()whilelen(x)<20:x.add(randint(1,100))print(x)print(sorted(x))5.5案例精選例5-15編寫程序,計(jì)算組合數(shù)C(n,i),即從n個(gè)元素中任選i個(gè),有多少種選法。根據(jù)組合數(shù)定義,需要計(jì)算3個(gè)數(shù)的階乘,在很多編程語言中都很難直接使用整型變量表示大數(shù)的階乘結(jié)果,雖然Python并不存在這個(gè)問題,但是計(jì)算大數(shù)的階乘仍需要相當(dāng)多的時(shí)間。本例提供另一種計(jì)算方法:以Cni(8,3)為例,按定義式展開如下,對(duì)于(5,8]區(qū)間的數(shù),分子上出現(xiàn)一次而分母上沒出現(xiàn);(3,5]區(qū)間的數(shù)在分子、分母上各出現(xiàn)一次;[1,3]區(qū)間的數(shù)分子上出現(xiàn)一次而分母上出現(xiàn)兩次。5.5案例精選defCni1(n,i):ifnot(isinstance(n,int)andisinstance(i,int)andn>=i):print('nandimustbeintegersandn>=i.')returnresult=1Min,Max=sorted((i,n-i))foriinrange(n,0,-1):ifi>Max:result*=ielifi<=Min:result/=ireturnresult下面的代碼與剛才的代碼相比,效率有提高嗎?defcni2(n,i):minNI=min(i,n-i)result=1forjinrange(0,minNI):result=result*(n-j)//(j+1)returnresult5.5案例精選下面的代碼有錯(cuò)誤嗎?defcni2(n,i):minNI=min(i,n-i)result=1forjinrange(0,minNI):result=result*(n-j)//(minNI-j)returnresult5.5案例精選3.5案例精選也可以使用math庫中的階乘函數(shù)直接按組合數(shù)定義實(shí)現(xiàn)。>>>defCni2(n,i):importmathreturnint(math.factorial(n)/math.factorial(i)/math.factorial(n-i))>>>Cni2(6,2)15還可以直接使用Python標(biāo)準(zhǔn)庫itertools提供的函數(shù)。>>>importitertools>>>len(tuple(binations(range(60),2)))17705.5案例精選itertools還提供了排列函數(shù)permutations()。>>>importitertools>>>foriteminitertools.permutations(range(1,4),2):print(item)
(1,2)(1,3)(2,1)(2,3)(3,1)(3,2)5.5案例精選itertools還提供了用于循環(huán)遍歷可迭代對(duì)象元素的函數(shù)cycle()。>>>importitertools>>>x='PrivateKey'>>>y=itertools.cycle(x)#循環(huán)遍歷序列中的元素>>>foriinrange(20):print(next(y),end=',') P,r,i,v,a,t,e,,K,e,y,P,r,i,v,a,t,e,,K,>>>foriinrange(5):print(next(y),end=',') e,y,P,r,i,5.5案例精選itertools還提供了根據(jù)一個(gè)序列的值對(duì)另一個(gè)序列進(jìn)行過濾的函數(shù)compress()。>>>x=range(1,20)>>>y=(1,0)*9+(1,)>>>y(1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1)>>>list(press(x,y))[1,3,5,7,9,11,13,15,17,19]5.5案例精選itertools還提供了根據(jù)函數(shù)返回值對(duì)序列進(jìn)行分組的函數(shù)groupby()。>>>defgroup(v):
ifv>10:
return'greaterthan10'
elifv<5:
return'lessthan5'
else:
return'between5and10'>>>x=range(20)>>>y=itertools.groupby(x,group)#根據(jù)函數(shù)返回值對(duì)序列元素進(jìn)行分組>>>fork,viny:
print(k,':',list(v))lessthan5:[0,1,2,3,4]between5and10:[5,6,7,8,9,10]greaterthan10:[11,12,13,14,15,16,17,18,19]5.5案例精選例5-16編寫程序,計(jì)算理財(cái)產(chǎn)品收益,假設(shè)收益和本金一起滾動(dòng)。deflicai(base,rate,days):#初始投資金額
result=base#整除,用來計(jì)算一年可以滾動(dòng)多少期
times=365//days
foriinrange(times):
result=result+result*rate/365*days
returnresult#14天理財(cái),利率0.0385,投資10萬print(licai(100000,0.0385,14))5.5案例精選例5-17編寫代碼實(shí)現(xiàn)冒泡法排序。fromrandomimportrandintdefbubbleSort(lst):length=len(lst)foriinrange(0,length):forjinrange(0,length-i-1):#比較相鄰兩個(gè)元素大小,并根據(jù)需要進(jìn)行交換iflst[j]>lst[j+1]:lst[j],lst[j+1]=lst[j+1],lst[j]lst=[randint(1,100)foriinrange(20)]print('Beforesorted:\n',lst)bubbleSort(lst)print('Aftersorted:\n',lst)5.5案例精選例5-18編寫代碼實(shí)現(xiàn)選擇法排序。defselectSort(lst,reverse=False):length=len(lst)foriinrange(0,length):m=i#假設(shè)剩余元素中第一個(gè)最小或最大forjinrange(i+1,length):#掃描剩余元素#如果有更小或更大的,就記錄下它的位置exp='lst[j]<lst[m]'ifreverse:exp='lst[j]>lst[m]'#內(nèi)置函數(shù)eval()用來對(duì)字符串進(jìn)行求值ifeval(exp):m=jifm!=i:#如果發(fā)現(xiàn)更小或更大的,就交換值lst[i],lst[m]=lst[m],lst[i]5.5案例精選例5-19二分法查找。二分法查找算法非常適合在大量元素中查找指定的元素,要求序列已經(jīng)排好序(這里假設(shè)按從小到大排序),首先測(cè)試中間位置上的元素是否為想查找的元素,如果是則結(jié)束算法;如果序列中間位置上的元素比要查找的元素小,則在序列的后面一半元素中繼續(xù)查找;如果中間位置上的元素比要查找的元素大,則在序列的前面一半元素中繼續(xù)查找。重復(fù)上面的過程,不斷地縮小搜索范圍,直到查找成功或者失敗(要查找的元素不在序列中)。5.5案例精選defbinarySearch(lst,value):start=0end=len(lst)whilestart<=end:#計(jì)算中間位置middle=(start+end)//2#查找成功,返回元素對(duì)應(yīng)的位置ifvalue==lst[middle]:returnmiddle#在后面一半元素中繼續(xù)查找elifvalue>lst[middle]:start=middle+1#在前面一半元素中繼續(xù)查找elifvalue<lst[middle]:end=middle-1#查找不成功,返回FalsereturnFalse5.5案例精選fromrandomimportrandintlst=[randint(1,50)foriinrange(20)]lst.sort()print(lst)result=binarySearch(lst,30)ifresult!=False:print('Success,itspositionis:',result)else:print('Fail.Notexist.')例5-20編寫程序,計(jì)算百錢買百雞問題。假設(shè)公雞5元一只,母雞3元一只,小雞1元三只,現(xiàn)在有100塊錢,想買100只雞,問有多少種買法?#假設(shè)能買x只公雞,x最大為20forxinrange(21):#假設(shè)能買y只母雞,y最大為33foryinrange(34):#假設(shè)能買z只小雞z=100-x-yifz%3==0and5*x+3*y+z//3==100:print(x,y,z)5.5案例精選例5-21編寫代碼,模擬決賽現(xiàn)場(chǎng)最終成績(jī)的計(jì)算過程。#這個(gè)循環(huán)用來保證必須輸入大于2的整數(shù)作為評(píng)委人數(shù)whileTrue:try:n=int(input('請(qǐng)輸入評(píng)委人數(shù):'))ifn<=2:print('評(píng)委人數(shù)太少,必須多于2個(gè)人。')else:#如果輸入大于2的整數(shù),就結(jié)束循環(huán)breakexcept:pass#用來保存所有評(píng)委的打分scores=[]5.5案例精選foriinrange(n):#這個(gè)while循環(huán)用來保證用戶必須輸入0到100之間的數(shù)字whileTrue:try:score=input('請(qǐng)輸入第{0}個(gè)評(píng)委的分?jǐn)?shù):'.format(i+1))#把字符串轉(zhuǎn)換為實(shí)數(shù)score=float(score)#用來保證輸入的數(shù)字在0到100之間assert0<=score<=100scores.append(score)#如果數(shù)據(jù)合法,跳出while循環(huán),繼續(xù)輸入下一個(gè)評(píng)委的得分breakexcept:print('分?jǐn)?shù)錯(cuò)誤')5.5案例精選#計(jì)算并刪除最高分與最低分highest=max(scores)lowest=min(scores)scores.remove(highest)scores.remove(lowest)#計(jì)算平均分,保留2位小數(shù)finalScore=round(sum(scores)/len(scores),2)formatter='去掉一個(gè)最高分{0}\n去掉一個(gè)最低分{1}\n最后得分{2}'print(formatter.format(highest,lowest,finalScore))5.5案例精選例5-22遞歸算法求解漢諾塔問題。據(jù)說古代有一個(gè)梵塔,塔內(nèi)有三個(gè)底座A、B、C,A座上有64個(gè)盤子,盤子大小不等,大的在下,小的在上。有一個(gè)和尚想把這64個(gè)盤子從A座移到C座,但每次只能允許移動(dòng)一個(gè)盤子。在移動(dòng)盤子的過程中可以利用B座,但任何時(shí)刻3個(gè)座上的盤子都必須始終保持大盤在下、小盤在上的順序。如果只有一個(gè)盤子,則不需要利用B座,直接將盤子從A移動(dòng)到C即可。和尚想知道這項(xiàng)任務(wù)的詳細(xì)移動(dòng)步驟和順序。根據(jù)數(shù)學(xué)知識(shí)我們可以知道,移動(dòng)n個(gè)盤子需要2^n-1步,64個(gè)盤子需要18446744073709551615步。如果每步需要一秒鐘的話,那么就需要584942417355.072年。5.5案例精選defhannoi(num,src,dst,temp=None):globaltimes#聲明用來記錄移動(dòng)次數(shù)的變量為全局變量asserttype(num)==int,'nummustbeinteger'#確認(rèn)參數(shù)類型和范圍assertnum>0,'nummust>0'ifnum==1:#只剩最后或只有一個(gè)盤子需要移動(dòng),這也是函數(shù)遞歸調(diào)用的結(jié)束條件print('The{0}Timesmove:{1}==>{2}'.format(times,src,dst))times+=1else:#遞歸調(diào)用函數(shù)自身,先把除最后一個(gè)盤子之外的所有盤子移動(dòng)到臨時(shí)柱子上hannoi(num-1,src,temp,dst)hannoi(1,src,dst)#把最后一個(gè)盤子直接移動(dòng)到目標(biāo)柱子上#把除最后一個(gè)盤子之外的其他盤子從臨時(shí)柱子上移動(dòng)到目標(biāo)柱子上hannoi(num-1,temp,dst,src)times=1#用來記錄移動(dòng)次數(shù)的變量hannoi(3,'A','C','B')#A表示最初放置盤子的柱子,C是目標(biāo)柱子,B是臨時(shí)柱子5.5案例精選例5-23遞歸算法計(jì)算組合數(shù)。defcni(n,i):ifn==iori==0:return1returncni(n-1,i)+cni(n-1,i-1)print(cni(5,5))5.5案例精選讓你的程序飛起來,提速上萬倍fromfunctoolsimportlru_cache@lru_cache(maxsize=64)defcni(n,i):ifn==iori==0:return1returncni(n-1,i)+cni(n-1,i-1)5.5案例精選例5-24編寫程序,輸出星號(hào)組成的菱形。defmain(n):foriinrange(n):print(('*'*i).center(n*3))foriinrange(n,0,-1):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三醫(yī)政策分析半年報(bào)2025(極簡(jiǎn)版)
- 營(yíng)運(yùn)電動(dòng)車過戶管理辦法
- 蓬萊艾山保護(hù)區(qū)管理辦法
- 銜接資金項(xiàng)目庫管理辦法
- 健康活動(dòng)不貪食冷飲課件
- 衢州公積金提前管理辦法
- 西安住校生封閉管理辦法
- 規(guī)范代收費(fèi)管理暫行辦法
- 設(shè)備液壓與潤(rùn)滑管理辦法
- 試驗(yàn)室授權(quán)資質(zhì)管理辦法
- 項(xiàng)目計(jì)劃管理培訓(xùn)
- 2026屆高三語文一輪復(fù)習(xí)教學(xué)計(jì)劃
- 給非財(cái)務(wù)人員的財(cái)務(wù)培訓(xùn)
- 公司攝影小組活動(dòng)方案
- 銀行 輿情培訓(xùn) 課件
- 小兒重癥專科進(jìn)修匯報(bào)
- 寧城職教中心實(shí)習(xí)實(shí)訓(xùn)基地項(xiàng)目可行性論證報(bào)告
- 公司家屬開放日活動(dòng)方案
- DB14-T 3403-2025 灌木林地造林技術(shù)規(guī)程
- 2025廣西中醫(yī)藥大學(xué)賽恩斯新醫(yī)藥學(xué)院教師招聘考試試題
- 密碼測(cè)評(píng)安全管理制度
評(píng)論
0/150
提交評(píng)論