高中信息技术浙教版(2019)选修1 第三章 课时1 字符串(学案 课件,2份打包)

资源下载
  1. 二一教育资源

高中信息技术浙教版(2019)选修1 第三章 课时1 字符串(学案 课件,2份打包)

资源简介

(共73张PPT)
课时1 字符串
第三章 字符串、队列和栈
1.通过问题解决,理解字符串的概念和特性。2.掌握字符串的基本操作,并能编程实现。
目 录
CONTENTS
知识梳理
01
例题精析
02
随堂检测
03
巩固与提升
04
知识梳理
1
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)的值为6
x.find(y) 返回字符串x中子串y出现的首字符下标,若找不到,则输出-1 x=″Python″
y=″on″
x.find(y)
返回的值为4
x.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。
B
A.字符串是一种非线性表结构
B.字符串是由n(n≥0且为整数)个字符组成的有限序列
C.字符串″我的Python″的长度为10
D.已知字符串x=″Python″,则x[1]表示字符″P″
例2 十八位身份证号由六位数字地址码、八位数字出生日期码、三位数字顺序码和一位校验码组成, 其中倒数第二位是性别代码,男单女双。以下 Python 程序的功能为识别身份证中的出生日期和性别信息。则加框①②处的代码依次为(  )
B
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]
解析 本题考查字符串的切片。十八位身份证号由六位数字地址码、八位数字出生日期码,出生日期的开始位置索引号为6,月的开始位置索引号为10,取两位,因此为s[10:12]。倒数第二位是性别代码,因此索引号为16。
变式训练 有如下Python程序段:
解析 本题主要考查的是字符串组操作。本程序的功能是将字符串x进行反转操作,故答案为C。
C
x=″Python″
y=″″
for i in range(len(x)):
y=x[i]+y
程序段执行后,变量y的值为(  )
A.Python B.″Python″
C.″nohtyP″ D.nohtyP
from random import randint
res=″ ″
i,j=0,len(s)-1
while i=i:
if randint(0,1)==0: #randint(0,1)随机生成 0 或 1
  res+=s[i]
  i+=1
B
else:
  res+=s[j]
  j-=1
A.″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=i
if i-j+1==m:
sm=sm+s[j:i+1][::-1]
else:
sm=s[j:i+1]+sm
print(sm)
若输入m的值为3,则以上程序运行后,输出结果为(  )
A.nbaykqohmc B.qhmcykonba
C.nbaykohmcq D.qnbaykohmc
解析 条件i-j==m表示m个长度的切片,表达式s[j:i][::-1]表示把该切片进行反向连接。选择结构表示最后一段的切片长度,若条件i-j+1==m成立表示长度为m-1个,还是要反向,否则把剩余一段取出,放在sm的前面。而s按3个一段分,最后剩下字母q。
D
例4 有如下Python程序段:
B
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+=s1
print(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 程序段:
C
qiu=″″
x=″394-5-222-60-809″.split(″-″)
for ch in x:
 if qiu  qiu=ch+qiu
print(qiu)
执行该程序段后,输出结果是(  )
A.1203 B.605394
C.809605394 D.809394
解析 本题考查字符串基本操作。x是将字符串按″-″分隔,形成一个列表['394','5','222','60','809']。遍历列表,查找一个连续递增的字符串,并将该字符串连接在qiu的前面。
随堂检测
3
1.已知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=0
while iif ″A″<=t[i]<=″Z″:
  i+=1
  continue
elif ″a″<=t[i]<=″z″ and f[ord(t[i])-ord(″a″)]==0:
  f[ord(t[i])-ord(″a″)]+=1
A
i+=1
for 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程序段:
C
import random
s=″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=0
for i in range(len(s)) :
  if s[i]==″A″:
   c=c+1
D
 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+=x
print(k)
执行程序后,输出值为(  )
A.bcBC!BC B.bcBCCBC
C.zaZA!ZA D.zaZAAZA
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.编写一个Python程序,实现查找替换功能,下列程序的功能是:在text1字符串中,将所有的good替换为ok。
实现上述功能的程序如下,请在程序划线处填入合适的代码。
text1=″it's good,good,very very good.″
fword=″good″
cword=″ok″
text2=″″
n1=len(text1)
①________________
i=0
while i<=n1-len(fword):
if ②________________:
text2=text2+cword
i=i+n2
else:
③________________
i+=1
if 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']。
A
s=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+=s1
C
解析 本题考查字符串处理。变量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=i
return result
若某个像素点的信息为“111100000000000000000001”,则压缩后的信息为(  )
A.41003011 B.140003 C.14000311 D.140F0411
5.有如下程序段:
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=3
while ij=i-2
if s[i-1]==s[i] and s[j]==s[j-1]:
  s=s[:i]+s[i+1:]
else:
  i+=1
print(s)
执行该程序段后,变量 s 的值是(  )
A.″abc″ B.″aabbc″ C.″aabc″ D.″aabcc″
7.有如下 Python 程序段:
D
s=″5A9C3B0E7D″
ans=″″; i=0
while s[i]!=″0″:
  t=int(s[i])
  ans+=s[t]
  i=t-1
print(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程序段如下:
D
s='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+s1
print(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=[″″]*6
for i in s:
  if i==b[k]:
 k-=1
  else:
  k+=1
D
 b[k]=i
for 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=0
if len(s1)!=len(s2):
print(″两个字符串不相同″)
else:
while i  c1=s1[i];c2=s2[i]
   if c1==c2:
     ②________________
  else:
    if ③________________:
       i+=1
    else:
      break
if 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 ek
s=input(″输入原文:″)
key=input(″输入秘钥:″)
keyn=change(key)
ch=″″
for i in range(len(s)):
k=keyn[②________]
if ' a'<=s[i]<='z':
 ch=③________
 result=result+ch
elif '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=0
length=n
f=[0]*26
for i in range(n):
if f[s[i]]==0:
    k=k+1
f[s[i]]=f[s[i]]+1
while ②________________:
f[s[pos]]=f[s[pos]]-1
if ③________________:
    k-=1
    if i-pos+1      length=i-pos+1
      res=text[pos:pos+length]
      left=pos
pos+=1
if 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)的值为6
x.find(y) 返回字符串x中子串y出现的首字符下标,若找不到,则输出-1 x=″Python″ y=″on″ x.find(y) 返回的值为4
x.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″的长度为10
D.已知字符串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 randint
res=″ ″
i,j=0,len(s)-1
while i=i:
if randint(0,1)==0: #randint(0,1)随机生成 0 或 1
  res+=s[i]
  i+=1
else:
  res+=s[j]
  j-=1
A.″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=i
if i-j+1==m:
sm=sm+s[j:i+1][::-1]
else:
sm=s[j:i+1]+sm
print(sm)
若输入m的值为3,则以上程序运行后,输出结果为(  )
A.nbaykqohmc B.qhmcykonba
C.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+=s1
print(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+qiu
print(qiu)
执行该程序段后,输出结果是(  )
A.1203 B.605394 C.809605394 D.809394
1.已知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=0
while iif ″A″<=t[i]<=″Z″:
  i+=1
  continue
elif ″a″<=t[i]<=″z″ and f[ord(t[i])-ord(″a″)]==0:
  f[ord(t[i])-ord(″a″)]+=1
i+=1
for i in range(26):
if f[i]==1:
  print(chr(i+ord(″a″)),end=″″)
执行以上程序段后,输出的内容为(  )
A.dentu B.Student C.tuden D.deintux
3.英语单词″illustriousness″意思是优秀,有如下Python程序段:
import random
s=″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
4.现有一个只包含字符“A”“B”的字符串s,并且两类字符的总数量刚好相等。将其尽可能地分割成多段,使得每一段中包含相同数量的″A″、″B″,输出每一段的范围。例如,当s=″ABAABABBAB″时,根据要求最多可以分割成3段,分别为[0,1],[2,7],[8,9],如下Python程序段实现该功能。
s=″ABAABABBAB″
c=0;pos=0
for 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+=x
print(k)
执行程序后,输出值为(  )
A.bcBC!BC B.bcBCCBC C.zaZA!ZA D.zaZAAZA
6.编写一个Python程序,实现查找替换功能,下列程序的功能是:在text1字符串中,将所有的good替换为ok。
实现上述功能的程序如下,请在程序划线处填入合适的代码。
text1=″it's good,good,very very good.″
fword=″good″
cword=″ok″
text2=″″
n1=len(text1)
①________________
i=0
while i<=n1-len(fword):
if ②________________:
text2=text2+cword
i=i+n2
else:
③________________
i+=1
if 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]。

展开更多......

收起↑

资源列表