資源簡介 專題8 Python程序語言基礎學習目標 1.掌握Python表達式運算符的優先級和常見內置函數的應用;2.掌握自定義函數的編寫和調用;3.掌握常見模塊的應用;4.掌握算法的三種控制結構.數據是程序運行的原料,Python的基本數據類型有整型、實型、字符串型和布爾型等,但相同類型的數據往往存儲在列表或字典中,列表是有序線性結構,可以通過索引去訪問每個元素的值,而字典是無序的,只能通過鍵去訪問其值。對數據的操作有多種運算符,內置的函數能快速地解決一些求和、平均值排序等常見的問題。算法有三種基本結構,選擇結構和循環結構可以看成是一個小小的模塊,由這些模塊組成了一個順序結構,這個結構就是一個大的算法。實現某個功能的語句可以寫在一個模塊內,這個模塊就是函數,只要傳給函數相應的參數,函數可以返回相應的計算結果。把多個相關的函數封裝在一個文件中,這個文件就是一個庫,就是一個模塊。(2024年1月浙江省選考)數組元素a[0]至a[n-1]依次存放著n個數據,現需要將元素a[n-1]插入在下標為x(0≤xtemp=a[n-1]for i in range(n-2,x-1,-1):a[x]=tempA.a[i+1]=a[i] B.a[i-1]=a[i]C.a[i]=a[i+1] D.a[i]=a[i-1]重難點1 算法控制結構算法=邏輯+控制,這是Pascal設計者Niklaus Wirth的一本著作的書名,它刻畫了過程式尤其是結構化編程的思想。控制指的是程序設計中順序、選擇和循環三種基本控制結構。分支結構分為單分支結構、雙分支結構和多分支結構,而分支結構的組合可以分為多個分支語句和分支的嵌套。多分支結構和多個分支語句的區別在于多分支結構只執行其中一條判斷條件,而多個分支語句依次執行每個分支結構語句。遍歷是算法最核心的思想,往往用循環結構來實現??梢园次恢帽闅v,如 for i in range(20);也可以按元素進行遍歷,如for i in [3,2,1,7]。用while語句往往實現滿足某個條件時的遍歷。例1 象限是平面直角坐標系(笛卡爾坐標系)中橫軸和縱軸所劃分的四個區域,每一個區域叫做一個象限。象限以原點為中心,x,y 軸為分界線,原點和坐標軸上的點不屬于任何象限。某同學根據輸入的坐標點(x,y)來判斷該坐標點的位置所在,以下實現該分類的 Python 程序段中正確的是( )A.if x==0 and y==0:result=″原點″if x==0 or y==0:result=″數軸″if x?。? and y?。?: result=″象限″B.if x==0 or y==0:result=″數軸″if x==0 and y==0:result=″原點″else:result=″象限″C.if x?。? and y?。?:result=″象限″if x==0 or y==0:result=″數軸″else:result=″原點″D.if x?。? and y?。?: result=″象限″if x==0 and y==0: result=″原點″if x==0 or y==0:result=″數軸″變式1 有如下 Python 程序段:a=[1,5,9,2,6,8,3,4,7]n=0 ;flag=Falseif a[0] flag=Truefor i in range(len(a)-1): if a[i] n+=1;flag=False elif a[i]>a[i+1] and flag==False: flag=Trueprint(n)執行上述程序段后,輸出的值為( )A.1 B.2 C.3 D.4例2 若字符串s的值為″abcde″,執行如下程序段后,變量res的值不可能是( )from random import randintres=″″i,j=0,len(s)-1while i=i:if randint(0,1) == 0: #randint(0,1)隨機生成 0 或 1 res+=s[i] i+=1else: res+=s[j] j-=1A.″abced″ B.″aecbd″C.″aedbc″ D.″edcba″變式2 有如下Python程序段:s=input(″輸入字符串:″)n=len(s)i,j=0,n-1result=″″while i=n∥2:if s[i]>s[j]: result+=s[i]; j-=1elif s[i] result+=s[j]; i+=1else: i+=1;j-=1print(result)執行該程序段,分別輸入下列選項中的字符串,輸出結果不為“555”的是( )A.″51234″ B.″12535″C.″54321″ D.″55123″重難點2 函數和模塊在算法的程序實現過程中,也經常根據具體問題的特點將其分解成若干個子問題或者借助所用程序設計語言的特性來完成問題的解決。Python主要運用函數、模塊等方式實現模塊化程序設計,為算法的程序實現帶來極大的便利。自定義函數相當于一個小的程序塊,函數的參數相當輸入的信息,函數的形參和實參必須一一對應,函數的返回值相當輸出信息。一個函數體內可以有多條return語句,當執行某條返回語句后,結束自定義函數運行,返回主程序。在Python中,把一組函數放到一個.py文件里,這個文件就稱為一個模塊。例1 多選題評分,評分標準:全部選對得2分,選對但不全的得1分,不選或有選錯的得0分。編制的自定義函數如下,其中x表示要判斷的答案,y表示標準答案。選對但不全的答案判定方法為:遍歷判斷的答案每一個選項,若該選項在標準答案中存在則進行計數count,否則直接退出遍歷。根據count的值與判斷答案的長度是否相等來決定是選對但不全。def df(x,y): #函數df(x,y)的功能是根據標準答案y,檢測答題的答案x應得的分數ans。if x==y: ①__________else: count=0 for i in x: if i in y: count+=1 else: ②__________ if ③________: ans=0else: ans=1return ansda=input(″請你輸入你的答案:″)bzda=″ACD″n=df(da,bzda)print(″該題得分為:″+str(n))變式1 有如下 Python 程序段:def half_s(s): n=len(s);result=″″ i,j=0,n-1 while i=n∥2: if s[i]>s[j]: result+=s[i];i+=1 elif s[i] result+=s[j];j-=1 else: i+=1;j-=1 return result執行語句v=half_s(″welcome″),變量v的值是( )A.″come″ B.″wmol″C.″www″ D.″emo″例2 有如下 Python 程序段:import randoma=[0]*6for i in range(6): x=int(random.random()*10)+1 if i%2==1: a[i]=2*x+1 elif x%2==0: a[i]=x∥2 else: a[i]=x-1print(a)執行該程序段后,列表 a 中的值可能是( )A.3,11,4,19,2,13 B.3,11,7,9,2,3C.9,3,1,23,4,17 D.3,3,9,0,19,8變式2 有Python程序如下:import randomn=7a=[0]*na[0]=random.randint(60,100)for i in range(1,n): a[i]=a[i-1]-random.randint(0,i)for i in range(1,n,2): a[i]=a[i]-a[i-1]%2print(a)執行上述程序后,輸出的數據可能為( )A.[67,65,64,64,61,61,54]B.[72,71,72,69,67,62,57]C.[83,81,81,77,75,73,69]D.[94,94,94,89,89,88,82]重難點1 算法控制結構1.為實現按表中分數段進行等級劃分,以下代碼正確的是( )分數 x x≥90 80≤x<90 x<80等級 level A B C2.有如下 Python 程序段:s = input(″請輸入一串字符串:″)f = Truefor i in range(len(s)∥2): if s[i] ?。?s[len(s)-i-1]: f = False breakprint(f)若執行該程序后, 輸出的結果是“True”,則輸入的字符串可能是( )A.″onion″ B.″hello″C.″278″ D.″111″3.有如下Pyhon程序段:a=[0]*101for i in range(1,101): for j in range(i,101): if j % i==0: a[j]+=1print(a[50])執行該程序段后,輸出列表元素a[50]的值為( )A.5 B.6 C.9 D.504.將有序數組 nums 中的重復項刪除,編寫的Python程序段如下:nums=1n=len(nums);i=1while i if nums[i] ?。絥ums[i-1]: k+=1 i+=1nums=nums[:k]上述程序段中方框處可選代碼為:①k=0 ②k=1③nums[k]=nums[i] ④nums[i-1]=nums[i],則(1)、(2)處代碼依次為( )A.①③ B.①④ C.②③ D.②④5.數組元素a[0]到a[2*n-1]為互不相等的正整數(n≥1),要在其中找到最大值和最小值,并分別存儲到變量max1和max2中。實現該功能的Python程序段如下:max1=0;max2=0for i in range(0,n*2,2): if a[i]>a[i+1]: t1=a[i];t2=a[i+1] else: t1=a[i+1];t2=a[i] if : max1=t1;max2=t2 elif: max2=max1;max1=t1 elif: max2=t1上述程序段中方框處可選代碼為:①t1>max1?、趖1>max2 ③t2>max1則(1)(2)(3)處語句依次為( )A.①②③ B.②③① C.③①② D.③②①6.有如下Python程序段:s1=input(″請輸入字符串:″)a=[0]*128for item in s1: ch=ord(item) a[ch]=a[ch]+1s2=″″for i in range(len(a)): for j in range(a[i]): s2=s2+chr(i)print(s2)列表a各元素的初始值都為0,s1中輸入的內容為″abs54int″。執行該程序后,程序輸出的結果中第5個字符為( )A.n B.s C.4 D.i7.有如下Python程序段:c,m=0,0for i in range(2,len(a)): if a[i-2]+a[i-1]==a[i]: c+=1 if c>m: m=c else: c=0若列表a=[2,1,3,4,5,9,14,23],執行該程序段后,變量m的值是( )A.0 B.1 C.2 D.38.有如下Python程序段,功能為刪除非降序序列中的重復數:a=[2,2,2,5,5,5,8 ]k=i=0while __(1)________:if a[i]?。絘[i+1]:k+=1 (2)________i+=1print(a[:k+1])該程序執行結果為[2,5,8],劃線處可選代碼為①iA.①③ B.①④ C.②③ D.②④9.有如下Python程序:s1 =″0312″ ; s2 =″ABCDEFGH″m = 0 ; c =″″for i in range(len(s2)) : k = int(s1[i%4]) m=4*(i∥4) c += s2[k+m]執行該程序段后,變量c的值是( )A.″ADBCADBC″ B.″ABCDEFGH″C.″AHBGCFDE″ D.″ADBCEHFG″重難點2 函數和模塊1.有如下Python程序段:def f(m): a=m%10 b=m∥10%10 c=m∥100 if c**3+b**3+a**3==m: return ″YES″ else: return ″NO″m=int(input(″輸入一個三位數:″))print(f(m))執行該程序段后,若輸出結果為“YES”,則輸入變量m值可能為( )A.121 B.134 C.153 D.1422.有如下程序代碼def sort(a): n=len(a) b=[0]*n num=k=0 while k if a[k]%2==1 : b[num]=a[k] num+=1 else: a[k-num]=a[k] k+=1 for j in range(n-num,n): a[j]=b[j-n+num] return ays=[5,10,21,7,24,14,9,11,36,37]ans=sort(ys)程序運行后,變量ans的值為( )A.[10,24,5,21,7] B.[5,7,10,21,24]C.[5,21,7,10,24] D .[10,24,5,7,21]3.有如下Python程序:def count(a,i): for j in range(i+1,len(a)): if a[j] return j-i return 0a=[4,2,2,4,1,6]b=[1]*len(a)for i in range(len(a)-1): b[i]=count(a,i)print(b)運行該程序,則 b[1]的值為( )A.0 B.1 C.2 D.34.所謂親密數是指如果整數x的全部因子(包括1,不包括x自身)之和等于y,且整數y的全部因子之和等于x,則x和y稱為一對親密數(x與y不相等)。小王想通過Python程序統計1~1000間的親密數對的個數。def yzh(m): yz_sum=1 for i in range(2,m∥2+1): if?、賍_______: yz_sum+=i return yz_sumn=0for x in range(1,1001): y=yzh(x) if?、赺_______: n=n+1print(″共有親密數對:″,n)則代碼中①②處的語句可為( )A.①m%i!=0?、趚==yzh(y) and x?。統B.①m%i==0?、趚==yzh(y) and x?。統C.①m%i?。? ②x==yzh(y) or x!=yD.①m%i==0?、趚==yzh(y) or x?。統5.生成一組由數字 1~8 組成的 8 位不重復的隨機密碼,Python 程序段如下:from random import *a=[0]*8for i in range(8): a[i]=i+1k=8;s=''for i in range(8): m=randint(0,k-1) print(s)方框中的代碼由以下三部分組成:①k-=1?、赼[m]=a[k-1]?、踫+=str(a[m])代碼順序正確的選項是( )A.①②③ B.②③① C.②①③ D.③②①6.有如下程序段:from random import randints =″python″k = randint(1, 4)for i in range(k): j = i + 1 while j < len(s) and s[j] > s[i]: j += 1 if j < len(s): s = s[:j] + s[j + 1:] else: s = s[:len(s) - 1]print(s)執行該程序段后,s的值不可能是( )A.″py″ B.″pyo″ C.″pytn″ D.″pyton″7.小明用Python語言中對大小為100*100像素的圖像“上.jpg”(如圖所示)進行簡單處理,部分代碼如下:img=Image.open(″上.jpg″)im=np.array(img.convert(″L″)) #轉換成數字矩陣rows,cols=im.shapefor i in range(rows): for j in range(cols): if j%10==0: im[i,j]=0程序執行后的圖像效果是( )重難點1 算法控制結構1.如下Python程序段中,實現功能與其它三個不一樣的是( )2. 用Python語句描述城市主干道中機動車平均行駛速度v不低于30為暢通,小于20為堵塞,其余為擁擠,設v為機動車平均行駛速度(單位: km/h) ,則下列選項正確是( )3.有如下Python程序段:a=[5,3,8,9,7,3,11]n=len(a)-1cnt=0for i in range(1,n): if a[i]==a[i+1]-a[i-1]: cnt+=1 elif a[i]>a[i+1]-a[i-1]: cnt+=2 else: cnt+=3print(cnt)執行該程序段后,變量cnt的值為( )A.9 B.10 C.11 D.124.下列程序執行后的結果為( )L = [1,-2,3,7,-8,9,10]i,j= 0,len(L)-1while i while L[i]>=0:i=i+1 while L[j]<0:j=j-1 if iL[i],L[j] = L[j],L[i]print(L[6])A.3 B.9 C.-2 D.-85.有如下Python程序段:import randoms=″″p=[0,1,2,3]random.shuffle(p) #將序列p中所有元素隨機排序for i in p: s+=chr(65+i)運行該程序段后,變量s的值可能的是( )A.″acbd″ B.″aabc″ C.″ABCB″ D.″ADBC″6.某Python程序如下:s=input(″請輸入字符串:″)ans=″″a=[1,2,3]for i in range(len(s)): x=s[i] key=a[i%3] if ″A″<=s[i]<=″Z″: ans=ans+chr((ord(x)-65+key)%26+65) else: ans=ans+xprint(ans)執行該程序后,輸入″A1b2D3″輸出的結果為( )A.2b1BF B.B1b2F3C.B3e3F6 D.6F3e3B7.有如下Python程序段:a = [1] * 6b = [96,88,84,91,99,80]for i in range(5): for j in range(i+1,6): if b[j] > b[i]: a[i] += 1 else: a[j] += 1print(a)該程序段運行后,列表a 的值為( )A.[5,3,2,4,6,1] B.[2,4,5,3,1,6]C.[10,6,4,8,12,2] D.[4,8,10,6,2,12]8.某些數據中存在“數字山峰”,例如數據“21432748”中存在“1432”、“274”兩座“數字山峰”(必須包含上坡與下坡),下面程序用于求數據中“數字山峰”的數量:num=input(″請輸入數字串:″);c=0(1)________for i in range(1,len(num)): if (2)________ and f==False:f=True elif (3)__________ and f==True:c=c+1f=Falseprint(″有″,c,″座數字山峰″)方框(1)(2)(3)的代碼由以下部分組成:①f=True?、趂=False ③num[i-1]>num[i]?、躰um[i-1]下列選項中代碼順序正確的是( )A.①③④ B.①④③ C.②③④ D.②④③9.有如下Python程序段:import randoma=[]for i in range(10): a.append(random.randint(1,100))i=1while i <10: if i==0: i=1 elif a[i-1]<=a[i]: ①________ else: a[i],a[i-1]=a[i-1],a[i] ②________print(a)執行該程序段實現了隨機生成一個數組,并將其元素遞增輸出的功能。劃線處的代碼應該是( )A.①i+=1 ②i-=1 B.①i-=1 ②i=1C.①i+=1?、趇+=1 D.①i-=1?、趇-=110.有一組正整數,要求對其中的奇偶數進行交換。交換后偶數在前,奇數在后,并保持相對順序不變。a=[5,10,21,7,24,14,9,11,36,37]n=len(a);b=[0]*nnum=0;k=0while k if : b[num]=a[k] num+=1 else: k+=1for j in range(n-num,n): print(a)將加框處的代碼補充完整,正確的是( )A.①a[k]%2==1?、赼[k-num]=a[k] ③a[j]=b[j-n+num]B.①a[k]%2==0?、赽[k-num]=a[k]?、踑[j]=b[j+num]C.①a[k]%2==0 ②a[k-num]=a[k]?、踑[j]=b[j+num]D.①a[k]%2==1?、赽[k-num]=a[k] ③a[j]=b[j-n+num]11.子序列是指數組中連續的若干個元素(至少 1 個元素)。數組 a 中有 n 個整型元素(有正有負),現要查找和最大的子序列,并輸出和。實現該功能的程序段如下,方框中應填入的正確代碼為( )def maxsub(a) : tot= -1; tmp = 0 for num in a: tmp += num return tota=[-2,1,-3,4,-1,2,1,-5,4]print (maxsub(a))12.有如下Python程序段:a = [123,32,66,12,54,95,211]p = q = a[0]for x in a[1:]: if x < p: p, q = x, p elif x < q: q = xprint(q)執行該程序段后,輸出的結果是( )A.123 B.32 C.211 D.1213.有如下 Python 程序段:a = [3, 3, 7, 8, 8, 10, 12, 99]j = k = res = 0for i in range(len(a)-1): while a[j] - a[i] < 5:j = j + 1; while a[k] - a[i] <= 5:k = k + 1 if a[j] - a[i] == 5 and a[k-1] - a[i] == 5:res += k - j執行程序后,變量res的值是( )A.2 B.3 C.4 D.514.有如下Python程序:#輸入包含5個不重復元素的數組a,代碼略i,c=0,0key=int(input(″key=″))for j in range(len(a)): if a[j]%key==0: c+=1 else: a[j-c]=a[j]print(a)運行該程序,若輸入key為2,則輸出的a不可能為( )A.[3,7,5,4,5] B.[3,7,1,5,5]C.[3,5,0,3,5] D.[9,7,4,7,3]15.有如下Python程序段:p={};s=input()for i in range(len(s)): p[s[i]]=ii=0while i n=p[s[i]] j=i+1 while j<=n: if p[s[j]]>n: n=p[s[j]] j=j+1 print(s[i:j]) i=j若輸入“arrayiybi”,則輸出結果的最后一行內容是( )A.arra B.yiy C.iybi D.yiybi16.已排好序的列表a有n個元素,下標為0~n-1,現要實現去重,并輸出去重后的結果。如:1,2,2,3,輸出1,2,3。實現該功能的程序段如下,方框中應填入的代碼為( )#輸入列表a的元素,并排好序cnt=0n=len(a)A.for i in range(1,n): if a[i]?。絘[i-1]:cnt+=1a[cnt]=a[i]B.for i in range(n-1): if a[i]?。絘[i+1]:a[cnt]=a[i]cnt+=1C.i=0while iif a[i]!=a[i+1]: cnt+=1 a[cnt]=a[i]i+=1D.i=1while i if a[i]?。絘[i-1]cnt+=1a[i]=a[cnt] i+=1重難點2 函數和模塊1.有如下程序段:def ds(s,i): if ″a″<=s[i]<=″z″: s=s[:i]+s[i+1:] elif ″0″<=s[i]<=″9″: s=s[:i]+str((int(s[i])+6)%10)+s[i+1:] return ss=″Yy23mm4″i=0while i s=ds(s,i) i+=1print(s)執行上述程序段后,s的值為( )A.″Y89m0″ B.″Y29m0″C.″y23m4″ D.″89mm0″2.使用Python程序編程探究平面上圓與圓的位置(圓心距離等于兩個圓半徑之和)相切的關系,程序代碼如下:def judge(a,b):dis=(cir[a][0]-cir[b][0])**2+(cir[a][1]-cir[b][1])**2if dis==(cir[a][2]+cir[b][2])**2: return 1return 0cir={'A':[1,1,1],'B':[4,5,4],'C':[0,2,1]}#cir 用于存儲編號為'A'、'B'、'C'的三個圓圓心的 x,y 坐標及半徑信息cnt=judge('A','B')+judge('A','C')+judge('B','C')運行程序后,變量 cnt 的值是( )A.0 B.1 C.2 D.33.有如下Python加密程序段,以下說法正確的是( )def encrypt(code,key): code_new='' for s in code: code_new+=chr(s1) return code_newcode=input(″code=″)print(encrypt(code,2))A.該加密程序段所用的加密算法是換位密碼法B.若輸入字符串 code 為“App”,則輸出的結果為 crrC.若要對數字字符逐個右移進行加密,則只需將加框處語句修改為“(int(s)+key)%10”D.將加框處語句修改為“ord('a')+((ord(s)-ord('a'))-key)%26”可將加密的密文還原為明文4.有如下Python程序段:def delstr(s,m): return s[0:m]+s[m+1:]s=″Welcome″i=0while i<=len(s): s=delstr(s,i) i+=2print(s)執行該程序段后,輸出的結果為( )A.ecm B.elome C.elco D.elom5.有如下 Python 程序段:from random import randints=″Infomation″for i in range(2): k=randint(0,2)*2+1 #randint(0,2)隨機產生[0,2]之間的整數 s=s[:k]+s[k+1:]執行該程序段后,變量 s 的值不可能是( )A.″Iomation″ B.″Inmation″C.″Infation″ D.″Ifoation″6.英語單詞″illustriousness″意思是優秀,有如下Python程序段:import randoms=″illustriousness″for i in range(4): k=random.randint(0,4)*random.randint(0,3) print(s[k],end=″″)執行該程序后,輸出的結果不可能是( )A.uiso B.iiii C.tree D.siur7.某Python代碼如下:import randomlst =[0]*8 #定義列表lst,lst[0]~lst[7]初始值均為0i = 0while i < 8: if i % 2 == 0: lst[i] = int(random.random()*10) else: lst[i] = int(random.randint(1,5))*2+1 i += 1print(lst)執行后程序后,列表lst[0]~lst[7]各元素值可能的是( )A.[0,10,2,9,8,3,4,5] B.[8,5,4,7,10,3,6,9]C.[4,11,3,5,9,6,1,7] D.[6,3,1,11,7,3,5,9]8.有如下Python程序段:import randoma = [0]*6i = 0x = int(input())while i <= 5: c = random.randint(1, 10) if x % 2 == c % 2: a[i] = c i += 1 x = x∥2執行該程序段后,若要在列表a中產生4個偶數、2個奇數,輸入的x的值不可能的是( )A.3 B.4 C.5 D.69.有下列Python程序段:import randoms=input(″請輸入字符串:″)x=random.randint(3,6)n=len(s)if len(s[0:x]) r=s[x:n]+s[0:x]else: r=s[0:x]+s[x:n]print(r)執行該程序段,若輸入“helloworld”(不包含雙引號),則輸出的結果不可能的是( )A.loworldhel B.oworldhellC.helloworld D.worldhello10.編寫一個自定義函數實現用戶的登錄,用戶最多有3次可以嘗試輸入用戶名和密碼的機會。請在劃線處填入合適的代碼。def login(a,b,u): #在字典u中判斷用戶名a是否存在,密碼b是否正確 if ①________: if ②________: print(″密碼不正確″) return False else: print(″登錄成功″) ?、踎_______else: print(″帳號不正確″) return Falseu={″cgm″:″sd@1″,″cgl″:″&dd5″,″cjm″:″##22sd″,″lbh″:″12sa″,″ljs″:″sd22!″} #系統中存在的用戶名trytime=3while trytime>0: #有3次機會可以輸入用戶名和密碼 user=input(″請輸入你的用戶名:″) psd=input(″請輸入你的密碼:″) if ④________: break else: print(″你還剩下″,trytime-1,″次機會可以輸入密碼!″)?、輄_______11.將圖形轉化為文本。應用Python中的Image模塊后,將字母圖片文件″OK.jpg″處理成由0,1表達的文本文件“OK.txt”。字母圖片如圖a所示,運行后文本文件結果如圖b所示。實現該功能的Python程序如下,請完成劃線處的程序代碼。from PIL import Imagedef judge(R,G,B): gray=0.299*R+0.587*G+0.114*B #轉成灰度值 color= gray/132 return colorimg = Image.open(″OK.jpg″)pix = img.load()file=open(①________,″w″) #讀寫方式打開文本文件width = img.size[0]②________for i in range(height): line=″″ for j in range(width): R,G,B=pix[j,i] #根據像素坐標獲得該點的RGB值 ③________ if color==0: line+=″1″ else: line+=″0″ file.write(line) #寫入OK.txt文件 file.write(″\\n″) file.close()專題8 Python程序語言基礎學習目標 1.掌握Python表達式運算符的優先級和常見內置函數的應用;2.掌握自定義函數的編寫和調用;3.掌握常見模塊的應用;4.掌握算法的三種控制結構.數據是程序運行的原料,Python的基本數據類型有整型、實型、字符串型和布爾型等,但相同類型的數據往往存儲在列表或字典中,列表是有序線性結構,可以通過索引去訪問每個元素的值,而字典是無序的,只能通過鍵去訪問其值。對數據的操作有多種運算符,內置的函數能快速地解決一些求和、平均值排序等常見的問題。算法有三種基本結構,選擇結構和循環結構可以看成是一個小小的模塊,由這些模塊組成了一個順序結構,這個結構就是一個大的算法。實現某個功能的語句可以寫在一個模塊內,這個模塊就是函數,只要傳給函數相應的參數,函數可以返回相應的計算結果。把多個相關的函數封裝在一個文件中,這個文件就是一個庫,就是一個模塊。(2024年1月浙江省選考)數組元素a[0]至a[n-1]依次存放著n個數據,現需要將元素a[n-1]插入在下標為x(0≤xtemp=a[n-1]for i in range(n-2,x-1,-1):a[x]=tempA.a[i+1]=a[i] B.a[i-1]=a[i]C.a[i]=a[i+1] D.a[i]=a[i-1]答案 A解析 先將7保存在a[n-1],變量i從n-2遍歷到x,將當前位置i后面的值移動到當前位置。重難點1 算法控制結構算法=邏輯+控制,這是Pascal設計者Niklaus Wirth的一本著作的書名,它刻畫了過程式尤其是結構化編程的思想??刂浦傅氖浅绦蛟O計中順序、選擇和循環三種基本控制結構。分支結構分為單分支結構、雙分支結構和多分支結構,而分支結構的組合可以分為多個分支語句和分支的嵌套。多分支結構和多個分支語句的區別在于多分支結構只執行其中一條判斷條件,而多個分支語句依次執行每個分支結構語句。遍歷是算法最核心的思想,往往用循環結構來實現??梢园次恢帽闅v,如 for i in range(20);也可以按元素進行遍歷,如for i in [3,2,1,7]。用while語句往往實現滿足某個條件時的遍歷。例1 象限是平面直角坐標系(笛卡爾坐標系)中橫軸和縱軸所劃分的四個區域,每一個區域叫做一個象限。象限以原點為中心,x,y 軸為分界線,原點和坐標軸上的點不屬于任何象限。某同學根據輸入的坐標點(x,y)來判斷該坐標點的位置所在,以下實現該分類的 Python 程序段中正確的是( )A.if x==0 and y==0:result=″原點″if x==0 or y==0:result=″數軸″if x?。? and y!=0: result=″象限″B.if x==0 or y==0:result=″數軸″if x==0 and y==0:result=″原點″else:result=″象限″C.if x?。? and y?。?:result=″象限″if x==0 or y==0:result=″數軸″else:result=″原點″D.if x!=0 and y?。?: result=″象限″if x==0 and y==0: result=″原點″if x==0 or y==0:result=″數軸″ 思維點撥明考向 本題考查Python基本控制結構。 (0,0)是原點,即 if x==0 and y==0 表示原點;(0,y)或者(x,0)分別表示 y 軸與 x 軸精點撥 A x==y==0時,第1個和第2個if均成立B if x==0 or y==0且x與y不同時為0表示數軸,在第2個分支語句中,再次判斷為″象限″C 條件x?。? and y?。?成立,判斷為″象限″,在第2個分支語句中,再次判斷為″原點″,因此原點的判斷需在數軸之前D 分三種情況,用3條分支語句來表達這種情況答案 D變式1 有如下 Python 程序段:a=[1,5,9,2,6,8,3,4,7]n=0 ;flag=Falseif a[0] flag=Truefor i in range(len(a)-1): if a[i] n+=1;flag=False elif a[i]>a[i+1] and flag==False: flag=Trueprint(n)執行上述程序段后,輸出的值為( )A.1 B.2 C.3 D.4答案 C解析 本題考查程序控制結構。遍歷數組a,若當前位置元素比后面元素小,且flag的值為True,則對n進行計數,同時將flag的值設置為False。若當前位置元素比后面元素大,設置flag的值為True。程序的功能是計算上升序列的個數。例2 若字符串s的值為″abcde″,執行如下程序段后,變量res的值不可能是( )from random import randintres=″″i,j=0,len(s)-1while i=i:if randint(0,1) == 0: #randint(0,1)隨機生成 0 或 1 res+=s[i] i+=1else: res+=s[j] j-=1A.″abced″ B.″aecbd″C.″aedbc″ D.″edcba″思維點撥明考向 變量i和j從兩端向中間遍歷,當i大于j時結束循環。若產生隨機數為0,將s[i]連接到res中,向后移動i,否則將s[j]連接到res中,向前移動j精點撥 A 產生的隨機數為0,0,0,1,0B 產生″ae″,i和j分別指向b和d,因此不可能連接到cC 產生的隨機數為0,1,1,0,0或0,1,1,0,1D 產生的隨機數均為1或1,1,1,1,0答案 B變式2 有如下Python程序段:s=input(″輸入字符串:″)n=len(s)i,j=0,n-1result=″″while i=n∥2:if s[i]>s[j]: result+=s[i]; j-=1elif s[i] result+=s[j]; i+=1else: i+=1;j-=1print(result)執行該程序段,分別輸入下列選項中的字符串,輸出結果不為“555”的是( )A.″51234″ B.″12535″C.″54321″ D.″55123″答案 B解析 本題考查字符串的操作。該程序段的作用是將字符串s中左半部分與右半部分按照從大到小的順序交替排列,生成一個新的字符串result。輸入s字符串為12535時,輸出結果為55。重難點2 函數和模塊在算法的程序實現過程中,也經常根據具體問題的特點將其分解成若干個子問題或者借助所用程序設計語言的特性來完成問題的解決。Python主要運用函數、模塊等方式實現模塊化程序設計,為算法的程序實現帶來極大的便利。自定義函數相當于一個小的程序塊,函數的參數相當輸入的信息,函數的形參和實參必須一一對應,函數的返回值相當輸出信息。一個函數體內可以有多條return語句,當執行某條返回語句后,結束自定義函數運行,返回主程序。在Python中,把一組函數放到一個.py文件里,這個文件就稱為一個模塊。例1 多選題評分,評分標準:全部選對得2分,選對但不全的得1分,不選或有選錯的得0分。編制的自定義函數如下,其中x表示要判斷的答案,y表示標準答案。選對但不全的答案判定方法為:遍歷判斷的答案每一個選項,若該選項在標準答案中存在則進行計數count,否則直接退出遍歷。根據count的值與判斷答案的長度是否相等來決定是選對但不全。def df(x,y): #函數df(x,y)的功能是根據標準答案y,檢測答題的答案x應得的分數ans。if x==y: ①__________else: count=0 for i in x: if i in y: count+=1 else: ②__________ if ③________: ans=0else: ans=1return ansda=input(″請你輸入你的答案:″)bzda=″ACD″n=df(da,bzda)print(″該題得分為:″+str(n))思維點撥明考向 本題考查自定義函數的應用精點撥 ①要判斷的答案x和標準答案y相同,得2分。②遍歷判斷的答案每一個選項,判斷該選項在標準答案中是否存在。若不存在,說明有錯選的選項。③若全部選項在標準答案中均能找到,則count的值就是len(x),若有找不到的,就是存在錯選的,得0分,若沒填涂,也得0分。答案?、賏ns=2 ②break③count變式1 有如下 Python 程序段:def half_s(s): n=len(s);result=″″ i,j=0,n-1 while i=n∥2: if s[i]>s[j]: result+=s[i];i+=1 elif s[i] result+=s[j];j-=1 else: i+=1;j-=1 return result執行語句v=half_s(″welcome″),變量v的值是( )A.″come″ B.″wmol″C.″www″ D.″emo″答案 B解析 本題考查自定義函數的應用。變量i從前往后遍歷,變量j從后往前遍歷,將s[i]和s[j]中較大者拼接到result中,若兩者相等,直接略過。w和e比較,w大;e和e相等;l小于m;o大于l;l大于c;此時i的值為3,不滿足條件i例2 有如下 Python 程序段:import randoma=[0]*6for i in range(6): x=int(random.random()*10)+1 if i%2==1: a[i]=2*x+1 elif x%2==0: a[i]=x∥2 else: a[i]=x-1print(a)執行該程序段后,列表 a 中的值可能是( )A.3,11,4,19,2,13 B.3,11,7,9,2,3C.9,3,1,23,4,17 D.3,3,9,0,19,8思維點撥明考向 本題考查隨機數的應用。產生一個[1,10]之間的隨機數,條件i%2==1成立,表示偶數位上是2*x+1奇數,在奇數位上,如果該數是偶數,將對該數進行整除操作,是奇數則對原數進行減1操作精點撥 B 7若是整除得來,則原數是14,否則是減1得來,則原數是8,需減1C 23超出范圍D 偶數位上不可能出現0答案 A變式2 有Python程序如下:import randomn=7a=[0]*na[0]=random.randint(60,100)for i in range(1,n): a[i]=a[i-1]-random.randint(0,i)for i in range(1,n,2): a[i]=a[i]-a[i-1]%2print(a)執行上述程序后,輸出的數據可能為( )A.[67,65,64,64,61,61,54]B.[72,71,72,69,67,62,57]C.[83,81,81,77,75,73,69]D.[94,94,94,89,89,88,82]答案 C解析 本題考查隨機數。第一個循環的功能是產生一個非增數列,且從a[1]開始,與前面數的差距不得超過1,2,3,4,5,6。第二個循環的功能是對偶數位的數減去a[i-1]%2,即減去0或1。A選項最后一個數54與前一個數的差距為7,超出范圍。B選項71前是偶數,可能是71-0,但后面不可能是72。D選項88前一個數是89,由此該數為89-1=88,而89-82=7,超出范圍。重難點1 算法控制結構1.為實現按表中分數段進行等級劃分,以下代碼正確的是( )分數 x x≥90 80≤x<90 x<80等級 level A B C答案 D解析 A選項多個分支結構,條件x>=80包括了第一個分支結構的情況。B選項elif后面未添加條件,語法錯誤。C選項不可能出現level='A'的情況。2.有如下 Python 程序段:s = input(″請輸入一串字符串:″)f = Truefor i in range(len(s)∥2): if s[i] != s[len(s)-i-1]: f = False breakprint(f)若執行該程序后, 輸出的結果是“True”,則輸入的字符串可能是( )A.″onion″ B.″hello″C.″278″ D.″111″答案 D解析 程序功能是檢測字符串s是否為回文字符。3.有如下Pyhon程序段:a=[0]*101for i in range(1,101): for j in range(i,101): if j % i==0: a[j]+=1print(a[50])執行該程序段后,輸出列表元素a[50]的值為( )A.5 B.6 C.9 D.50答案 B解析 本題考查Python雙循環及列表相關概念。外循環i枚舉[1,100]的自然數,內循環j枚舉[i,100]的所有數,當j是i的倍數時,對應的a[j]加1,故程序是在統計[1,100]中,每個數的因子個數,50的因子分別為1、50、2、25、5、10,共6個。4.將有序數組 nums 中的重復項刪除,編寫的Python程序段如下:nums=1n=len(nums);i=1while i if nums[i] !=nums[i-1]: k+=1 i+=1nums=nums[:k]上述程序段中方框處可選代碼為:①k=0?、趉=1③nums[k]=nums[i]?、躰ums[i-1]=nums[i],則(1)、(2)處代碼依次為( )A.①③ B.①④ C.②③ D.②④答案 C解析 本題考查刪除重復項的代碼段理解。本題的思路是:從第二個字符開始遍歷有序字符串s的各個字符,若前后相鄰兩個字符不相等,把當前字符重新賦值到字符串s中,此時的索引用k來表示,若前后兩個字符相等, 則跳過當前字符,不組合。以[″a″,″a″,″b″,″b″,″b″,″c″]為例,最終會得到[″a″,″b″,″c″]。5.數組元素a[0]到a[2*n-1]為互不相等的正整數(n≥1),要在其中找到最大值和最小值,并分別存儲到變量max1和max2中。實現該功能的Python程序段如下:max1=0;max2=0for i in range(0,n*2,2): if a[i]>a[i+1]: t1=a[i];t2=a[i+1] else: t1=a[i+1];t2=a[i] if : max1=t1;max2=t2 elif: max2=max1;max1=t1 elif: max2=t1上述程序段中方框處可選代碼為:①t1>max1?、趖1>max2 ③t2>max1則(1)(2)(3)處語句依次為( )A.①②③ B.②③① C.③①② D.③②①答案 C解析 每次遍歷2個元素,將這2個元素中較大值存入t1,較小值存入t2。若t2大于原最大值max1,需更新最大值和次大值。若t1大于最大值但t2小于次大值,則原最大值max1為次大值,同時更新最大值。若t1大于次大值,僅僅更新次大值為t1。若t1小于次大值,則無需更新max2和max1。6.有如下Python程序段:s1=input(″請輸入字符串:″)a=[0]*128for item in s1: ch=ord(item) a[ch]=a[ch]+1s2=″″for i in range(len(a)): for j in range(a[i]): s2=s2+chr(i)print(s2)列表a各元素的初始值都為0,s1中輸入的內容為″abs54int″。執行該程序后,程序輸出的結果中第5個字符為( )A.n B.s C.4 D.i答案 D解析 利用桶統計字符串s1各個字符的個數,字母ch的ASCII碼值作為桶的下標。遍歷各個桶的下標i,若該桶a[i]不為0,將桶中各個字符chr(i)拼接到字符串s2中。7.有如下Python程序段:c,m=0,0for i in range(2,len(a)): if a[i-2]+a[i-1]==a[i]: c+=1 if c>m: m=c else: c=0若列表a=[2,1,3,4,5,9,14,23],執行該程序段后,變量m的值是( )A.0 B.1 C.2 D.3答案 D解析 從第3個位置開始遍歷,若該位置上值是前兩個位置上數之和,統計連續符合這些條件的數據個數c,并找出c的最大值m。數據3,4符合條件,共連續2個數。數據9,14,23符合條件,共連續3個數。8.有如下Python程序段,功能為刪除非降序序列中的重復數:a=[2,2,2,5,5,5,8 ]k=i=0while __(1)________:if a[i]?。絘[i+1]:k+=1 (2)________i+=1print(a[:k+1])該程序執行結果為[2,5,8],劃線處可選代碼為①iA.①③ B.①④ C.②③ D.②④答案 C解析 從輸出語句print(a[:k+1])來看,k表示刪除重復后數字個數。a[i]和a[i+1]比較,因此i的最大位置只能為len(a)-2。k的初值為0,保存了第1個數字,當條件a[i]!=a[i+1]成立時,k先加1,因此將a[i+1]保存到a[k]中。9.有如下Python程序:s1 =″0312″ ; s2 =″ABCDEFGH″m = 0 ; c =″″for i in range(len(s2)) : k = int(s1[i%4]) m=4*(i∥4) c += s2[k+m]執行該程序段后,變量c的值是( )A.″ADBCADBC″ B.″ABCDEFGH″C.″AHBGCFDE″ D.″ADBCEHFG″答案 D解析 遍歷字符串s2各個位置,當i為0至3時,m的值為0,其余m的值為4,即把字符串s2分成″ABCD″和″EFGH″兩段,每段分別取出偏移位置為0,3,1,2的字符。重難點2 函數和模塊1.有如下Python程序段:def f(m): a=m%10 b=m∥10%10 c=m∥100 if c**3+b**3+a**3==m: return ″YES″ else: return ″NO″m=int(input(″輸入一個三位數:″))print(f(m))執行該程序段后,若輸出結果為“YES”,則輸入變量m值可能為( )A.121 B.134 C.153 D.142答案 C解析 本題考查自定義函數的應用。a、b、c分別數m的3個位上的數字,符合立方和等于他本身,因此屬于水仙花數。2.有如下程序代碼def sort(a): n=len(a) b=[0]*n num=k=0 while k if a[k]%2==1 : b[num]=a[k] num+=1 else: a[k-num]=a[k] k+=1 for j in range(n-num,n): a[j]=b[j-n+num] return ays=[5,10,21,7,24,14,9,11,36,37]ans=sort(ys)程序運行后,變量ans的值為( )A.[10,24,5,21,7] B.[5,7,10,21,24]C.[5,21,7,10,24] D .[10,24,5,7,21]答案 A解析 程序實現功能為:對其中的奇偶數進行交換。交換后偶數在前,奇數在后,并保持相對順序不變。3.有如下Python程序:def count(a,i): for j in range(i+1,len(a)): if a[j] return j-i return 0a=[4,2,2,4,1,6]b=[1]*len(a)for i in range(len(a)-1): b[i]=count(a,i)print(b)運行該程序,則 b[1]的值為( )A.0 B.1 C.2 D.3答案 D解析 自定義函數功能是在索引位置i后面找到第1個比該a[i]小的數,返回他們的之間的距離,若后面沒有比較他小的數,返回0。數組b的值依次為[1, 3, 2, 1, 0, 1]。4.所謂親密數是指如果整數x的全部因子(包括1,不包括x自身)之和等于y,且整數y的全部因子之和等于x,則x和y稱為一對親密數(x與y不相等)。小王想通過Python程序統計1~1000間的親密數對的個數。def yzh(m): yz_sum=1 for i in range(2,m∥2+1): if?、賍_______: yz_sum+=i return yz_sumn=0for x in range(1,1001): y=yzh(x) if?、赺_______: n=n+1print(″共有親密數對:″,n)則代碼中①②處的語句可為( )A.①m%i?。??、趚==yzh(y) and x?。統B.①m%i==0 ②x==yzh(y) and x!=yC.①m%i!=0 ②x==yzh(y) or x!=yD.①m%i==0?、趚==yzh(y) or x?。統答案 B解析 本題考查自定義函數及其調用。從程序可得自定義函數的功能為求自然數除本身外的因子和,①后將i累加進入,因此i為因數,滿足m%i==0,②處for循環的作用為遍歷1-1000所有的書,尋找總共有多少數是滿足條件的,并且輸出,以滿足除x本身之外的所有因數之和為y,同時還需要滿足x==yzh(y) and x!=y才能說是親密數,因此答案為B。5.生成一組由數字 1~8 組成的 8 位不重復的隨機密碼,Python 程序段如下:from random import *a=[0]*8for i in range(8): a[i]=i+1k=8;s=''for i in range(8): m=randint(0,k-1) print(s)方框中的代碼由以下三部分組成:①k-=1 ②a[m]=a[k-1]?、踫+=str(a[m])代碼順序正確的選項是( )A.①②③ B.②③① C.②①③ D.③②①答案 D解析 把隨機產生的字符連入s中,將最后一個位置的字符移動到m的位置,同時把長度減小1。6.有如下程序段:from random import randints =″python″k = randint(1, 4)for i in range(k): j = i + 1 while j < len(s) and s[j] > s[i]: j += 1 if j < len(s): s = s[:j] + s[j + 1:] else: s = s[:len(s) - 1]print(s)執行該程序段后,s的值不可能是( )A.″py″ B.″pyo″ C.″pytn″ D.″pyton″答案 C解析 本題主要考查順序查找。隨機產生1-4范圍內的整數,查找字符串s中索引大于i的字符中,第一個在字母表中位于s[i]之前的字符對應的索引位置j。如果查找到j,則s=s[:j]+s[j+1:]剔除字符串s中索引位置為j的字符。否則如果未找到或j超出字符串s的長度,剔除字符串s中最后一個字符。7.小明用Python語言中對大小為100*100像素的圖像“上.jpg”(如圖所示)進行簡單處理,部分代碼如下:img=Image.open(″上.jpg″)im=np.array(img.convert(″L″)) #轉換成數字矩陣rows,cols=im.shapefor i in range(rows): for j in range(cols): if j%10==0: im[i,j]=0程序執行后的圖像效果是( )答案 D解析 本題考查圖像模塊的應用。語句rows,cols=im.shape的功能是讀取圖像的寬度和高度。外循環是寬度,即按行遍歷圖像,每讀取完一行中所有列,再讀取下一行。當列為10的倍數時,將像素值修改為0,即改為黑色。A選項當行的值是10的倍數時,將像素置為黑色。B選項實現上下(垂直)翻轉的效果。C選項實現左右(水平)翻轉的效果。D選項當列的值是10的倍數時,將像素置為黑色。重難點1 算法控制結構1.如下Python程序段中,實現功能與其它三個不一樣的是( )答案 D解析 ABC選項實現若條件a>b成立,flag的值為True,否則為False。D選項無論a<= b是否成立,flag的值均為True。2. 用Python語句描述城市主干道中機動車平均行駛速度v不低于30為暢通,小于20為堵塞,其余為擁擠,設v為機動車平均行駛速度(單位: km/h) ,則下列選項正確是( )答案 D解析 本題考查分支控制結構。 A選項v<30中包含了堵塞和擁擠,不能區分。B選項在v>20中包含了暢通和擁擠,不能區分。C選項條件v>=30和v<20不可能同時滿足。D選項先分為大于等于20和小于20的情況,再在大于等于20中區分擁擠和暢通。3.有如下Python程序段:a=[5,3,8,9,7,3,11]n=len(a)-1cnt=0for i in range(1,n): if a[i]==a[i+1]-a[i-1]: cnt+=1 elif a[i]>a[i+1]-a[i-1]: cnt+=2 else: cnt+=3print(cnt)執行該程序段后,變量cnt的值為( )A.9 B.10 C.11 D.12答案 B解析 本題考查數組運算。遍歷列表a中元素,對于列表a中的第i個元素,如果其等于其相鄰兩個元素的差,則計數器cnt加1,否則,如果a[i]大于其相鄰兩個元素的差,則計數器cnt加2,否則計數器cnt加3。列表a中的第2個元素等于其相鄰兩個元素的差,因此cnt加1,列表a中的第3個到第5個元素都大于其相鄰兩個元素的差,因此計數器cnt會加2,而第6個元素a[i]小于其相鄰兩個元素的差,因此cnt加3。因此,最終計數器cnt的值為1+2+2+2+3=10。4.下列程序執行后的結果為( )L = [1,-2,3,7,-8,9,10]i,j= 0,len(L)-1while i while L[i]>=0:i=i+1 while L[j]<0:j=j-1 if iL[i],L[j] = L[j],L[i]print(L[6])A.3 B.9 C.-2 D.-8答案 C解析 在左邊找到第1個小于0的數的位置i,在右邊找到大于等于0的數的位置j,若i小于j,則交換兩個位置上的數。程序的功能是把左邊小于0的數交換到右邊。第一次是-2和10交換,第2次是-8和9交換,交換后的序列為[1, 10, 3, 7, 9, -8, -2]。5.有如下Python程序段:import randoms=″″p=[0,1,2,3]random.shuffle(p) #將序列p中所有元素隨機排序for i in p: s+=chr(65+i)運行該程序段后,變量s的值可能的是( )A.″acbd″ B.″aabc″ C.″ABCB″ D.″ADBC″答案 D解析 將序列p中所有元素隨機排序,因此是產生的每一個數字是唯一的。6.某Python程序如下:s=input(″請輸入字符串:″)ans=″″a=[1,2,3]for i in range(len(s)): x=s[i] key=a[i%3] if ″A″<=s[i]<=″Z″: ans=ans+chr((ord(x)-65+key)%26+65) else: ans=ans+xprint(ans)執行該程序后,輸入″A1b2D3″輸出的結果為( )A.2b1BF B.B1b2F3C.B3e3F6 D.6F3e3B答案 B解析 表達式chr((ord(x)-65+key)%26+65)的功能是將大寫字母x循環后移key個位置,而key只有3個值,不夠時可以循環使用。如果是數字或小寫字母直接相連。7.有如下Python程序段:a = [1] * 6b = [96,88,84,91,99,80]for i in range(5): for j in range(i+1,6): if b[j] > b[i]: a[i] += 1 else: a[j] += 1print(a)該程序段運行后,列表a 的值為( )A.[5,3,2,4,6,1] B.[2,4,5,3,1,6]C.[10,6,4,8,12,2] D.[4,8,10,6,2,12]答案 B解析 數組a記錄b中對應數字的名次。 變量i從0開始遍歷到4,變量j從i+1遍歷到最后,若數組b中后面的數b[j]比當前的數b[i],則對a[i]進行計數,表示后面比他大的數的個數。以96為例,后面比他大的數只有99,因此他的位次為2。8.某些數據中存在“數字山峰”,例如數據“21432748”中存在“1432”、“274”兩座“數字山峰”(必須包含上坡與下坡),下面程序用于求數據中“數字山峰”的數量:num=input(″請輸入數字串:″);c=0(1)________for i in range(1,len(num)): if (2)________ and f==False:f=True elif (3)__________ and f==True:c=c+1f=Falseprint(″有″,c,″座數字山峰″)方框(1)(2)(3)的代碼由以下部分組成:①f=True?、趂=False?、踤um[i-1]>num[i]?、躰um[i-1]下列選項中代碼順序正確的是( )A.①③④ B.①④③ C.②③④ D.②④③答案 D解析 變量f表示是否是上坡的標志,初值False表示未找到上坡,變量i從1開始遍歷,當找到第1個num[i]大于num[i-1],表示找到了上坡,將f設置為True。若狀態為上坡,當找到第1個num[i]小于num[i-1]時,表示找到了下坡,變量c進行計數,同時將f的設置為False,在此狀態下,即使出現多個num[i]小于num[i-1]時,也不會計數。9.有如下Python程序段:import randoma=[]for i in range(10): a.append(random.randint(1,100))i=1while i <10: if i==0: i=1 elif a[i-1]<=a[i]: ①________ else: a[i],a[i-1]=a[i-1],a[i] ②________print(a)執行該程序段實現了隨機生成一個數組,并將其元素遞增輸出的功能。劃線處的代碼應該是( )A.①i+=1 ②i-=1 B.①i-=1 ②i=1C.①i+=1?、趇+=1 D.①i-=1?、趇-=1答案 A解析?、偃魲l件 a[i-1]<=a[i]成立,表示已經是遞增序列,繼續遍歷后面的元素。②若不是遞增序列,交換兩個數的位置,再退回前一位置i-1,比較是否是遞增。分支if i==0的功能是:當產生一個序列中最小的數時,交接并返回前一位置,最后一次為a[0]和a[1]進行交換,i的值為0,下次應從索引1開始重新遍歷。10.有一組正整數,要求對其中的奇偶數進行交換。交換后偶數在前,奇數在后,并保持相對順序不變。a=[5,10,21,7,24,14,9,11,36,37]n=len(a);b=[0]*nnum=0;k=0while k if : b[num]=a[k] num+=1 else: k+=1for j in range(n-num,n): print(a)將加框處的代碼補充完整,正確的是( )A.①a[k]%2==1?、赼[k-num]=a[k]?、踑[j]=b[j-n+num]B.①a[k]%2==0 ②b[k-num]=a[k] ③a[j]=b[j+num]C.①a[k]%2==0 ②a[k-num]=a[k] ③a[j]=b[j+num]D.①a[k]%2==1?、赽[k-num]=a[k]?、踑[j]=b[j-n+num]答案 A解析 本題考查while循環控制結構。用循環k來遍歷數組a,當前共有k個數,num表示奇數的個數,則k-num表示偶數的個數,如果遍歷到奇數,則將該數保存到數組b中,如果是偶數,將該數移動到k-num位置中。最后將b中數全部轉移到數組a中。11.子序列是指數組中連續的若干個元素(至少 1 個元素)。數組 a 中有 n 個整型元素(有正有負),現要查找和最大的子序列,并輸出和。實現該功能的程序段如下,方框中應填入的正確代碼為( )def maxsub(a) : tot= -1; tmp = 0 for num in a: tmp += num return tota=[-2,1,-3,4,-1,2,1,-5,4]print (maxsub(a))答案 C解析 本題考查算法的綜合應用能力。尋找和最大的子序列問題,基本算法是邊求和邊求最大值。tmp用來求連續子序列的和,當和小于0時,tmp初始化為0,再次求下一段的和及最大值。12.有如下Python程序段:a = [123,32,66,12,54,95,211]p = q = a[0]for x in a[1:]: if x < p: p, q = x, p elif x < q: q = xprint(q)執行該程序段后,輸出的結果是( )A.123 B.32 C.211 D.12答案 B解析 p和q是數組a中最小值,從第2個數開始遍歷數組,若遍歷到的數比p小,將p賦值給q,將最小值賦值給p。若比q小,將該值賦值給q,因此q是該數組中次小值,p是該數組中最小值。13.有如下 Python 程序段:a = [3, 3, 7, 8, 8, 10, 12, 99]j = k = res = 0for i in range(len(a)-1): while a[j] - a[i] < 5:j = j + 1; while a[k] - a[i] <= 5:k = k + 1 if a[j] - a[i] == 5 and a[k-1] - a[i] == 5:res += k - j執行程序后,變量res的值是( )A.2 B.3 C.4 D.5答案 D解析 程序統計兩個數相減等于5的不同位置上數對的數量。當i為0時,j和k的值為3和5,res值為2;當i為1時,j和k的值不變,res累加為 4;i為2時,j和k的值為6和7,res值為5;再往后遍歷,res值不變。14.有如下Python程序:#輸入包含5個不重復元素的數組a,代碼略i,c=0,0key=int(input(″key=″))for j in range(len(a)): if a[j]%key==0: c+=1 else: a[j-c]=a[j]print(a)運行該程序,若輸入key為2,則輸出的a不可能為( )A.[3,7,5,4,5] B.[3,7,1,5,5]C.[3,5,0,3,5] D.[9,7,4,7,3]答案 D解析 遍歷數組a,變量c表示a[j]整除key(偶數)個數,若不是偶數,將其放在前面。A選項a初始值是[3,7,偶,4,5],偶表示該位置上是一個偶數。B選項第4個是偶數,則后面的5覆蓋而來。C選項a初始值是[偶,偶,0,3,5]。D選項第2個是偶數,則7覆蓋第2個數,但3一定要覆蓋4。15.有如下Python程序段:p={};s=input()for i in range(len(s)): p[s[i]]=ii=0while i n=p[s[i]] j=i+1 while j<=n: if p[s[j]]>n: n=p[s[j]] j=j+1 print(s[i:j]) i=j若輸入“arrayiybi”,則輸出結果的最后一行內容是( )A.arra B.yiy C.iybi D.yiybi答案 D解析 將輸入的字符串劃分為幾個子串,同一個字母只出現在同一個子串中并分段輸出。字典p記錄每種字母的最大索引值,字符串“arrayiybi”分成“arra”和“yiybi” 2個子串。16.已排好序的列表a有n個元素,下標為0~n-1,現要實現去重,并輸出去重后的結果。如:1,2,2,3,輸出1,2,3。實現該功能的程序段如下,方框中應填入的代碼為( )#輸入列表a的元素,并排好序cnt=0n=len(a)A.for i in range(1,n): if a[i]?。絘[i-1]:cnt+=1a[cnt]=a[i]B.for i in range(n-1): if a[i]?。絘[i+1]:a[cnt]=a[i]cnt+=1C.i=0while iif a[i]!=a[i+1]: cnt+=1 a[cnt]=a[i]i+=1D.i=1while i if a[i]!=a[i-1]cnt+=1a[i]=a[cnt] i+=1答案 A解析 本題考查數據的去重。A選項當數組前后兩個值不同時,進行計數,并將該數保存a[cnt]中。C選項當a[0]和a[1]不同時,賦值語句功能為a[1]=a[0],即重復地將第一個數據存入到下個為止。D選項當a[0]和a[1]不同時,賦值語句功能為a[1]=a[1],此時若第二個不同出現在a[2]和a[3],則賦值成a[3]=a[2],不滿足將不同的值列下,即輸入的數據為[1,2,2,3]時,輸出結果為[1,2,2] 。重難點2 函數和模塊1.有如下程序段:def ds(s,i): if ″a″<=s[i]<=″z″: s=s[:i]+s[i+1:] elif ″0″<=s[i]<=″9″: s=s[:i]+str((int(s[i])+6)%10)+s[i+1:] return ss=″Yy23mm4″i=0while i s=ds(s,i) i+=1print(s)執行上述程序段后,s的值為( )A.″Y89m0″ B.″Y29m0″C.″y23m4″ D.″89mm0″答案 B解析 如果是小寫字母,則進行刪除操作。若是一個數字,循環向后移3位。i=1時,刪除字符y,s=″Y23mm4″,接著i值為2,3變9,刪除第1個m,接著4變0。2.使用Python程序編程探究平面上圓與圓的位置(圓心距離等于兩個圓半徑之和)相切的關系,程序代碼如下:def judge(a,b):dis=(cir[a][0]-cir[b][0])**2+(cir[a][1]-cir[b][1])**2if dis==(cir[a][2]+cir[b][2])**2: return 1return 0cir={'A':[1,1,1],'B':[4,5,4],'C':[0,2,1]}#cir 用于存儲編號為'A'、'B'、'C'的三個圓圓心的 x,y 坐標及半徑信息cnt=judge('A','B')+judge('A','C')+judge('B','C')運行程序后,變量 cnt 的值是( )A.0 B.1 C.2 D.3答案 C解析 本題考查自定義函數。字典cir初始存儲了三個圓的圓心和半徑信息。judge('A','B')是判斷圓A和圓B是否相切,如果相切,返回值為1,否則為0。當前A、B兩圓,B、C兩圓相切,所以變量cnt的值為2 。3.有如下Python加密程序段,以下說法正確的是( )def encrypt(code,key): code_new='' for s in code: code_new+=chr(s1) return code_newcode=input(″code=″)print(encrypt(code,2))A.該加密程序段所用的加密算法是換位密碼法B.若輸入字符串 code 為“App”,則輸出的結果為 crrC.若要對數字字符逐個右移進行加密,則只需將加框處語句修改為“(int(s)+key)%10”D.將加框處語句修改為“ord('a')+((ord(s)-ord('a'))-key)%26”可將加密的密文還原為明文答案 D解析 A選項是替代加密。B選項輸出結果為wrr。4.有如下Python程序段:def delstr(s,m): return s[0:m]+s[m+1:]s=″Welcome″i=0while i<=len(s): s=delstr(s,i) i+=2print(s)執行該程序段后,輸出的結果為( )A.ecm B.elome C.elco D.elom答案 D解析 自定義函數的功能:在字符串s中刪除索引位置為m的字符。i值依次為0,2,4,字符串s的值依次為elcome、elome、elom。5.有如下 Python 程序段:from random import randints=″Infomation″for i in range(2): k=randint(0,2)*2+1 #randint(0,2)隨機產生[0,2]之間的整數 s=s[:k]+s[k+1:]執行該程序段后,變量 s 的值不可能是( )A.″Iomation″ B.″Inmation″C.″Infation″ D.″Ifoation″答案 B解析 語句s=s[:k]+s[k+1:]的功能是去除該字符串索引k位置上字符。循環2次,每次產生一個0至5之間的奇數k,接著去除k位字符。A選項″Infomation″→″Ifomation″→″Iomation″,k值均為1。B選項″Infomation″→″Infmation″→″Inmation″,k值依次為3和2,2不可能產生。C選項″Infomation″→″Infmation″→″Infation″,k值均為3。6.英語單詞″illustriousness″意思是優秀,有如下Python程序段:import randoms=″illustriousness″for i in range(4): k=random.randint(0,4)*random.randint(0,3) print(s[k],end=″″)執行該程序后,輸出的結果不可能是( )A.uiso B.iiii C.tree D.siur答案 C解析 k的值為0至4之間的數乘以0至3之間的數,[0,4]*0值均為0,[0,4]*1值依次為0、1、2、3、4,[0,4]*2值依次為0、2、4、6、8,[0,4]*3值依次為0、3、6、9、12,因此不可能產生5,7,10,11,即字符中不可能包含t。7.某Python代碼如下:import randomlst =[0]*8 #定義列表lst,lst[0]~lst[7]初始值均為0i = 0while i < 8: if i % 2 == 0: lst[i] = int(random.random()*10) else: lst[i] = int(random.randint(1,5))*2+1 i += 1print(lst)執行后程序后,列表lst[0]~lst[7]各元素值可能的是( )A.[0,10,2,9,8,3,4,5] B.[8,5,4,7,10,3,6,9]C.[4,11,3,5,9,6,1,7] D.[6,3,1,11,7,3,5,9]答案 D解析 本題主要考查Python中循環和分支語句的綜合運用,該程序語句的作用是當i依次取[0,8]的值時,若i為偶數,則以i為索引的列表1st中的元素為[0,9]內的隨機整數,若i為奇數,則以i為索引的列表1st中的元素為[0,5]內的隨機整數的2倍加1(必定為奇數)。8.有如下Python程序段:import randoma = [0]*6i = 0x = int(input())while i <= 5: c = random.randint(1, 10) if x % 2 == c % 2: a[i] = c i += 1 x = x∥2執行該程序段后,若要在列表a中產生4個偶數、2個奇數,輸入的x的值不可能的是( )A.3 B.4 C.5 D.6答案 B解析 條件x % 2 == c % 2表示x和c同時為奇數或偶數。A選項x的值依次為3,1,0,0,0;B選項x的值依次為4,2,1,0,0;C選項x的值依次為5,2,1,0,0;D選項x的值依次為6,3,1,0,0。9.有下列Python程序段:import randoms=input(″請輸入字符串:″)x=random.randint(3,6)n=len(s)if len(s[0:x]) r=s[x:n]+s[0:x]else: r=s[0:x]+s[x:n]print(r)執行該程序段,若輸入“helloworld”(不包含雙引號),則輸出的結果不可能的是( )A.loworldhel B.oworldhellC.helloworld D.worldhello答案 D解析 本題綜合考查了Random模塊函數的應用及分支結構及字符串的切片。X為采用Random模塊產生的[3,6]之間的隨機整數,按照題意輸入helloworld后n的值為10,帶入if的條件表達式可得,執行第一個分支(將索引值x前面的字符后置)的條件為x<5,推得執行第二個分支(不改變字符順序)的條件為x>=5,通過對選項的處理可知A中hel后置,x的值為3,可行;B選項hell后置,x的值為4,符合條件,可行;C選項不改變順序,x>=5,可行;D選項hello后置,可得x=5,而x=5時應執行第二個分支的語句。10.編寫一個自定義函數實現用戶的登錄,用戶最多有3次可以嘗試輸入用戶名和密碼的機會。請在劃線處填入合適的代碼。def login(a,b,u): #在字典u中判斷用戶名a是否存在,密碼b是否正確 if ①________: if ②________: print(″密碼不正確″) return False else: print(″登錄成功″) ?、踎_______else: print(″帳號不正確″) return Falseu={″cgm″:″sd@1″,″cgl″:″&dd5″,″cjm″:″##22sd″,″lbh″:″12sa″,″ljs″:″sd22!″} #系統中存在的用戶名trytime=3while trytime>0: #有3次機會可以輸入用戶名和密碼 user=input(″請輸入你的用戶名:″) psd=input(″請輸入你的密碼:″) if ④________: break else: print(″你還剩下″,trytime-1,″次機會可以輸入密碼!″) ⑤________答案?、賏 in u?、赽!=u[a]?、踨eturn True?、躭ogin(user,psd,u) ⑤trytime-=1解析 本題考查自定義函數編寫和調用。①在字典u中判斷用戶名a是否存在,密碼b是否正確,首先判斷a是否在字典b中,若存在用戶u,則該用戶的用戶名是鍵,密碼是值u[a],因此②處答案為b!=u[a]。當兩者均正確時,需返回True。④處調用login函數,把用戶名user、密碼psd和字典u分別傳至自定義函數中。⑤處將改變trytime的值,嘗試的次數將減少一次。11.將圖形轉化為文本。應用Python中的Image模塊后,將字母圖片文件″OK.jpg″處理成由0,1表達的文本文件“OK.txt”。字母圖片如圖a所示,運行后文本文件結果如圖b所示。實現該功能的Python程序如下,請完成劃線處的程序代碼。from PIL import Imagedef judge(R,G,B): gray=0.299*R+0.587*G+0.114*B #轉成灰度值 color= gray/132 return colorimg = Image.open(″OK.jpg″)pix = img.load()file=open(①________,″w″) #讀寫方式打開文本文件width = img.size[0]②________for i in range(height): line=″″ for j in range(width): R,G,B=pix[j,i] #根據像素坐標獲得該點的RGB值 ③________ if color==0: line+=″1″ else: line+=″0″ file.write(line) #寫入OK.txt文件 file.write(″\\n″) file.close()答案?、佟錙K.txt″?、趆eight = img.size[1]?、踓olor = judge(R,G, B)解析 本題考查Image模塊的應用。①中讀取文件名″OK.txt″。 ②中語句width = img.size[0]獲取圖像寬度,循環中for i in range(height)要求圖像的高度。③中未對color賦值,調用自定義函數,返回0或1。(共111張PPT)第二部分 算法與程序設計專題8 Python程序語言基礎1.掌握Python表達式運算符的優先級和常見內置函數的應用;2.掌握自定義函數的編寫和調用;3.掌握常見模塊的應用;4.掌握算法的三種控制結構.目 錄CONTENTS體系構建01真題再現02考點精練03當堂檢測04課后練習05體系構建1數據是程序運行的原料,Python的基本數據類型有整型、實型、字符串型和布爾型等,但相同類型的數據往往存儲在列表或字典中,列表是有序線性結構,可以通過索引去訪問每個元素的值,而字典是無序的,只能通過鍵去訪問其值。對數據的操作有多種運算符,內置的函數能快速地解決一些求和、平均值排序等常見的問題。算法有三種基本結構,選擇結構和循環結構可以看成是一個小小的模塊,由這些模塊組成了一個順序結構,這個結構就是一個大的算法。實現某個功能的語句可以寫在一個模塊內,這個模塊就是函數,只要傳給函數相應的參數,函數可以返回相應的計算結果。把多個相關的函數封裝在一個文件中,這個文件就是一個庫,就是一個模塊。真題再現2A解析 先將7保存在a[n-1],變量i從n-2遍歷到x,將當前位置i后面的值移動到當前位置。考點精練3重難點1 算法控制結構算法=邏輯+控制,這是Pascal設計者Niklaus Wirth的一本著作的書名,它刻畫了過程式尤其是結構化編程的思想??刂浦傅氖浅绦蛟O計中順序、選擇和循環三種基本控制結構。分支結構分為單分支結構、雙分支結構和多分支結構,而分支結構的組合可以分為多個分支語句和分支的嵌套。多分支結構和多個分支語句的區別在于多分支結構只執行其中一條判斷條件,而多個分支語句依次執行每個分支結構語句。遍歷是算法最核心的思想,往往用循環結構來實現。可以按位置遍歷,如 for i in range(20);也可以按元素進行遍歷,如for i in [3,2,1,7]。用while語句往往實現滿足某個條件時的遍歷。B.if x==0 or y==0:result=″數軸″if x==0 and y==0:result=″原點″else:result=″象限″C.if x?。? and y?。?:result=″象限″if x==0 or y==0:result=″數軸″else:result=″原點″D.if x?。? and y?。?: result=″象限″if x==0 and y==0: result=″原點″if x==0 or y==0:result=″數軸″答案 D思維點撥明考向 本題考查Python基本控制結構。 (0,0)是原點,即 if x==0 and y==0 表示原點;(0,y)或者(x,0)分別表示 y 軸與 x 軸精點撥 A x==y==0時,第1個和第2個if均成立B if x==0 or y==0且x與y不同時為0表示數軸,在第2個分支語句中,再次判斷為″象限″C 條件x?。? and y!=0成立,判斷為″象限″,在第2個分支語句中,再次判斷為″原點″,因此原點的判斷需在數軸之前D 分三種情況,用3條分支語句來表達這種情況變式1 有如下 Python 程序段:a=[1,5,9,2,6,8,3,4,7]n=0 ;flag=Falseif a[0] flag=Truefor i in range(len(a)-1): if a[i] n+=1;flag=False elif a[i]>a[i+1] and flag==False: flag=Trueprint(n)執行上述程序段后,輸出的值為( )A.1 B.2 C.3 D.4C解析 本題考查程序控制結構。遍歷數組a,若當前位置元素比后面元素小,且flag的值為True,則對n進行計數,同時將flag的值設置為False。若當前位置元素比后面元素大,設置flag的值為True。程序的功能是計算上升序列的個數。B思維點撥明考向 變量i和j從兩端向中間遍歷,當i大于j時結束循環。若產生隨機數為0,將s[i]連接到res中,向后移動i,否則將s[j]連接到res中,向前移動j精點撥 A 產生的隨機數為0,0,0,1,0B 產生″ae″,i和j分別指向b和d,因此不可能連接到cC 產生的隨機數為0,1,1,0,0或0,1,1,0,1D 產生的隨機數均為1或1,1,1,1,0變式2 有如下Python程序段:s=input(″輸入字符串:″)n=len(s)i,j=0,n-1result=″″while i=n∥2:if s[i]>s[j]: result+=s[i]; j-=1elif s[i] result+=s[j]; i+=1else: i+=1;j-=1print(result)執行該程序段,分別輸入下列選項中的字符串,輸出結果不為“555”的是( )A.″51234″ B.″12535″ C.″54321″ D.″55123″B解析 本題考查字符串的操作。該程序段的作用是將字符串s中左半部分與右半部分按照從大到小的順序交替排列,生成一個新的字符串result。輸入s字符串為12535時,輸出結果為55。重難點2 函數和模塊在算法的程序實現過程中,也經常根據具體問題的特點將其分解成若干個子問題或者借助所用程序設計語言的特性來完成問題的解決。Python主要運用函數、模塊等方式實現模塊化程序設計,為算法的程序實現帶來極大的便利。自定義函數相當于一個小的程序塊,函數的參數相當輸入的信息,函數的形參和實參必須一一對應,函數的返回值相當輸出信息。一個函數體內可以有多條return語句,當執行某條返回語句后,結束自定義函數運行,返回主程序。在Python中,把一組函數放到一個.py文件里,這個文件就稱為一個模塊。for i in x: if i in y: count+=1 else: ②__________ if ③________: ans=0else: ans=1return ansda=input(″請你輸入你的答案:″)bzda=″ACD″n=df(da,bzda)print(″該題得分為:″+str(n))思維點撥明考向 本題考查自定義函數的應用精點撥 ①要判斷的答案x和標準答案y相同,得2分。②遍歷判斷的答案每一個選項,判斷該選項在標準答案中是否存在。若不存在,說明有錯選的選項。③若全部選項在標準答案中均能找到,則count的值就是len(x),若有找不到的,就是存在錯選的,得0分,若沒填涂,也得0分。答案?、賏ns=2 ②break ③count變式1 有如下 Python 程序段:def half_s(s): n=len(s);result=″″ i,j=0,n-1 while i=n∥2: if s[i]>s[j]: result+=s[i];i+=1 elif s[i] result+=s[j];j-=1 else: i+=1;j-=1 return result執行語句v=half_s(″welcome″),變量v的值是( )A.″come″ B.″wmol″ C.″www″ D.″emo″B解析 本題考查自定義函數的應用。變量i從前往后遍歷,變量j從后往前遍歷,將s[i]和s[j]中較大者拼接到result中,若兩者相等,直接略過。w和e比較,w大;e和e相等;l小于m;o大于l;l大于c;此時i的值為3,不滿足條件iA思維點撥明考向 本題考查隨機數的應用。產生一個[1,10]之間的隨機數,條件i%2==1成立,表示偶數位上是2*x+1奇數,在奇數位上,如果該數是偶數,將對該數進行整除操作,是奇數則對原數進行減1操作精點撥 B 7若是整除得來,則原數是14,否則是減1得來,則原數是8,需減1C 23超出范圍D 偶數位上不可能出現0變式2 有Python程序如下:import randomn=7a=[0]*na[0]=random.randint(60,100)for i in range(1,n): a[i]=a[i-1]-random.randint(0,i)for i in range(1,n,2): a[i]=a[i]-a[i-1]%2print(a)執行上述程序后,輸出的數據可能為( )A.[67,65,64,64,61,61,54] B.[72,71,72,69,67,62,57]C.[83,81,81,77,75,73,69] D.[94,94,94,89,89,88,82]C解析 本題考查隨機數。第一個循環的功能是產生一個非增數列,且從a[1]開始,與前面數的差距不得超過1,2,3,4,5,6。第二個循環的功能是對偶數位的數減去a[i-1]%2,即減去0或1。A選項最后一個數54與前一個數的差距為7,超出范圍。B選項71前是偶數,可能是71-0,但后面不可能是72。D選項88前一個數是89,由此該數為89-1=88,而89-82=7,超出范圍。當堂檢測4重難點1 算法控制結構重難點2 函數和模塊1.為實現按表中分數段進行等級劃分,以下代碼正確的是( )D分數 x x≥90 80≤x<90 x<80等級 level A B C解析 A選項多個分支結構,條件x>=80包括了第一個分支結構的情況。B選項elif后面未添加條件,語法錯誤。C選項不可能出現level='A'的情況。D解析 程序功能是檢測字符串s是否為回文字符。B解析 本題考查Python雙循環及列表相關概念。外循環i枚舉[1,100]的自然數,內循環j枚舉[i,100]的所有數,當j是i的倍數時,對應的a[j]加1,故程序是在統計[1,100]中,每個數的因子個數,50的因子分別為1、50、2、25、5、10,共6個。C解析 本題考查刪除重復項的代碼段理解。本題的思路是:從第二個字符開始遍歷有序字符串s的各個字符,若前后相鄰兩個字符不相等,把當前字符重新賦值到字符串s中,此時的索引用k來表示,若前后兩個字符相等, 則跳過當前字符,不組合。以[″a″,″a″,″b″,″b″,″b″,″c″]為例,最終會得到[″a″,″b″,″c″]。max2=t1上述程序段中方框處可選代碼為:①t1>max1?、趖1>max2?、踭2>max1則(1)(2)(3)處語句依次為( )A.①②③ B.②③① C.③①② D.③②①C解析 每次遍歷2個元素,將這2個元素中較大值存入t1,較小值存入t2。若t2大于原最大值max1,需更新最大值和次大值。若t1大于最大值但t2小于次大值,則原最大值max1為次大值,同時更新最大值。若t1大于次大值,僅僅更新次大值為t1。若t1小于次大值,則無需更新max2和max1。D6.有如下Python程序段:s1=input(″請輸入字符串:″)a=[0]*128for item in s1: ch=ord(item) a[ch]=a[ch]+1s2=″″for i in range(len(a)): for j in range(a[i]): s2=s2+chr(i)print(s2)列表a各元素的初始值都為0,s1中輸入的內容為″abs54int″。執行該程序后,程序輸出的結果中第5個字符為( )A.n B.s C.4 D.i解析 利用桶統計字符串s1各個字符的個數,字母ch的ASCII碼值作為桶的下標。遍歷各個桶的下標i,若該桶a[i]不為0,將桶中各個字符chr(i)拼接到字符串s2中。D解析 從第3個位置開始遍歷,若該位置上值是前兩個位置上數之和,統計連續符合這些條件的數據個數c,并找出c的最大值m。數據3,4符合條件,共連續2個數。數據9,14,23符合條件,共連續3個數。C8.有如下Python程序段,功能為刪除非降序序列中的重復數:a=[2,2,2,5,5,5,8 ]k=i=0while __(1)________:if a[i]?。絘[i+1]:k+=1 (2)________i+=1print(a[:k+1])該程序執行結果為[2,5,8],劃線處可選代碼為①iA.①③ B.①④ C.②③ D.②④解析 從輸出語句print(a[:k+1])來看,k表示刪除重復后數字個數。a[i]和a[i+1]比較,因此i的最大位置只能為len(a)-2。k的初值為0,保存了第1個數字,當條件a[i]?。絘[i+1]成立時,k先加1,因此將a[i+1]保存到a[k]中。D解析 遍歷字符串s2各個位置,當i為0至3時,m的值為0,其余m的值為4,即把字符串s2分成″ABCD″和″EFGH″兩段,每段分別取出偏移位置為0,3,1,2的字符。C1.有如下Python程序段:def f(m): a=m%10 b=m∥10%10 c=m∥100 if c**3+b**3+a**3==m: return ″YES″ else: return ″NO″m=int(input(″輸入一個三位數:″))print(f(m))執行該程序段后,若輸出結果為“YES”,則輸入變量m值可能為( )A.121 B.134 C.153 D.142解析 本題考查自定義函數的應用。a、b、c分別數m的3個位上的數字,符合立方和等于他本身,因此屬于水仙花數。 k+=1 for j in range(n-num,n): a[j]=b[j-n+num] return ays=[5,10,21,7,24,14,9,11,36,37]ans=sort(ys)程序運行后,變量ans的值為( )A.[10,24,5,21,7] B.[5,7,10,21,24]C.[5,21,7,10,24] D .[10,24,5,7,21]A解析 程序實現功能為:對其中的奇偶數進行交換。交換后偶數在前,奇數在后,并保持相對順序不變。D解析 自定義函數功能是在索引位置i后面找到第1個比該a[i]小的數,返回他們的之間的距離,若后面沒有比較他小的數,返回0。數組b的值依次為[1, 3, 2, 1, 0, 1]。B解析 本題考查自定義函數及其調用。從程序可得自定義函數的功能為求自然數除本身外的因子和,①后將i累加進入,因此i為因數,滿足m%i==0,②處for循環的作用為遍歷1-1000所有的書,尋找總共有多少數是滿足條件的,并且輸出,以滿足除x本身之外的所有因數之和為y,同時還需要滿足x==yzh(y) and x?。統才能說是親密數,因此答案為B。D解析 把隨機產生的字符連入s中,將最后一個位置的字符移動到m的位置,同時把長度減小1。C解析 本題主要考查順序查找。隨機產生1-4范圍內的整數,查找字符串s中索引大于i的字符中,第一個在字母表中位于s[i]之前的字符對應的索引位置j。如果查找到j,則s=s[:j]+s[j+1:]剔除字符串s中索引位置為j的字符。否則如果未找到或j超出字符串s的長度,剔除字符串s中最后一個字符。D7.小明用Python語言中對大小為100*100像素的圖像“上.jpg”(如圖所示)進行簡單處理,部分代碼如下:img=Image.open(″上.jpg″)im=np.array(img.convert(″L″)) #轉換成數字矩陣rows,cols=im.shapefor i in range(rows): for j in range(cols): if j%10==0: im[i,j]=0程序執行后的圖像效果是( )解析 本題考查圖像模塊的應用。語句rows,cols=im.shape的功能是讀取圖像的寬度和高度。外循環是寬度,即按行遍歷圖像,每讀取完一行中所有列,再讀取下一行。當列為10的倍數時,將像素值修改為0,即改為黑色。A選項當行的值是10的倍數時,將像素置為黑色。B選項實現上下(垂直)翻轉的效果。C選項實現左右(水平)翻轉的效果。D選項當列的值是10的倍數時,將像素置為黑色。課后練習5重難點1 算法控制結構重難點2 函數和模塊1.如下Python程序段中,實現功能與其它三個不一樣的是( )D解析 ABC選項實現若條件a>b成立,flag的值為True,否則為False。D選項無論a<= b是否成立,flag的值均為True。2. 用Python語句描述城市主干道中機動車平均行駛速度v不低于30為暢通,小于20為堵塞,其余為擁擠,設v為機動車平均行駛速度(單位: km/h) ,則下列選項正確是( )答案 D解析 本題考查分支控制結構。 A選項v<30中包含了堵塞和擁擠,不能區分。B選項在v>20中包含了暢通和擁擠,不能區分。C選項條件v>=30和v<20不可能同時滿足。D選項先分為大于等于20和小于20的情況,再在大于等于20中區分擁擠和暢通。3.有如下Python程序段:a=[5,3,8,9,7,3,11]n=len(a)-1cnt=0for i in range(1,n): if a[i]==a[i+1]-a[i-1]: cnt+=1 elif a[i]>a[i+1]-a[i-1]: cnt+=2 else: cnt+=3print(cnt)執行該程序段后,變量cnt的值為( )A.9 B.10 C.11 D.12B解析 本題考查數組運算。遍歷列表a中元素,對于列表a中的第i個元素,如果其等于其相鄰兩個元素的差,則計數器cnt加1,否則,如果a[i]大于其相鄰兩個元素的差,則計數器cnt加2,否則計數器cnt加3。列表a中的第2個元素等于其相鄰兩個元素的差,因此cnt加1,列表a中的第3個到第5個元素都大于其相鄰兩個元素的差,因此計數器cnt會加2,而第6個元素a[i]小于其相鄰兩個元素的差,因此cnt加3。因此,最終計數器cnt的值為1+2+2+2+3=10。C解析 在左邊找到第1個小于0的數的位置i,在右邊找到大于等于0的數的位置j,若i小于j,則交換兩個位置上的數。程序的功能是把左邊小于0的數交換到右邊。第一次是-2和10交換,第2次是-8和9交換,交換后的序列為[1, 10, 3, 7, 9, -8, -2]。D解析 將序列p中所有元素隨機排序,因此是產生的每一個數字是唯一的。5.有如下Python程序段:import randoms=″″p=[0,1,2,3]random.shuffle(p) #將序列p中所有元素隨機排序for i in p: s+=chr(65+i)運行該程序段后,變量s的值可能的是( )A.″acbd″ B.″aabc″ C.″ABCB″ D.″ADBC″6.某Python程序如下:s=input(″請輸入字符串:″)ans=″″a=[1,2,3]for i in range(len(s)):x=s[i] key=a[i%3] if ″A″<=s[i]<=″Z″: ans=ans+chr((ord(x)-65+key)%26+65) else: ans=ans+xprint(ans)執行該程序后,輸入″A1b2D3″輸出的結果為( )A.2b1BF B.B1b2F3 C.B3e3F6 D.6F3e3BB解析 表達式chr((ord(x)-65+key)%26+65)的功能是將大寫字母x循環后移key個位置,而key只有3個值,不夠時可以循環使用。如果是數字或小寫字母直接相連。7.有如下Python程序段:a = [1] * 6b = [96,88,84,91,99,80]for i in range(5): for j in range(i+1,6): if b[j] > b[i]: a[i] += 1 else: a[j] += 1print(a)該程序段運行后,列表a 的值為( )A.[5,3,2,4,6,1] B.[2,4,5,3,1,6]C.[10,6,4,8,12,2] D.[4,8,10,6,2,12]B解析 數組a記錄b中對應數字的名次。 變量i從0開始遍歷到4,變量j從i+1遍歷到最后,若數組b中后面的數b[j]比當前的數b[i],則對a[i]進行計數,表示后面比他大的數的個數。以96為例,后面比他大的數只有99,因此他的位次為2。D解析 變量f表示是否是上坡的標志,初值False表示未找到上坡,變量i從1開始遍歷,當找到第1個num[i]大于num[i-1],表示找到了上坡,將f設置為True。若狀態為上坡,當找到第1個num[i]小于num[i-1]時,表示找到了下坡,變量c進行計數,同時將f的設置為False,在此狀態下,即使出現多個num[i]小于num[i-1]時,也不會計數。A解析?、偃魲l件 a[i-1]<=a[i]成立,表示已經是遞增序列,繼續遍歷后面的元素。②若不是遞增序列,交換兩個數的位置,再退回前一位置i-1,比較是否是遞增。分支if i==0的功能是:當產生一個序列中最小的數時,交接并返回前一位置,最后一次為a[0]和a[1]進行交換,i的值為0,下次應從索引1開始重新遍歷。A解析 本題考查while循環控制結構。用循環k來遍歷數組a,當前共有k個數,num表示奇數的個數,則k-num表示偶數的個數,如果遍歷到奇數,則將該數保存到數組b中,如果是偶數,將該數移動到k-num位置中。最后將b中數全部轉移到數組a中。答案 C解析 本題考查算法的綜合應用能力。尋找和最大的子序列問題,基本算法是邊求和邊求最大值。tmp用來求連續子序列的和,當和小于0時,tmp初始化為0,再次求下一段的和及最大值。12.有如下Python程序段:a = [123,32,66,12,54,95,211]p = q = a[0]for x in a[1:]: if x < p: p, q = x, p elif x < q: q = xprint(q)執行該程序段后,輸出的結果是( )A.123 B.32 C.211 D.12B解析 p和q是數組a中最小值,從第2個數開始遍歷數組,若遍歷到的數比p小,將p賦值給q,將最小值賦值給p。若比q小,將該值賦值給q,因此q是該數組中次小值,p是該數組中最小值。D解析 程序統計兩個數相減等于5的不同位置上數對的數量。當i為0時,j和k的值為3和5,res值為2;當i為1時,j和k的值不變,res累加為 4;i為2時,j和k的值為6和7,res值為5;再往后遍歷,res值不變。D解析 遍歷數組a,變量c表示a[j]整除key(偶數)個數,若不是偶數,將其放在前面。A選項a初始值是[3,7,偶,4,5],偶表示該位置上是一個偶數。B選項第4個是偶數,則后面的5覆蓋而來。C選項a初始值是[偶,偶,0,3,5]。D選項第2個是偶數,則7覆蓋第2個數,但3一定要覆蓋4。D解析 將輸入的字符串劃分為幾個子串,同一個字母只出現在同一個子串中并分段輸出。字典p記錄每種字母的最大索引值,字符串“arrayiybi”分成“arra”和“yiybi” 2個子串。答案 A解析 本題考查數據的去重。A選項當數組前后兩個值不同時,進行計數,并將該數保存a[cnt]中。C選項當a[0]和a[1]不同時,賦值語句功能為a[1]=a[0],即重復地將第一個數據存入到下個為止。D選項當a[0]和a[1]不同時,賦值語句功能為a[1]=a[1],此時若第二個不同出現在a[2]和a[3],則賦值成a[3]=a[2],不滿足將不同的值列下,即輸入的數據為[1,2,2,3]時,輸出結果為[1,2,2] 。B解析 如果是小寫字母,則進行刪除操作。若是一個數字,循環向后移3位。i=1時,刪除字符y,s=″Y23mm4″,接著i值為2,3變9,刪除第1個m,接著4變0。C解析 本題考查自定義函數。字典cir初始存儲了三個圓的圓心和半徑信息。judge('A','B')是判斷圓A和圓B是否相切,如果相切,返回值為1,否則為0。當前A、B兩圓,B、C兩圓相切,所以變量cnt的值為2 。A.該加密程序段所用的加密算法是換位密碼法B.若輸入字符串 code 為“App”,則輸出的結果為 crrC.若要對數字字符逐個右移進行加密,則只需將加框處語句修改為“(int(s)+key)%10”D.將加框處語句修改為“ord('a')+((ord(s)-ord('a'))-key)%26”可將加密的密文還原為明文答案 D解析 A選項是替代加密。B選項輸出結果為wrr。D解析 自定義函數的功能:在字符串s中刪除索引位置為m的字符。i值依次為0,2,4,字符串s的值依次為elcome、elome、elom。B5.有如下 Python 程序段:from random import randints=″Infomation″for i in range(2): k=randint(0,2)*2+1 #randint(0,2)隨機產生[0,2]之間的整數 s=s[:k]+s[k+1:]執行該程序段后,變量 s 的值A.″Iomation″ B.″Inmation″C.″Infation″ D.″Ifoation″解析 語句s=s[:k]+s[k+1:]的功能是去除該字符串索引k位置上字符。循環2次,每次產生一個0至5之間的奇數k,接著去除k位字符。A選項″Infomation″→″Ifomation″→″Iomation″,k值均為1。B選項″Infomation″→″Infmation″→″Inmation″,k值依次為3和2,2不可能產生。C選項″Infomation″→″Infmation″→″Infation″,k值均為3。C解析 k的值為0至4之間的數乘以0至3之間的數,[0,4]*0值均為0,[0,4]*1值依次為0、1、2、3、4,[0,4]*2值依次為0、2、4、6、8,[0,4]*3值依次為0、3、6、9、12,因此不可能產生5,7,10,11,即字符中不可能包含t。6.英語單詞″illustriousness″意思是優秀,有如下Python程序段:import randoms=″illustriousness″for i in range(4): k=random.randint(0,4)*random.randint(0,3) print(s[k],end=″″)執行該程序后,輸出的結果A.uiso B.iiii C.tree D.siurD解析 本題主要考查Python中循環和分支語句的綜合運用,該程序語句的作用是當i依次取[0,8]的值時,若i為偶數,則以i為索引的列表1st中的元素為[0,9]內的隨機整數,若i為奇數,則以i為索引的列表1st中的元素為[0,5]內的隨機整數的2倍加1(必定為奇數)。執行該程序段后,若要在列表a中產生4個偶數、2個奇數,輸入的x的值A.3 B.4 C.5 D.6B解析 條件x % 2 == c % 2表示x和c同時為奇數或偶數。A選項x的值依次為3,1,0,0,0;B選項x的值依次為4,2,1,0,0;C選項x的值依次為5,2,1,0,0;D選項x的值依次為6,3,1,0,0。9.有下列Python程序段:import randoms=input(″請輸入字符串:″)x=random.randint(3,6)n=len(s)if len(s[0:x]) r=s[x:n]+s[0:x]else: r=s[0:x]+s[x:n]print(r)執行該程序段,若輸入“helloworld”(不包含雙引號),則輸出的結果( )A.loworldhel B.oworldhellC.helloworld D.worldhelloD解析 本題綜合考查了Random模塊函數的應用及分支結構及字符串的切片。X為采用Random模塊產生的[3,6]之間的隨機整數,按照題意輸入helloworld后n的值為10,帶入if的條件表達式可得,執行第一個分支(將索引值x前面的字符后置)的條件為x<5,推得執行第二個分支(不改變字符順序)的條件為x>=5,通過對選項的處理可知A中hel后置,x的值為3,可行;B選項hell后置,x的值為4,符合條件,可行;C選項不改變順序,x>=5,可行;D選項hello后置,可得x=5,而x=5時應執行第二個分支的語句。解析 本題考查自定義函數編寫和調用。①在字典u中判斷用戶名a是否存在,密碼b是否正確,首先判斷a是否在字典b中,若存在用戶u,則該用戶的用戶名是鍵,密碼是值u[a],因此②處答案為b?。絬[a]。當兩者均正確時,需返回True。④處調用login函數,把用戶名user、密碼psd和字典u分別傳至自定義函數中。⑤處將改變trytime的值,嘗試的次數將減少一次。答案?、賏 in u ②b!=u[a]?、踨eturn True ④login(user,psd,u) ⑤trytime-=111.將圖形轉化為文本。應用Python中的Image模塊后,將字母圖片文件″OK.jpg″處理成由0,1表達的文本文件“OK.txt”。字母圖片如圖a所示,運行后文本文件結果如圖b所示。實現該功能的Python程序如下,請完成劃線處的程序代碼。from PIL import Imagedef judge(R,G,B): gray=0.299*R+0.587*G+0.114*B #轉成灰度值 color= gray/132 return colorimg = Image.open(″OK.jpg″)pix = img.load()file=open(①________,″w″) #讀寫方式打開文本文件width = img.size[0]②________for i in range(height): line=″″ for j in range(width): R,G,B=pix[j,i] #根據像素坐標獲得該點的RGB值 ③________ if color==0: line+=″1″ else: line+=″0″ file.write(line) #寫入OK.txt文件file.write(″\\n″) file.close()答案 ①″OK.txt″?、趆eight = img.size[1] ③color = judge(R,G, B)解析 本題考查Image模塊的應用。①中讀取文件名″OK.txt″。 ②中語句width = img.size[0]獲取圖像寬度,循環中for i in range(height)要求圖像的高度。③中未對color賦值,調用自定義函數,返回0或1。 展開更多...... 收起↑ 資源列表 專題8 Python程序語言基礎 學案(含解析).docx 專題8 Python程序語言基礎.pptx 縮略圖、資源來源于二一教育資源庫