内容正文:
高效作业13[第13课 程序强化——字符处理]
【A级 新教材落实与巩固】
1.2024·舟山地区检测有如下Python 程序段:
t=0
s=”3abc21”
for i in s:
if ”0”<=i<=”9”:
t=t*2+1
else:
t=t*2
print(t)
执行该程序段后,输出的结果是( C )
A.6 B.7 C.35 D.321
【解析】 执行过程如下表所示,选项C正确。
i
”3”
”a”
”b”
”c”
”2”
”1”
t
1
2
4
8
17
35
2.有如下Python 程序段:
s=”水果5fRU2IT!”
ans=res=””
for x in s:
if ”a”<=x<=”z”:
ans=ans+chr(ord(x)-32)
elif ”A”<=x<=”Z”:
ans=ans+chr(ord(x)+32)
elif ”0”<=x<=”9”:
res=res+x
t=ans+res
print(t)
执行该程序段后,输出的结果是( C )
A.5fRU2IT B.5Fru2it
C.Fruit52 D.52Fruit
【解析】 将大写字母转换为小写字母,将小写字母转换为大写字母,数字直接连接,其他字符舍去,选项C正确。
3.有如下Python程序段:
s=input(”请输入字符串: ”)
count=0
for i in s:
if i>=”0”and i<=”9”:
count+=1
print(s[count:count+3])
若输入的字符串为“AB12CCC222GGBD”,则执行该程序段后,输出的结果是( C )
A.CCC B.GGBD
C.CC2 D.C22
【解析】 程序统计数字字符的个数,输入的字符串中数字字符共有5个,则切片的位置为5,6,7,选项C正确。
4.有如下Python程序段:
m=”p25y3t12h8n5”
sum=t=0
flag=True
for ch in m:
if ”0”<=ch<=”9”:
t=t*10+int(ch)
else:
if flag==True:
sum+=t
t=0
flag=not flag
print(sum)
执行该程序段后,变量sum 的值为( D )
A.53 B.48 C.32 D.11
【解析】 将字符串中的数字串间隔取出,并转换成数字累加;利用flag实现间隔提取。选项D正确。
5.有如下Python程序段:
s=input()
t=0;sum=0
for i in s:
if '0'<=i<='9':
t=t*10+int(i)
elif 'a'<=i<='z':
sum+=t
else:
t=0
print(sum)
若输入“123sAw34”,则执行该程序段后,输出的结果是( A )
A.123 B.246 C.157 D.321
【解析】 依次实现对字符串的遍历,截取数字字符串转变为数值存入变量t中,当遇到小写字母后累加到sum中,遇到除数字及小写字母外的字符,t清零。故sum的结果为123+0=123,选项A正确。
6.有如下Python程序段:
s=”PYTHON12-30ab?cd!”
y=””
for i in range(len(s)-1,-1,-1):
ch=s[i]
if ch<=”9” and ch>=”0”:
y=ch+y
elif ch<=”z” and ch>=”a”:
y=y+ch
print(y)
执行该程序段后,输出的结果是( C )
A. ”dcba0321” B. ”dcba0321BV”
C. ”1230dcba” D. ”0321abcd”
【解析】 从后往前遍历字符串s,提取第i个字符放在ch中,若ch是数字字符,将ch拼接在y前面;若ch是小写字母,将ch拼接在y后面;若ch是其他字符,不做任何处理,选项C正确。
7.有如下Python程序段:
s='8+9+12+14'
sum=0
for i in s:
if i=='+':
sum+=t
else:
t=int(i)
print(sum)
执行该程序段后,输出的结果是( B )
A.5 B.19 C.23 D.43
【解析】 遇到“+”后,对变量t进行累加,t中存放“+”号左边最近的数字字符转换的数值。故结果为8+9+2=19,选项B正确。
8.有如下Python程序段:
s=input()
t=0
sum=0
for i in range(len(s)-1,-1,-1):
c=s[i]
if c>=”0” and c<=”9”:
t=t *10+int(c)
elif c>=”a” and c<=”z”:
sum=sum+t
else:
t=0
print(str(sum))
若输入“123aBc456”,则执行该程序段后,输出的结果是( B )
A.456 B.654 C.579 D.975
【解析】 从后往前遍历字符串s,提取第i个字符放在c中,若c是数字字符,将int(c)与t*10累加,故t用来统计当前提取出的连续数字。若c是小写字母,将t累加在sum中,若c是其他字符,将t清零,选项B正确。
9.有如下Python程序段:
s=input(”请输入任意字符串: ”)
st=””
for n in s:
if '0'<=n<='9':
st=st+n
elif 'A'<=n<='Z':
st=n+st
print(st)
若输入“Happy5New2Year9!”,则执行该程序段后,输出的结果是( D )
A.9Y2N5H B.529YNH
C.H5N2Y9 D.YNH529
【解析】 将字符串中的数字字符正序连接,大写字母逆序连接,其他字符舍去,选项D正确。
10.某数据加密算法的Python程序段如下:
s=input(”请输入明文: ”)
t=””
for ch in s:
if ”a”<=ch<=”z”:
ch=chr(ord(ch)-ord(”a”)+ord(”A”))
elif ”0”<=ch<=”9”:
ch=str((int(ch)+7)%10)
t=ch+t
print(t)
若输入明文“pyT638”,则执行该程序段后,输出的结果是( D )
A.305 B.503
C.PYT305 D.503TYP
【解析】 该程序段的功能是:遇到小写字母则将其转换为大写字母;遇到数字,则将其右移7位,其他符号无须转换,倒序输出,选项D正确。
11.2024·余姚中学检测有如下Python 程序段:
def findzm(s):
ans=””
for x in s:
if ”a”<=x<=”z”:
ans=ans+x
if ”A”<=x<=”Z”:
ans=x+ans
return ans
s1=”26Wa-Ter!”
s2=”mE2022LoN!”
ans=findzm(s1)+findzm(s2)
print(ans)
执行该程序段后,输出的结果是( D )
A.TWNLEaermo B.aerTWmoNLE
C.WTaerELNmo D.TWaerNLEmo
【解析】 函数的作用是将小写字母正序连接,大写字母逆序连接,其余字符舍去,选项D正确。
12.小明用Python编写了如下程序,程序功能为:用户输入数字串,数据间用逗号分隔,最后以逗号结尾,程序执行后输出最大的数值。下列程序段中横线处应填入的代码分别为( B )
s=input(”请输入数字串: ”)
i=j=max=0
c=t=””
while j<len(s):
c=s[j]
if c==”,”:
t=s[i:j]
if int(t)>max:
max=int(t)
①________
②________
print(max)
A.①i=i+1 ②j=j+1
B.①i=j+1 ②j=j+1
C.①j=j+1 ②i=i+1
D.①j=i+1 ②i=i+1
【解析】 若当前位置为”,”,代表一段数字串结束,与原有值比较,如果更大,则更新;其中s[i:j]为数字串切片,j是数字串的后一个位置,i是数字串开始位置;当某一段结束,则更新新一段数字串的开始位置,①为i=j+1;②为循环变量变化过程,为j=j+1。故选项B正确。
13.“不重复数”的特征是任何相邻两个数位上的数字都不相同。如 1101 是重复数,1201 是不重复数。判断某数是否为重复数的Python 程序段如下:s=input()
i=0;flag=True
while i<n-1 and flag:
if :
flag=False
i=i+1
if :
print(”重复数”)
else:
print(”不重复数”)
上述程序段中加框处可选代码有:
①flag=False ②n=len(s) ③s[i]==s[i+1]
下列选项中,代码顺序正确的是( A )
A.②③① B.①③②
C.②①③ D.③②①
【解析】 循环中,遍历字符串s,提取第i个字符和第i+1个字符,字符串s的长度是n,故(1)填n=len(s);若i个字符和第i+1个字符相同,flag=False,故(2)填s[i]==s[i+1];退出循环时根据flag的值判断是否为重复数,若flag=False,表示是重复数,故(3)填flag=False。选项A正确。
14.循环字符串:将字符串s 的头尾相连成环,再从其中某处断开得到字符串s1,则s1 为s 的循环字符串。例如字符串s=”abcd”,则”bcda””cdab””dabc”均为s 的循环字符串。现有如下Python程序段,可判断两个字符串是否为循环字符串。
s=input()
s1=input()
for i in range(len(s)):
if s1==tmp:
if flag:
print(”两个字符串是循环字符串”)
else:
print(”不是循环字符串”)
上述程序段中加框处可选代码有:
①flag=False ②flag=True ③tmp=s[i:len(s)]+s[ :i] ④tmp=s[i+1:len(s)]+s[ :i]
下列选项中,代码顺序正确的是( A )
A.①③② B.②③①
C.①④② D.②④①
【解析】 当flag 值为True 时输出循环字符串,故条件成立时flag=True,flag 初值应赋为False,所以(1)处填①,(3)处填②;tmp 应为i 处分割s 形成新的循环字符串,按照切片的语法规则s[M:N],N 处取不到字符,选④将会漏掉下标为i 的字符。选项A正确。
【B级 素养形成与评价】
15.有Python程序段功能如下:输入一个非负数,将该数各位上的数字反转得到一个新数。得到的新数,除了原数为0外,反转得到的新数最高位不应为0。程序运行界面如图所示:
实现上述功能的Python程序段如下,请在横线处填入合适的代码。
a=input('请输入数字')
s=''
①__n=len(a)__
while n>1 and a[n-1]=='0':
②__n-=1__
for i in range(n,0,-1):
s=③__s+a[i-1]__
print(s)
【解析】 借助len()函数求取字符串的长度,通过倒序,确定最后一个非零数字的位置,再从该位置开始对字符串倒序组合输出。
16.2024·知临中学检测从左往右读和从右往左读都一样的字符串称为回文串。根据回文串的特点,只要字符串左右对称,它就是回文串。判断时,可以先找到中间位置,然后将字符串的左半部分存储到left 中;再将右半部分反转后存储到right 中。若left与right 相等,则为回文串。
请回答下列问题。
(1)实现上述功能的Python程序如下,请在横线处填入合适的代码。
s=input(”请输入一个字符串: ”)
length=len(s) #串的长度
mid=length//2
left=s[0:mid] #取左半串
temp=①__s[mid:]__或其他等价答案__ #取右半串
right=”” #右半串反转
for i in range(len(temp)):
② right=right+temp[len(temp)-i-1]
或right=temp[i]+right
if left==right:
print(”Yes”)
else:
print(”No”)
(2)请在下列程序的横线处填入与第(1)小题程序功能相同的语句或语句块。
s=input(”请输入一个字符串: ”)
__s1=s[::-1]__或__s1=s[len(s)-1::-1]或s1=s[-1::-1]__
if s==s1:
print(”Yes”)
else:
print(”No”)
【解析】 (1)①取字符串的右半串s[mid:]
②右半串反转,需要逆序连接。
(2)方法2直接逆向切片。
17.编写“字符串生成”程序,实现如下功能:在输入多个正整数(以“,”为分割符和结束符),以这些整数为位置信息,依次从字符串zd中提取字符并连接成字符串。实现上述功能的Python程序段如下:
s=input(”输入各个数字,用逗号分开: ”)
zd=”python is a progranuming language.”
t,ss=””,””
for ch in s:
if ch==”,”:
①__p=int(t)__
ss=ss+zd[p-1:p]
t=””
else:
②__t=t+ch__
print(ss)
请回答下列问题。
(1)请在横线处填入合适的代码。
(2)若input 语句中输入内容的结束符缺失(即输入内容为1,18,9,9),则输出的结果是__pas__。
【解析】 (1)在input中输入位置s(字符串形式),在s中提取s,当遇到“,”时,则代表一组结束,①将p转换为整数;②当前字符不是“,”,将字符连接到t中。
(2)由于末尾没有“,”,最后一个数字不会提取。
18.判断两个字符串是否相等:规定字符“?”为万能字符,即可与任意一个字符相等,在忽略字符串中空格以及不区分大小写的前提下,判断两个字符串是否相等。程序运行界面如图所示:
请回答下列问题。
(1)根据以上规则,字符串“??ad??dadwd”和字符串“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!=” ”:
①__s=s+i__
s1=s
#同上,将字符串s2 中的空格去掉,代码略
i=0
if len(s1)!=len(s2):
print(”两个字符串不相同”)
else:
while i<len(s1):
c1=s1[i]
c2=s2[i]
if c1==c2:
②__i=i+1__或i+=1__
else:
if ③__c1==”?”__or__c2==”?”__:
i+=1
else:
break
if i==len(s1):
print(”两个字符串相等”)
else:
print(”两个字符串不相等”)
【解析】 (1)问号代表任意字符,由下面两行可知两个字符串相等。
??ad??dadwd
a???c?d?d?d
(2)①在字符串中去除空格。 ②c1==c2,则往后移。
③c1和c2不相等时,若某一个字符为“?”,则认为相等。
19.2024·长兴中学检测小温为统计某次考试成绩的加权总分编写了一个Python程序, 实现如下功能: 输入某位学生所考六科的学科名称和成绩(以“,” 为分割符和结束符), 例如“语文80.5分,数学80分,英语79.5分,物理92分,化学88分,技术90分,”, 六个科目的满分均为100分,最后求得加权总分=语文分数×1.5+数学分数×1.5+英语分数×1.5+物理分数+化学分数+技术分数。
实现上述功能的Python程序段如下:
s=input(”请输入各科名称和成绩: ”)
i=j=0
total=0
score={} #初始化为空字典
while i<len(s):
①__ch=s[i]__
if ch=”,”:
xk=s[j:j+2] # 学科名称
xkf=float(s[j+2:i-1]) #学科分数
score[xk]=xkf
j=②__i+1______
i+=1
for i in score:
if i==”语文” or i==”数学” or i==”英语”:
total=③__total+score[i]*1.5__
else:
total+=score[i]
print(total)
请回答下列问题。
(1)若输入如题干所示的内容, 则执行该程序段后,输出的加权总分为__630__。
(2)请在横线处填入合适的代码。
【解析】 (1)加权总分=80.5×1.5+79.5×1.5+80×1.5+92+88+90=630。
(2)①提取字符判断是否是“,”,若是则代表一个学科输入完整;②读取学科和学科分数,存入字典score中,学科为键,学科分数是键值;j是一个学科的开始,j=i+1;③如果是语、数、英三科,则需要*1.5。
20.某密文的解密规则是:①逐行对文档连续重复的大写字母进行去重处理(仅保留1个);②在去重后的文本中,依次取出行号所对应的字符进行连接,即为明文。
编写Python程序实现上述功能。读取密文文件“miwen.txt”,根据解密规则解密并输出明文(如图所示)。相关程序段如下,请在横线处填入合适的代码。
def merge(s):
result=s[0]
for i in range(1,len(s)):
c=s[i]
if ”A”<=c<=”Z”:
if ①__c!=s[i-1]__或s[i]!=s[i-1]__或c!=result[-1]__:
result+=c
else:
result+=c
return result
f=open(”miwen.txt”,encoding=”utf-8”)
#打开文件
line=f.readline() #从文件中读取一行
s=””
②__n=0__
while line:
temp=merge(line)
s=③__s+temp[n]__
n=n+1
line=f.readline()
f.close()
print(s)
【解析】 ①merge()函数的作用是去重,如果是大写字母,又与上一个不同,则保留。
②n的作用是标识当前是第几行,用于提取字符,行号从0开始。
③提取第n位置的字符,连接到s中。
21.2024·新昌中学检测老年机因其较大的按键,很适合老年人使用,但其中英文字母的输入方式较为麻烦,导致很多老年人不太会使用。如图所示,这是一款老年机的键盘,其字母的输入方式如下:
①若要输入英文字母“A”,则2 键按1 下;若要输入“B”,则2 键按两下;其他英文字母的输入方式同理。
②若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1 键以表示确定;若连续输入的英文字母不在同一数字键中,则不需要按1 键,直接按所要输入英文字母对应的数字键即可。
③若要输入空格,则按0 键。王老师依据该手机的字母输入规则,设计了一个Python 程序。实现输入按键被点击的顺序,显示手机中输入的英文内容的功能。
程序运行界面如图所示:
实现上述功能的程序段如下:
keyboard={”0”:” ”,”2”:”ABC”,”3”:”DEF”,”4”:”GHI”,”5”:”JKL”,”6”:”MNO”,
”7”:”PQRS”,”8”:”TUV”,”9”:”WXYZ”}
yw=input(”输入按键编号顺序:”)
①__key=yw[0]__
i=1
k=1
result=””
while i<len(yw):
if yw[i]==key:
k=k+1
else:
if yw[i]==”1”:
②__i=i+1__
result+=keyboard[key][k-1]
key=yw[i]
③__k=1__
i=i+1
result+=keyboard[key][k-1]
print(”输出的内容是:”,result)
请回答下列问题。
(1)若按键点击的顺序是“616661666166”,则手机中输入的英文是__MOON__。
(2)请在横线处填入合适的代码。
【解析】 (1)由“若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1 键以表示确定”可知,都在键6中输入,6→M;666→O;66→N。
(2)①对key赋初值,结合i=0,可知需要取第0位置的值。
②else语句中,yw[i]==”1”成立表示一个字母输入成功,直接跳过该位置。
③k是计数,统计相同键所按次数,当1个字母输入成功,则需要初始化,k的初值是1。
学科网(北京)股份有限公司
$$