资源简介 (共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