資源簡介 (共73張PPT)課時1 字符串第三章 字符串、隊列和棧1.通過問題解決,理解字符串的概念和特性。2.掌握字符串的基本操作,并能編程實現。目 錄CONTENTS知識梳理01例題精析02隨堂檢測03鞏固與提升04知識梳理11.字符串的概念(1)字符串是由零個或多個字符組成的有限序列。(2)字符串長度:字符串中所包含字符的個數。(3)主要形式有:'Python'、″Python″、″'Python'″。正確區分空串和空格串空串是指不包含任何字符的串,其長度為零。而空格串是指由空格符組成的字符串,其長度為空格字符的個數。2.字符串的特性(1)有限序列性字符串的數據元素個數是有限的。(2)字符串的可比性若比較的字符串中的字符為ASCII字符集,則按字符的ASCII碼值進行比較。3.字符串的基本操作(1)子串判斷子串判斷用于檢查字符串a是否為字符串b的子串,可用in運算實現。(2)求子串求子串用于從字符串中取出其子串,可用切片實現。(3)字符串的連接字符串的連接用于把兩個字符串連接在一起,用“+”號實現。4.Python字符串常用函數和方法Python字符串常用函數和方法函數和方法 功能 實例len(x) 統計字符串x中字符的個數 x=″Python″len(x)的值為6x.find(y) 返回字符串x中子串y出現的首字符下標,若找不到,則輸出-1 x=″Python″y=″on″x.find(y)返回的值為4x.split(str=″″,num=string.count(str)) 以str分隔符切片x,若有num的指定值,則表示僅分隔num+1個子串,否則分隔所有子串 x=″1,2,3,4″y=x.split(″,″)y列表的內容為:['1','2','3','4']x.replace (old,new[,max]) 返回字符串中的old替換成new后的新字符串,若指定max,則表示替換不超過max次 x=″This data is new data.″x.replace(″data″,″bag″)執行后x字符串為:'This bag is new bag.'x.upper() 把字符串x中的小寫字母轉換成大寫字母 x=″Python″x.upper()執行后x字符串為:'PYTHON'x.lower() 把字符串x中的大寫字母轉換成小寫字母 x=″Python″x.lower()執行后x字符串為:'python'5.正則表達式(1)正則表達式是用一些特定的字符組成的一個“規則字符串”。(2)作用:它可以實現檢查一個字符串中是否含有某種子串、將匹配的子串替換或從字符串中取出符合某個條件的子串等操作。例題精析2例1 下列有關字符串描述正確的是( )B解析 本題考查字符串的特性。A選項空串是指不包含任何字符的串,其長度為零。B選項字符串具有可以比較性,按ASCII碼值進行比較。C選項字符串的內容不能修改,只能重新連接。D選項字符串中字符還包含位置,如″ac″不是″abc″的子串。A.空串指由一個空格字符組成的字符串B.字符串中的字符可以按ASCII碼值進行比較C.表達式s[3]=″a″的功能是將字符串s第4個位置的字符串修改為″a″D.字符串a各個字符出現在字符串b中,則表達式a in b的值為True變式訓練 下列有關字符串的描述正確的是( )解析 本題主要考查的是字符串的特性。字符串是一種線性表結構,因此,選項A錯誤;字符串″我的 Python″的長度為8,一個中文或英文字符的長度均為1,因此,C選項錯誤;已知字符串x=″Python″,則x[1]表示字符″y″,因為字符串的第一個位置的索引號為0,因此D選項錯誤;字符串是由零個或多個字符組成的有限序列,即字符串是由n(n≥0且為整數)個字符組成的有限序列,因此,答案為B。BA.字符串是一種非線性表結構B.字符串是由n(n≥0且為整數)個字符組成的有限序列C.字符串″我的Python″的長度為10D.已知字符串x=″Python″,則x[1]表示字符″P″例2 十八位身份證號由六位數字地址碼、八位數字出生日期碼、三位數字順序碼和一位校驗碼組成, 其中倒數第二位是性別代碼,男單女雙。以下 Python 程序的功能為識別身份證中的出生日期和性別信息。則加框①②處的代碼依次為( )BA.①s[10:11] ②xb[int(s[-2])%2]B.①s[10:12] ②xb[int(s[16])%2]C.①s[-12:10] ②xb[int(s[16])%2]D.①s[-12:-6] ②xb[(int(s[-2])+1)%2]解析 本題考查字符串的切片。十八位身份證號由六位數字地址碼、八位數字出生日期碼,出生日期的開始位置索引號為6,月的開始位置索引號為10,取兩位,因此為s[10:12]。倒數第二位是性別代碼,因此索引號為16。變式訓練 有如下Python程序段:解析 本題主要考查的是字符串組操作。本程序的功能是將字符串x進行反轉操作,故答案為C。Cx=″Python″y=″″for i in range(len(x)):y=x[i]+y程序段執行后,變量y的值為( )A.Python B.″Python″C.″nohtyP″ D.nohtyPfrom 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+=1Belse: 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,0。B選項產生″ae″,i和j分別指向b和d,因此不可能連接到c。C選項產生的隨機數為0,1,1,0,0或0,1,1,0,1。D選項產生的隨機數均為1或1,1,1,1,0。變式訓練 有如下Python程序段:s=″abnokycmhq″m=int(input(″輸入一個數:″))j=0;sm=″″for i in range(len(s)) : if i-j==m:sm=sm+s[j:i][::-1]j=iif i-j+1==m:sm=sm+s[j:i+1][::-1]else:sm=s[j:i+1]+smprint(sm)若輸入m的值為3,則以上程序運行后,輸出結果為( )A.nbaykqohmc B.qhmcykonbaC.nbaykohmcq D.qnbaykohmc解析 條件i-j==m表示m個長度的切片,表達式s[j:i][::-1]表示把該切片進行反向連接。選擇結構表示最后一段的切片長度,若條件i-j+1==m成立表示長度為m-1個,還是要反向,否則把剩余一段取出,放在sm的前面。而s按3個一段分,最后剩下字母q。D例4 有如下Python程序段:Bcode=″0123456789ABCDEF″RGB=″255,96,8″.split(″,″)ans=″#″for c in RGB: s1=″″;t=int(c) for i in range(2): s1=code[t%16]+s1 t∥=16 ans+=s1print(ans)執行程序后,輸出的結果為( )A.#FF0608 B.#FF6008 C.#8060FF D.#6E60FF解析 本題考查字符串的基本操作。RGB是將字符串按逗號分隔,形成一個列表['255','96','8']。程序的功能是將列表中三個字符串轉換成數值類型,并用十六進制表示。for i in range(2)表示循環2次,若轉換后十六進制只有一位數字,也要在前面加0。語句s1=code[t%16]+s1表示將取出的余數反向連接。變式訓練 有如下 Python 程序段:Cqiu=″″x=″394-5-222-60-809″.split(″-″)for ch in x: if qiu qiu=ch+qiuprint(qiu)執行該程序段后,輸出結果是( )A.1203 B.605394C.809605394 D.809394解析 本題考查字符串基本操作。x是將字符串按″-″分隔,形成一個列表['394','5','222','60','809']。遍歷列表,查找一個連續遞增的字符串,并將該字符串連接在qiu的前面。隨堂檢測31.已知s=″Python is so easy!″,下列表達式的值是″is″的是( )C解析 本題主要考查的是字符串的切片操作。字符串中第一個字符的索引號為0,切片操作時,只能取到下標end前面位置上的字符,s[7:9]的值為″is″,因此,答案為C。A.s[8:9] B.s[7:8] C.s[7:9] D.s[8:10]2.有如下 Python 程序段:s=″CixiStudent″f=[0]*26;t=s[4:]i=0while iif ″A″<=t[i]<=″Z″: i+=1 continueelif ″a″<=t[i]<=″z″ and f[ord(t[i])-ord(″a″)]==0: f[ord(t[i])-ord(″a″)]+=1Ai+=1for i in range(26):if f[i]==1: print(chr(i+ord(″a″)),end=″″)執行以上程序段后,輸出的內容為( )A.dentu B.Student C.tuden D.deintux解析 f數組分別存儲小寫字母a-z的個數。如果是大寫字母,則跳過,如果是小寫字母,且沒有出現過,列表對應位置加 1,再從小到大輸出對應字母。3.英語單詞″illustriousness″意思是優秀,有如下Python程序段:Cimport randoms=″illustriousness″for i in range(4): k=random.randint(0,4)*random.randint(0,3) print(s[k],end=″″)解析 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。4.現有一個只包含字符“A”“B”的字符串s,并且兩類字符的總數量剛好相等。將其盡可能地分割成多段,使得每一段中包含相同數量的″A″、″B″,輸出每一段的范圍。例如,當s=″ABAABABBAB″時,根據要求最多可以分割成3段,分別為[0,1],[2,7],[8,9],如下Python程序段實現該功能。s=″ABAABABBAB″c=0;pos=0for i in range(len(s)) : if s[i]==″A″: c=c+1D if (1)________________: print(″[″,pos,″,″,i,″]″)(2)________________上述程序段中劃線處可選語句為:①i-pos==c②i-c==c ③i-c+l==c ④pos=i ⑤pos=i+l則(1)(2)處的語句依次可為( )A.①⑤ B.②④ C.③④ D.③⑤解析 當s[i]為″A″時,c每次加1,即c是所有″A″的數量。每一段中包含相同數量的″A″、″B″,當前共i+1個字母中,″B″的數量也應該是c個,即i+1=2*c。pos是每段開始位置,當前位置i是每段結束位置,因此pos的值為i+1。5.有如下程序段:s=″abAB!AB″;k=x=″″for i in s: if ″a″<=i<=″z″: x=chr((ord(i)-98)%26+97) elif ″A″<=i<=″Z″: x=chr((ord(i)-40)%26+65) k+=xprint(k)執行程序后,輸出值為( )A.bcBC!BC B.bcBCCBCC.zaZA!ZA D.zaZAAZAD解析 本題考查字母的加密。a的內碼為97,ord(i)-98等效于ord(i)-97-1,表達式(ord(i)-98)%26表示字母中位置循環向前移動一個位置。a的內碼為65,ord(i)-40,等效于ord(i)-65+25,等效于ord(i)-65+26-1。程序的功能是將字母循環向前移一位,非字母不連接,用該字母前一個字母代替。6.編寫一個Python程序,實現查找替換功能,下列程序的功能是:在text1字符串中,將所有的good替換為ok。實現上述功能的程序如下,請在程序劃線處填入合適的代碼。text1=″it's good,good,very very good.″fword=″good″cword=″ok″text2=″″n1=len(text1)①________________i=0while i<=n1-len(fword):if ②________________:text2=text2+cwordi=i+n2else:③________________i+=1if itext2=text2+text1[i:n1+1]print(text2)答案 ①n2=len(fword) ②text1[i:i+n2]==fword ③text2=text2+text1[i]解析 本題考查的是字符串的綜合應用。根據while循環中的語句“text2=text2+cword”和“i=i+n2”可知,n2為查找的單詞的長度,因此①處語句為n2=len(fword);劃線②處表示當前子串是否為要查找的內容,如果是,則將替換的內容拼接在字符串text2,然后將指針i移動n2個位置,因此②處的語句為text1[i:i+n2]==fword;如果當前子串不是要查找內容,則將當前字符直接拼接在字符串text2中,故③處代碼為text2=text2+text1[i]。4鞏固與提升基礎鞏固能力提升一、基礎鞏固1.已知x=″2.0+3=5.0″,下列表達式成立的是( )B解析 本題主要考查的是字符串的函數及基本運算。len(x)的值為9,因此A選項錯誤;x[:2]的值為″2.″,因此C選項錯誤;x[6::]的值為″5.0″,因此D選項錯誤;x[0]的值為″2″,x[2]的值為″0″,因為″2″>″0″,因此x[0]>x[2],故答案為B。A.len(x)==8 B.x[0]>x[2]C.x[:2]==″2.0″ D.x[6::]==″5″2.字符串變量s=″2022jiaxing″,則表達式s[1:len(s)∥2]+s[2]*2的值是( )C解析 本題主要考查的是字符串切片和運算。s[1:len(s)∥2]表示從第2個字符位置取到中間位置的前一個字符,結果為“022j”,s[2]*2表示索引第3個字符“2”重復2次,結果為“22”,最后連接兩個字符串,因此,答案為C。A.″20224″ B.″2026″ C.″022j22″ D.″022j4″3.通過鍵盤輸入一串字符串,程序輸出該字符串的所有子串。例如,下面程序段當輸入“the”時,將輸出['t','th','the','h','he','e']。As=input(″請輸入一個字符串:″)a=[]for i in range(len(s)): for j in range((1)________________):a.append((2)________________) print(a)為實現上述功能,上述程序段(1)(2)處的語句分別是( )A.①i,len(s) ②s[i:j+1] B.①i,len(s)-i+1 ②s[i:j+i]C.①i,len(s)-i+1 ②s[i:j+1] D.①i,len(s) ②s[j:j+i]解析 本題考查雙重循環和字符串的切片。i表示切片的開始位置,j表示切片的結束位置。4.某RGB色彩模式圖像信息存儲在文本文件中,文件的一行存儲圖像的一個像素,現對圖像中連續的0或1進行壓縮,某個像素的壓縮算法如下:def change(s): #對連續多個0或1進行壓縮,字符串s中不含換行符 i=1;j=0;result=″″ sd=″0123456789ABCDEF″ while i while i i+=1 d=i-j s1=s[j]+sd[d%16] if d>16: s1=s[j]+sd[0]+s1 result+=s1C解析 本題考查字符串處理。變量j表示出現相同字符的起點位置,變量i表示結束位置后面第1個位置,s[i]==s[i-1]表示有多個重復,s[j]==s[i]表示單個,不重復。d表示重復的長度,由于一個點的像素,長度為24個二進制位,當d>16條件成立時,d∥16-1的值為0。字符串中包含4個1,19個0和1個1。 j=ireturn result若某個像素點的信息為“111100000000000000000001”,則壓縮后的信息為( )A.41003011 B.140003 C.14000311 D.140F04115.有如下程序段:B解析 本題考查字符串的切片。s2的值從″bccdef″、″ccddef″變化到″cdddef″。s1=″232″s2=″abcdef″for i in s1: m=int(i) c=s2[m:m+1] s2=s2[1:m+1]+c+s2[m+1:]print(s2)執行該程序段后,變量s2的值是( )A.″eef″ B.″cdddef″ C.″dcdcdcdef″ D.″abccccdef ″6.有如下程序段:D解析 本題主要考查字符串的處理,即字符的比較和字符的刪除操作。變量s從″aabbcc″變化到″aabcc″。s=″aabbbcc″i=3while ij=i-2if s[i-1]==s[i] and s[j]==s[j-1]: s=s[:i]+s[i+1:]else: i+=1print(s)執行該程序段后,變量 s 的值是( )A.″abc″ B.″aabbc″ C.″aabc″ D.″aabcc″7.有如下 Python 程序段:Ds=″5A9C3B0E7D″ans=″″; i=0while s[i]!=″0″: t=int(s[i]) ans+=s[t] i=t-1print(ans)運行該程序段后,變量 ans 的值是( )A.″BCDEA″ B.″BCD″ C.″ABCD″ D.″BCDE″解析 變量t的值依次為5,3,9,7,對應s[t]的值依次為B、C、D、E。當i的值為6時,s[i]的值為0,結束循環。8.下列 Python 程序段功能為:輸入由英文字母組成的字符串,若字符串中有連續升序段(相鄰字符 ASCII 碼值增量為 1),則把該升序段縮寫為“首字符-尾字符”構成的新字符串。例如:字符串為“abcbxy”,則縮寫成“a-cbx-y”。s=input(″請輸入字符串:″)k=len(s);flag=False;result=″″for i in range(0,k-1): if ①________________ : result=result+s[i]+″-″ flag=True elif ord(s[i])!=ord(s[i+1])-1: result=result+s[i] flag=False②________________print(″縮寫后的字符串為″,result)則劃線處應填入的代碼為( )A.①ord(s[i])==ord(s[i+1])-1 and flag ②result=result+s[i]B.① ord(s[i])==ord(s[i+1])-1 and not flag ②result=result+s[i]C.① ord(s[i])==ord(s[i+1])-1 and flag ②result=result+s[i+1]D.① ord(s[i])==ord(s[i+1])-1 and not flag ②result=result+s[i+1]D解析 本題考查字符串操作。①語句result=result+s[i]+″-″是連接首字母,接著flag為True,因此flag表示是否找到起點,該空表示的是連續升序且為起點。②循環的條件for i in range(0,k-1),只處理前k-1個字符,最后一個字符沒有處理。9.某字符串s是由一個原始字符串反復重疊形成的。例如字符串″abcababcababcab″的是由原始字符串″abcab″重疊而成。檢測的算法:將該字符串劃分成若干段,若字符串每一段與第一段相同,則認為該字符串是由這段字符重疊而成。為查找字符串s的原始字符串,有如下程序段:s=″abcababcababcababcababcab″n=len(s);ans=″″for i in range(1,n∥2+1): if ①________________ for j in range(i,n,i): if ②________________ break else: ans=s[:i]print(″原始串是:″,ans)將劃線處填寫完整。答案 ①n %i==0 ②s[j:j+i]!=s[:i]解析 本題考查雙重遍歷的算法思想。一個原始字符串反復重疊,該原始字符串長度必定能被n整除,條件n %i==0成立表示該長度i是n的因子,可能是原始字符串s[:i+1]的長度,字符串s從第0個位置開始,到i-1位置是原始字符串,從i開始,每i個長度的字符串s[j:j+i]是否是原始字符串,如果不是說明這段中不符合原始字符串。10.有Python程序段如下:Ds='I Love You HangZhou!'s1=''for i in range(0,len(s),3): c=s[i] if ord(c)>=ord('a'): c=chr(ord(c)-ord('a')+ord('A')) s1=c+s1print(s1)程序運行后,輸出的值是( )A.OUAZU B.OUAU C.UZAUO D.UAUO解析 本題考查range函數的使用以及程序基本代碼的閱讀能力。根據range函數的參數,是從字符串s中從索引0開始,依次取出下標為0、3、6……位置的字符,如果字符是小寫,將它轉為大寫,并按逆序依次拼接。答案為D。11.有如下Python程序段:s=″abbaddcab″k=0;r=″″b=[″″]*6for i in s: if i==b[k]: k-=1 else: k+=1D b[k]=ifor i in range(1,k+1): print(b[i],end=″″)執行該程序段后,輸出的內容是( )A.abdc B.aacab C.c D.cab解析 本題考查程序結構的靈活應用。程序算法為:依次從左向右提取s中每一個字符,如果與b[k]中字符不一致,則將該字符存儲到b[k+1]中,如果一致,則k=k-1。12.判斷兩個字符串是否相等:規定字符“?”為萬能字符,即可與任意一個字符相等,在忽略字符串中空格以及不區分大小寫的前提下,判斷兩個字符串是否相同。Python程序運行界面如圖所示。請輸入一個字符串:?? a d ??dad wd請輸入另一個字符串:a a c?d?d w 兩個字符串相同(1)根據以上規則字符串’??ad??dad wd’和字符串’a???c?d?d?d’是否相等____(填:是/否)。(2)實現上述功能的Python程序如下,請在劃線處填入適當的代碼。s1=input(″請輸入一個字符串:″)s2=input(″請輸入另一個字符串:″)s1=s1.upper()s2=s2.upper()s=″″#將字符串s1中的空格去掉for i in s1:if i !=″″:①________________s1=s#同上,將字符串s2中的空格去掉,代碼略i=0if len(s1)!=len(s2):print(″兩個字符串不相同″)else:while i c1=s1[i];c2=s2[i] if c1==c2: ②________________ else: if ③________________: i+=1 else: breakif i==len(s1):print(″兩個字符串相同″)else:print(″兩個字符串不相同″)答案 (1)是 (2)①s=s+i ②i+=1 ③c1==″?″ or c2==″?″解析 本題主要考查字符串的綜合應用。(1)依照題意,‘?’作為萬能字符與任意字符相等,問題中的兩個字符串依次比較是相等的。(2)填空①處實現去掉字符串s1的空格,所以遍歷字符串時為非空格的時候,進行字符的連接,因此①處答案是s=s+i;填空②處當遍歷至相同位置的字符相等時,則進行下一個位置的字符比較,因此②處答案是i+=1;填空③處當兩個相同位置的字符不相等時,則考慮“?”作為萬能字符情況,因此③處答案是c1==″?″ or c2==″?″。13.小張參加學校舉行的密碼破解攻防比賽,他需要在規定時間破解對手密碼。比賽時,小張發現對方密文可能采用凱撒加密,這是一種簡單且廣為人知的加密技術,方法是將明文中的所有字母都在字母表上向后(或向前)按照一個固定數目進行偏移后被替換成密文,非字母保持原狀。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,Z變成C,以此類推。小張為了增加破解難度,決定在凱撒加密基礎上,引入密鑰字符串,密鑰字符及對應的偏移量如下表所示,密鑰字符串長度不夠時,可循環使用。密鑰 A B C D E F G H I J K L M偏移量 0 1 2 3 4 5 6 7 8 9 10 11 12密鑰 N O P Q R S T U V W X Y Z偏移量 13 14 15 16 17 18 19 20 21 22 23 24 25例如:若輸入明文為:Hello,輸入密鑰為:ABC,則得到密文為:Hfnlp(1)若明文:ZhouShan密鑰為:LOVE,則密文為:________(2)引入密鑰后的加密算法的Python程序代碼如下:def change(x):ek=[]for c in x: if ' a'<=c<='z': ①________ elif ' A'<=c<='Z': #與小寫字母相似處理,代碼略return eks=input(″輸入原文:″)key=input(″輸入秘鑰:″)keyn=change(key)ch=″″for i in range(len(s)):k=keyn[②________]if ' a'<=s[i]<='z': ch=③________ result=result+chelif 'A'<=s[i]<='Z': #與小寫字母相似處理,代碼略else: result=result+s[i]print(result)(2)在劃線處填寫合適代碼,完善程序。(3)程序調試過程中,出現如下錯誤提示“NameError:name' result' is not defined”,產生此錯誤的原因是___________________________________________________。答案 (1)KvjyDvvr(2)①ek.append(ord(c)-ord(″a″))②i%len(keyn)③chr(ord(s[i])-ord(″a″)+k)%26+ord(″a″))(3)變量result沒有賦初始值解析 本題主要考查字符串的綜合應用。(1)根據表中提供數據,密鑰LOVE對應的偏移量分別是11,14,21,17,可得ZhouShan的密文是KvjyDvvr;(2)①自定義函數change(x)將密鑰字符轉成對應的偏移量,結果存放在數組ek中,根據表中字母對應的偏移量,所以此處應填ek.append(ord(c)-ord(″a″));②遍歷明文字符應取密鑰列表中的每一個偏移量,由于密鑰長度可能小于明文長度,需循環使用,所以此處應填i%len(keyn);③將原字符的字母按照密鑰的偏移值進行位移,由于需在字母范圍內進行循環位移,因此此處答案為chr(ord(s[i]-ord(″a″)+k)%26+ord(″a″));(3)在python中變量沒有賦初始值,表示沒有定義。14.查找包含26個小寫字母的最短字符串:輸入任意一串包含小寫字母的字符串(長度n>=26),要求找到長度最小的一段區間,能夠包含全部26個小寫英文字母。小王設計了Python程序用于搜索最短字符串,若無解,則輸出“無解!”,反之輸出該最小區間的長度以及字符的開始位置,并輸出相應的最短字符串,程序界面如圖所示:請輸入字符串內容:wurfabcdefghijklmnopqrstuvwxyzzsdf包含26個字母的字符串為:abcdefghijklmnopqrstuvw最短長度:26 開始位置:4本題的算法思想是:①確定初始右邊界:從第1個字符開始,向右搜索到包含全部26個字母的子串,并因此而確定右邊界,同時記錄每個字母在子串中出現過的次數。②調整子串左邊界:若左邊界有重復的字母則表明該子串可縮短,故左邊可右移1位,……直到找到一個符合條件的子串并記錄,然后子串左邊界再右移1位。③調整子串右邊界:子串右邊界繼續右移,在新子串符合條件后,記錄并進行比較。重復②各調整步驟,直至遍歷完整個字符串,獲得并輸出滿足條件的最小長度字符串。實現上述功能的Python程序如下,請回答下列問題。text=input(″請輸入字符串內容:″)n=len(text)s=[0 for i in range(n)]for i in range(n):①________________res=″″k=left=pos=0length=nf=[0]*26for i in range(n):if f[s[i]]==0: k=k+1f[s[i]]=f[s[i]]+1while ②________________:f[s[pos]]=f[s[pos]]-1if ③________________: k-=1 if i-pos+1 length=i-pos+1 res=text[pos:pos+length] left=pospos+=1if res !=″″:print(″包含26個字母的字符串為:″,res)print(″最短長度:″,length,″開始位置:″,left)else:print(″無解!″)(1)對于字符串“abfabcfdeefed”,包含字母“abcdef”的最短字符串長度為________(填數字)。(2)請在劃線處填入合適的代碼。答案 (1)6 (2)①s[i]=ord(text[i])-97或s[i]=ord(text[i])-ord(″a″) ② k>=26 或 k==26 ③f[s[pos]]==0解析 本題主要考查字符串的綜合應用。(1)包括字母“abcdef”的最短字符串為“abcfde”,長度為6。(2)①處代碼表示求每個輸入的小寫字母在字母表中的位置,其中字母“a”的位置為0,其他字母依次類推,因此①處代碼為s[i]=ord(text[i])-ord(″a″),小寫字母a的ASCII為97,故也可以寫為s[i]=ord(text[i])-97;②處代碼表示當前字符串已包含26個字母時的處理, 變量k表示字母的種類數,如果字符串中已包含26個字母,則進行優化處理,看能否調整字符串的左邊界,因此②處代碼為k>=26或 k==26;③處代碼表示條件左邊界不能再調整的情況,表示該子串不可再縮短,因此③處代碼為f[s[pos]]==0。課時1 字符串課時目標1.通過問題解決,理解字符串的概念和特性。2.掌握字符串的基本操作,并能編程實現。1.字符串的概念(1)字符串是由零個或多個字符組成的有限序列。(2)字符串長度:字符串中所包含字符的個數。(3)主要形式有:'Python'、″Python″、″'Python'″。正確區分空串和空格串空串是指不包含任何字符的串,其長度為零。而空格串是指由空格符組成的字符串,其長度為空格字符的個數。2.字符串的特性(1)有限序列性字符串的數據元素個數是有限的。(2)字符串的可比性若比較的字符串中的字符為ASCII字符集,則按字符的ASCII碼值進行比較。3.字符串的基本操作(1)子串判斷子串判斷用于檢查字符串a是否為字符串b的子串,可用in運算實現。(2)求子串求子串用于從字符串中取出其子串,可用切片實現。(3)字符串的連接字符串的連接用于把兩個字符串連接在一起,用“+”號實現。4.Python字符串常用函數和方法Python字符串常用函數和方法函數和方法 功能 實例len(x) 統計字符串x中字符的個數 x=″Python″ len(x)的值為6x.find(y) 返回字符串x中子串y出現的首字符下標,若找不到,則輸出-1 x=″Python″ y=″on″ x.find(y) 返回的值為4x.split(str=″″,num=string.count(str)) 以str分隔符切片x,若有num的指定值,則表示僅分隔num+1個子串,否則分隔所有子串 x=″1,2,3,4″ y=x.split(″,″) y列表的內容為: ['1','2','3','4']x.replace (old,new[,max]) 返回字符串中的old替換成new后的新字符串,若指定max,則表示替換不超過max次 x=″This data is new data.″ x.replace(″data″,″bag″) 執行后x字符串為:'This bag is new bag.'x.upper() 把字符串x中的小寫字母轉換成大寫字母 x=″Python″ x.upper() 執行后x字符串為: 'PYTHON'x.lower() 把字符串x中的大寫字母轉換成小寫字母 x=″Python″ x.lower() 執行后x字符串為: 'python'5.正則表達式(1)正則表達式是用一些特定的字符組成的一個“規則字符串”。(2)作用:它可以實現檢查一個字符串中是否含有某種子串、將匹配的子串替換或從字符串中取出符合某個條件的子串等操作。例1 下列有關字符串描述正確的是( )A.空串指由一個空格字符組成的字符串B.字符串中的字符可以按ASCII碼值進行比較C.表達式s[3]=″a″的功能是將字符串s第4個位置的字符串修改為″a″D.字符串a各個字符出現在字符串b中,則表達式a in b的值為True聽課筆記: 變式訓練 下列有關字符串的描述正確的是( )A.字符串是一種非線性表結構B.字符串是由n(n≥0且為整數)個字符組成的有限序列C.字符串″我的Python″的長度為10D.已知字符串x=″Python″,則x[1]表示字符″P″例2 十八位身份證號由六位數字地址碼、八位數字出生日期碼、三位數字順序碼和一位校驗碼組成, 其中倒數第二位是性別代碼,男單女雙。以下 Python 程序的功能為識別身份證中的出生日期和性別信息。則加框①②處的代碼依次為( )s=input(″輸入身份證號″)xb=['女','男']print('出生日期為:',s[6:10]+'年'++'月'+s[12:14]+'日')print('性別為:',)A.①s[10:11] ②xb[int(s[-2])%2]B.①s[10:12] ②xb[int(s[16])%2]C.①s[-12:10] ②xb[int(s[16])%2]D.①s[-12:-6] ②xb[(int(s[-2])+1)%2]聽課筆記: 變式訓練 有如下Python程序段:x=″Python″y=″″for i in range(len(x)):y=x[i]+y程序段執行后,變量y的值為( )A.Python B.″Python″ C.″nohtyP″ D.nohtyP例3 若字符串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″聽課筆記: 變式訓練 有如下Python程序段:s=″abnokycmhq″m=int(input(″輸入一個數:″))j=0;sm=″″for i in range(len(s)) : if i-j==m:sm=sm+s[j:i][::-1]j=iif i-j+1==m:sm=sm+s[j:i+1][::-1]else:sm=s[j:i+1]+smprint(sm)若輸入m的值為3,則以上程序運行后,輸出結果為( )A.nbaykqohmc B.qhmcykonbaC.nbaykohmcq D.qnbaykohmc例4 有如下Python程序段:code=″0123456789ABCDEF″RGB=″255,96,8″.split(″,″)ans=″#″for c in RGB: s1=″″;t=int(c) for i in range(2): s1=code[t%16]+s1 t∥=16 ans+=s1print(ans)執行程序后,輸出的結果為( )A.#FF0608 B.#FF6008 C.#8060FF D.#6E60FF聽課筆記: 變式訓練 有如下 Python 程序段:qiu=″″x=″394-5-222-60-809″.split(″-″)for ch in x: if qiu qiu=ch+qiuprint(qiu)執行該程序段后,輸出結果是( )A.1203 B.605394 C.809605394 D.8093941.已知s=″Python is so easy!″,下列表達式的值是″is″的是( )A.s[8:9] B.s[7:8] C.s[7:9] D.s[8:10]2.有如下 Python 程序段:s=″CixiStudent″f=[0]*26;t=s[4:]i=0while iif ″A″<=t[i]<=″Z″: i+=1 continueelif ″a″<=t[i]<=″z″ and f[ord(t[i])-ord(″a″)]==0: f[ord(t[i])-ord(″a″)]+=1i+=1for i in range(26):if f[i]==1: print(chr(i+ord(″a″)),end=″″)執行以上程序段后,輸出的內容為( )A.dentu B.Student C.tuden D.deintux3.英語單詞″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.siur4.現有一個只包含字符“A”“B”的字符串s,并且兩類字符的總數量剛好相等。將其盡可能地分割成多段,使得每一段中包含相同數量的″A″、″B″,輸出每一段的范圍。例如,當s=″ABAABABBAB″時,根據要求最多可以分割成3段,分別為[0,1],[2,7],[8,9],如下Python程序段實現該功能。s=″ABAABABBAB″c=0;pos=0for i in range(len(s)) : if s[i]==″A″: c=c+1 if (1)________________: print(″[″,pos,″,″,i,″]″)(2)________________上述程序段中劃線處可選語句為:①i-pos==c②i-c==c ③i-c+l==c ④pos=i ⑤pos=i+l則(1)(2)處的語句依次可為( )A.①⑤ B.②④ C.③④ D.③⑤5.有如下程序段:s=″abAB!AB″;k=x=″″for i in s: if ″a″<=i<=″z″: x=chr((ord(i)-98)%26+97) elif ″A″<=i<=″Z″: x=chr((ord(i)-40)%26+65) k+=xprint(k)執行程序后,輸出值為( )A.bcBC!BC B.bcBCCBC C.zaZA!ZA D.zaZAAZA6.編寫一個Python程序,實現查找替換功能,下列程序的功能是:在text1字符串中,將所有的good替換為ok。實現上述功能的程序如下,請在程序劃線處填入合適的代碼。text1=″it's good,good,very very good.″fword=″good″cword=″ok″text2=″″n1=len(text1)①________________i=0while i<=n1-len(fword):if ②________________:text2=text2+cwordi=i+n2else:③________________i+=1if itext2=text2+text1[i:n1+1]print(text2)課時1 字符串例題精析例1 B [本題考查字符串的特性。A選項空串是指不包含任何字符的串,其長度為零。B選項字符串具有可以比較性,按ASCII碼值進行比較。C選項字符串的內容不能修改,只能重新連接。D選項字符串中字符還包含位置,如″ac″不是″abc″的子串。]變式訓練 B [本題主要考查的是字符串的特性。字符串是一種線性表結構,因此,選項A錯誤;字符串″我的 Python″的長度為8,一個中文或英文字符的長度均為1,因此,C選項錯誤;已知字符串x=″Python″,則x[1]表示字符″y″,因為字符串的第一個位置的索引號為0,因此D選項錯誤;字符串是由零個或多個字符組成的有限序列,即字符串是由n(n≥0且為整數)個字符組成的有限序列,因此,答案為B。]例2 B [本題考查字符串的切片。十八位身份證號由六位數字地址碼、八位數字出生日期碼,出生日期的開始位置索引號為6,月的開始位置索引號為10,取兩位,因此為s[10:12]。倒數第二位是性別代碼,因此索引號為16。]變式訓練 C [本題主要考查的是字符串組操作。本程序的功能是將字符串x進行反轉操作,故答案為C。]例3 B [變量i和j從兩端向中間遍歷,當i大于j時結束循環。若產生隨機數為0,將s[i]連接到res中,向后移動i,否則將s[j]連接到res中,向前移動j。A選項產生的隨機數為0,0,0,1,0。B選項產生″ae″,i和j分別指向b和d,因此不可能連接到c。C選項產生的隨機數為0,1,1,0,0或0,1,1,0,1。D選項產生的隨機數均為1或1,1,1,1,0。]變式訓練 D [條件i-j==m表示m個長度的切片,表達式s[j:i][::-1]表示把該切片進行反向連接。選擇結構表示最后一段的切片長度,若條件i-j+1==m成立表示長度為m-1個,還是要反向,否則把剩余一段取出,放在sm的前面。而s按3個一段分,最后剩下字母q。]例4 B [本題考查字符串的基本操作。RGB是將字符串按逗號分隔,形成一個列表['255','96','8']。程序的功能是將列表中三個字符串轉換成數值類型,并用十六進制表示。for i in range(2)表示循環2次,若轉換后十六進制只有一位數字,也要在前面加0。語句s1=code[t%16]+s1表示將取出的余數反向連接。]變式訓練 C [本題考查字符串基本操作。x是將字符串按″-″分隔,形成一個列表['394','5','222','60','809']。遍歷列表,查找一個連續遞增的字符串,并將該字符串連接在qiu的前面。]隨堂檢測1.C [本題主要考查的是字符串的切片操作。字符串中第一個字符的索引號為0,切片操作時,只能取到下標end前面位置上的字符,s[7:9]的值為″is″,因此,答案為C。]2.A [f數組分別存儲小寫字母a-z的個數。如果是大寫字母,則跳過,如果是小寫字母,且沒有出現過,列表對應位置加 1,再從小到大輸出對應字母。]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。]4.D [當s[i]為″A″時,c每次加1,即c是所有″A″的數量。每一段中包含相同數量的″A″、″B″,當前共i+1個字母中,″B″的數量也應該是c個,即i+1=2*c。pos是每段開始位置,當前位置i是每段結束位置,因此pos的值為i+1。]5.D [本題考查字母的加密。a的內碼為97,ord(i)-98等效于ord(i)-97-1,表達式(ord(i)-98)%26表示字母中位置循環向前移動一個位置。a的內碼為65,ord(i)-40,等效于ord(i)-65+25,等效于ord(i)-65+26-1。程序的功能是將字母循環向前移一位,非字母不連接,用該字母前一個字母代替。]6.①n2=len(fword) ②text1[i:i+n2]==fword③text2=text2+text1[i]解析 本題考查的是字符串的綜合應用。根據while循環中的語句“text2=text2+cword”和“i=i+n2”可知,n2為查找的單詞的長度,因此①處語句為n2=len(fword);劃線②處表示當前子串是否為要查找的內容,如果是,則將替換的內容拼接在字符串text2,然后將指針i移動n2個位置,因此②處的語句為text1[i:i+n2]==fword;如果當前子串不是要查找內容,則將當前字符直接拼接在字符串text2中,故③處代碼為text2=text2+text1[i]。 展開更多...... 收起↑ 資源列表 第三章 課時1 字符串 學案(含答案).docx 第三章 課時1 字符串.pptx 縮略圖、資源來源于二一教育資源庫