




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浙江省普通高中
Python程序设计教学基础实例
浙江省浦江中学方春林
目录
第一讲取数问题..........................3
第二讲最值问题..........................5
第三讲累加专题..........................7
数字累加
字符串累加
第四讲秦九韶算法........................12
第五讲对称数(回文)......................14
第六讲进制转换专题...................17
十进制数转二进制数
二进制数转十进制数
二进制与十六进制相互转换
第七讲字符串专题.......................23
字符串基本操作
字符串中取数字
字符串中取单词
字符串中统计
字符串加密
第八讲“数”问题........................37
质数
最大公约数
斐波那契数列
第九讲约瑟夫问题.........................42
第一讲取数问题
中国象棋是中国的一种二人对抗性游戏的棋戏,可
以修心养性,陶冶情操,丰富文化生活,深受广大群
众的喜爱。玩象棋时,必须先确定动哪一个“棋子”,
然后将“棋子”移动到下一步;数学上计算两数之
和,要先确定是哪2个数做加法运算;在windows中
要删除某个文件,需要先选择要删除的文件,然后再
执行删除操作;……我们做任何事,必须先弄清对象,然后再执行相应的操作。
编写程序,就是将任务用计算机能看懂的语言一行行地写好,然后交给计算
机一步一步执行。计算机执行指令,也需要先确定要操作的对象,比如做加法指
令,必须确定要操作的两个数据。而很多时候,需要指定数据中获取需要的数据
一一这就是取数问题。
根据目标数据类型不同,取数问题可以分为整数型中取数问题和字符串中取
数问题。下面分这两种类型分别讲解如何取数。
1.整数型
对于整数型数据,利用整除和取余方法获取各位上的数字
①已知一个两位数x,写出该数的个位数a及十位数b的python表达式
a=x%10#x除以10的余数就是个位数
b=x//10#整除10得到十位数
②写出三位数x的个位数a,十位数b,百位数c的python表达式
a=x%10
b=x//10%10(或者b=x%100//10)
c=x//100
2.字符串型
字符串取子串用切片;s[start:end:step]表示从索引start开始取,直到
索引end为止,但不包括索引end,步长step。举例如下:
s="abcdefghabcd”
n-len(s)#字符串长度
first=s[0]#字符串第1个字符串
last=s[-l]#最后1个字符串
last=s[n-1]#最后1个字符串
strs=s[5]#第5个字符串
strs=s[2:5]#第3个开始到第5个字符串
strs=s[::2]#取从头开始每隔2个字符串
练习
①写出计算一个三位整数X的各位数之和的python表达式。
②根据18位身份证号码sfz,写出计算年龄的python表达式。
③写出以一个三位数x开头的对称数的python表达式,如x=123,则输出123321。
④写出以n位字符串s开头的长度2n-l位的对称字符串的python表达式,如s="abcdef",
则输出"abcdefedcba”。
第二讲最值问题
最值指在一个数据范围中的最大值或最小值。比如2500名学生成绩数据中
找出成绩最好的学生;在一段字符串中找出最大的字符等等。
1.求最值一般的思路
①假定第一个数据最大并赋值给Maxx;
②取出下一个数与最大值Maxx比较,若大于最大值Maxx,则更新最大值
Maxx,直到枚举完所有数据;
2.求最值程序模板
Maxx=List[0]#List为数据集合
foriteminList[l:]:#第2个元素开始枚举数据
ifitem>Maxx:#取出的数据大于Maxx的更新Maxx
Maxx=item
3.实例讲解
输入一串字符串,输出该字符串中最大的字符。
思路:该问题是最值问题,可以直接应用求最值的程序模板,代码如下:
strs=input("输入,串字符串\n")#strs字符串
maxchar=strs[0]二字符;|;strs的第1.个字符赋何给maxchar
forchstrstl:]:/第2个无素开始枚举字符小
ifch>maxchar:#取出的字符大「maxchar则更新maxchar
maxchar=ch
print(maxchar)
4.python方法求最值
python中提供了函数max(),min()分别求最大值,最小值。
max()函数原型
max(iterable,*[,key,default])
参数:表示可迭代对象,数据集合
函数功能:取传入的多个参数中(或可迭代对象元素中)的最大值。
min()函数原型
min(Jterable,*[,key,default])
参数:iterate,表示可迭代对象,数据集合
函数功能:取传入的多个参数中(或可迭代对象元素中)的最小值。
举例如下:
>»max(1,2,3,4,5,6,7,8)
8
,»>,maxCzhejiangpujiangpujiangschool")
z
»>max(False,True)
True
上述实例,可以利用max()函数实现,代码为:maxchar=max(strs)
练习
①输入批量数据,编程输出该批量数据中的最大值,最小值。
②输入一个三位数,将该数各位上的数字重新排列得到新整数,求最大整数和最小整数。
③输入一个正整数,将该数各位上的数字重新排列得到新的整数,求最大整数和最小整数。
第三讲累加专题
3.1数值累加
《道德经》:“九层高台,起于累土。”累:积累,叠加。力u:增加。累加:
在原有基础上添加。我们讲累加是指批量数据做加法运算。根据数据类型的不同,
分数值累加和字符串累加两类问题进行讲解。本节介绍数值累加。
1.问题引入
①计算s=1+2+3的和
我们可以按如下分步运算
s=0
s=s+1
s=s+2
s=s+3
经过以上4个步骤,可以得到s的结果。
②如果计算s=1+2+3+…+100呢,也可以分步完成
s=0
s=s+l
s=s+2
s=s+100
如何将上述计算过程转化为程序代码呢?编程也可以像数学上的提取公因数法,
取出每个语句的公共部分,然后加上不同的部分来写代码。
S=S+X:x的值在1-n之间
上述的100(n=100)条语句可以简化为一条语句s=s+x,然后让x在[l,n]之间
逐一枚举。要实现[l,n]之间逐一枚举,可以使用for语句和range对象实现。
因此计算s=l+2+3+...+100的代码可以如下:
s=0
foriinranged,101):
s+=i
print(s)
2.数值累加模板
累加程序的代码可以用以下通用模板(写程序也可以用模板,简化写程序的过程)。
n=101#累加元素的个数
s=0#累加统果变枇初始化为0
foriinranged,n):#和举施行的敖孤范闱
s=s+X=将待累加的每1个数据X累加到结果s中
print(s)#输出结栗s
在该模板中,程序将实现n个X的累加;X是每一个需要累加的数据,可以用
python表达式表示,累加程序关键是变量X如何表达。
3.python方法实现累加
python使用函数sum()函数累加。该函数的原型如下sum(iterable[,start])
参数说明:
iterable—可迭代对象,如:列表、元组、集合。
start-指定相加的参数,如果没有设置这个值,默认为0。
返回值:计算结果。
4.实例讲解
①编程实现计算s=l+l/2+l/3+…1/n的值(n<=100)
本问题是n个数相加的问题,可以应用累加模板,计算范围是变量X=
1/io因此该问题可以写成如下代码:
n=100
S=0#累加纳果变初始化为0
foriinranged,n+1):#极—麻宥的教施范围
X=1/i#待累加的数据X
s+=X#将待累加的每1个数据X累加到结果s中
print(s)#输出结果s
[pythonic]利用函数sum。计算累加,构造好迭代对象即可。
s=sum([l/kforkinrange(1,n+1)]),其中
[1/kforkinranged,n+1)]为列表生成式,该表达式生成列表
[1,1/2,1/3,...1/n]-
②编程实现s=l+3+5+…+n(n<=100)
本问题是n个数相加的问题,可以应用累加模板,计算范围是变量x是
范围中的奇数。代码如下:
n=100
s=0#累加纳果变量初始化为0
foriinranged,n,2):#杨,脐看的数据范闱
s+=i#将待累加的每1个数据X累加到结果s中
print(s)#播出结果s
[pythonic]先生成迭代对象,再利用函数sum()求和
[kforkinranged,n,2)]该列表生成式生成[1,3,5,…]范围内的奇数。代码
如下:s=sum([kforkinrange(1,n,2)])
练习
①编程计算s=l+(l+2)+(l+2+3)+…+(l+2+3・“+n)(n<=10000)。
②编程计算s=12+3-4+…+n(n〈=10000)。
③编程实现100以内能被3整除数的和。
3.2字符串累加
字符串累加是指批量字符串前后连接起来,生成新的字符串。
1.问题引入
①输入5,屏幕上显示"12345"。
本题的结果是将数据123,4,5前后拼接得到,这是字符串的累加。按1,234,5的
先后顺序将数据累加。最先出现的1在最前面,最后出现的5在最后面。这就像
排队时,先来的人排在前面,后来的人排在后面。我把它称为“排队累加”。代
码如下:
S=
foriinranged,6):
s=s+str(i)
print(s)
运行结果如下:
12345
②输入5,屏幕是上显示"54321"。
本题也是将数据123,4,5拼接得到的结果,拼接的时候是最先出现的1在最后
面,最后出现的5在最前面。这就像排队时,后来的人插队,排在了前面。我把
它称为“插队累加”。代码如下:
S=
forimranged,6):
s=str(i)+s
print(s)
运行结果如下:
54321
2.字符串累加模板
“排队累加”中看出变量i从1递增到5,程序每次将i累加到字符串s的后
面。程序模板如下:
S二〃〃
foriinranged,n):
s=s+x
X是待累加的字符串数据,S是累加的结果。
“插队累加”中看出变量i从1递增到5,程序每次将i累加到字符串s的前面。
程序模板如下:
S=
foriinranged,n):
s=x+s
X是待累加的字符串数据,S是累加的结果。
3.实例讲解
输入数据5,在屏幕上打印如下的数字图形。
11
12
123321
12344321
1234554321
排队累加插队累加
从图上看出输出共5行,第i行打印的数据是第i-1行的内容
加上i,因此这是字符串累加问题。再观察发现左边的是字符
串的排队累加,右边的是插入累加,代码如下:
S=s=H”
foriinranged,6):foriinranged,6):
s=str(i)+ss=s+str(i)
print(s)print(s)
练习
①十进制数转BCD码。5421BCD码是一种采用四位二进制数表示一位十进制是的编码,其
各位的权依次为5,4,2,1,并要求大于等于5的卜进制数所对应的编色?人上进制数:
101010000011
码最高位为1(如十进制数7所对应的“5421BCD”码为1010)o转
换时,将十进制数从右往左按位转换成对应的“5421BCD”码,然后依次连接。(程序运行如
右图)
②.输入1个整数,输出如下的图形。
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
123456789
12345678
1234567
123456
12345
1234
123
12
第四讲秦九韶算法
秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。一
般地,一元n次多项式的求值需要经过(n+l)*n/2次乘法和n次加法,而秦九韶
算法只需要n次乘法和n次加法。
1.数学描述
把一个n次多项式改写如下所示:
n
f(x)=altx+即+・・・+41%+劭
n
=anx+・・・+n】x+QQ
w2
=(即/-1+aw-ix_+•••+aix+flj)x+ao
w3
二((。〃/-2+afJ_1x_+・・・。3工+02扰+口1汝+即
x
=(・・.((n”x+an-\)x+an-2)+・••+的)x+a。
求多项式的值时,首先计算最内层括号内一次多项式的值,
ans0=an
ansi=ansO*x+anH
然后由内向外逐层计算一次多项式的值,即
ans2=ansi*x+an-i
ansn=ansn.1*x+a<>
这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。
2.算法描述
①输入f(x)的系数aO,al,…,an,输入x的值
②答案ans初始化为an
③对于I=1,2,3…,n,循环执行ans=ans*x+a„4
④输出ans
3.流程图描述
除入多项式系数和X
i+=l
秦九都辑法流程图
4.程序代码
n=int(input(”请输入多项式项数\n"))
xs=list(map(int,input().splitO))
x=int(input("输入x的值”))
ans=xs[n]
foriinrange(1,n+1):
ans=ans*x+xs[n-i]
print(ans)
xs列表中存放多项式系数,多项式格式为:
f(x)=xs[n]*x**n+xs[nT]*x**(n-l)+…+xs[1]*x+xs[0]
练习
①输入一个正整数,计算各位数之和。
第五讲对称数(回文)
对称数是指从左到右读和从右到左读是完全一样的数据。下面分数值类型
和字符串类型两类进行描述。
1.对称数
1.1对称数的判断思路及算法
判断某数是否为对称数,只需要生成该数的逆序数,然后判断这两者是否一
致。生成逆序数的方法可以使用秦九韶算法。
如数据X=12321,生成它的逆序数的方法
1|2|3|2|1
逆序数结果保存在变量rst中,首先赋初值0即rst=0,接下来的步骤如
下:
①取出倒数第1位1,并计入结果变量rst中,rst=10*rst+1
②取出倒数第2位2,并计入结果变量rst中,rst=10*rst+2
⑤取出倒数第5位12,并计入结果变量rst中,rst=10*rst+1
最后再判断x和rst是否相同,相同为对称数,否则不是。
1.2.对称数代码实现
x=int(input())
num=x
rst=0
whilex>0:
rst=rst*10+x%10
x=x//10
ifnum==rst:
print(〃是对称数”)
else:
print(〃不是对称数〃)
1.3.生成对称数
从数字1开始连续递增生成指定长度(不超过18位)的对称数。如长度为
5,则生成对称数12321,长度6,则生成123321。
思路:生成n位对称数,根据n的奇数偶数分别来生成对称数。步骤如下:
①先生成前半部分,从1开始循环到n//2结束,利用秦九韶算法生成整数并
存储在rst;
②若n为奇数,则将中间数(n+1)//2,添加到rst尾部;
③再生成后半部分,从n//2开始到1结束,利用秦九韶算法生成整数并存储在
rst;
1.4生成对称数代码
方法1:对称数分前后2部分分别生成
numlen=int(input())
rst=0
foriinranged,numlen//2+1):
rst=rst*10+i
ifnumlen%2:
rst=rst*10+(numlen+1)//2
foriinrange(numlen//2,0,-1):
rst=rst*10+i
print(rst)
方法2:1个循环生成对称数(n为正奇数)
分析:奇数个数的对称数的特点,如对称数123454321,中间数mid=5。
123454321
第1个数x=l,与mid相差y=4
第2个是x=2,与mid相差y=3
第3个是x=3,与mid相差y=2
第7个数x=3,与mid相差y=2
第8个数x=2,与mid相差y=3
第9个数x=l,与mid相差y=4
发现规律没有?
x加y(x与mid的差值的绝对值)等于1个常量(mid的值)。
代码如下:
rst=0
mid=(numlen+1)//2
foriinranged,numlen+1):
rst=rst*10+mid-abs(mid-i)
print(rst)
2对称字符串(或回文)
2.1对称字符串的判断2个思路
思路1:与对称数的判断方法一样,利用字符串累加方法生成原始字符串的逆序
字符串,然后判断生成的字符串与原始字符串是否相同。(代码请同学们完成)
思路2:假定字符串长度为n,逐个判断第1个和倒数第1个是否相同,…,第
i个与第n-iT个是否相同,直到n//2为止。若有一次取出的前后两个字符
不相同,说明不是对称字符串,否则就是对称字符串。
2.2思路2程序代码
strs=input()
nlen=len(strs)
flag=True
forinrange(nlen//2):
ifstrsti]!=strs[nlen-i-1]:
flag=False
break
ifflag:
print("是对称字符串")
else:
print("不是对称字符串")
3生成对称字符串
生成对称字符串与生成对称数类似,不同的数据类型发生改变,原来是数字,
现在变成字符串。
3.1生成以字符"a"开始长度n(n<=52)的字符串。思路与生成对称数一样,有两种
不同的方法。
思路1分前后两部分生成。
思路2利用字符串累加原理。(请自行完成代码)
思路3利用一个循环一次生成循环序列。(请自行完成代码)
思路1程序代码:
nlen=a〃int(input())
rst=
firstch="a"
foriinrange(nlen//2):
rst=rst+chr(ord(firstch)+i)
ifnlen%2:
rst=rst+chr(ord(firstch)+(nlen-1)//2)
foriinrange(nlen//2-1,-1,-1):
rst=rst+chr(ord(firstch)+i)
print(rst)
练习
①生成对称字符串的其它两个思路的程序实现。
②编写程序生成左下图的菱形。
*
***
***
*
第六讲进制转换专题
计算机中所有数据都用二进制表示,而现实生活中更多的是十进制的数
据。因此需要对不同的进制进行转换。
6.1二进制数转十进制数
1.二进制数转换为十进制数算法及程序实现
以二进制数”1011B”转换为十进制数为例讲解转换步骤。
方法1:逐位按权值求和(从左往右)
10UB=l*2"3+0*2"2+l*2"l+l*2"0①
思路:上述表达式①中可以看成是4个数字x相加,每个x有什么特征呢?x是
二进制数的某1位数字*相应的权值。该过程就是一个4个数据累加的过程,
因此可以用累加语句模板来实现将二进制数转换为十进制数。
代码实现
binary="nil”#二进制数
binarylen=len(binary)#:进制数的长度
s=0
fori:nrange(binarylen):#枚举:进制数的每一位
a=int(binary[ij)#取出二进制数的每一位.转换为整型
b=2**(binarylen-i-l)#计算权值
x=a*b
s+=x*累加
print(s)
方法2:逐位按权值求和(从右往左),这是取的方向不一样,结果是一致的。
10UB=l*2"0+l*2"l+0*2"2+l*2"3②
思路同方法1,只是数据的位置发生改变,代码如下:
binary="1011"#二进制数
binarylen=len(binary)#二进间数的长度
s=0
fo:ii:irange(binarylen):#枚举;进制数的每一位
a=int(binary[binarylen-i-11)#取由二进制数的每一位,转换为整型
b=2**i#计兑权值
x=a*b
s+=x#累加
print(s)
上述代码中,如果熟练了就没有必要变量a,b分步写,可以直接写一个表达式。
这样写为了让学生初学时更好理解。
方法3:运用秦九韶算法,该算法是中国南宋时期的数学家秦九韶提出的一种
多项式简化算法。通俗的说十进制数x,在其尾数加一位数y,得到新的数z,
则z=10*x+y;同理对于任何二进制数x,其尾数加一位数y,得到新的数z,则
z=2*x+y。
将二进制数“1011B”转换为十进制数的分步过程如下表
1011B二进制数每1位初始值s=0
第1次取的数1s=2*s+1
第2次取的数0s=2*s+0
第3次取的数1s=2*s+1
第4次取的数1s=2*s+1
经过以上4个步骤,s的值就是该二进制数所对应的十进制数。怎么转换为代码
呢,通过观察同样是累加问题。应用累加模板代码得到如下代码:
binary="1011"#二进制数
binarylen=len(binary)岁二进制数的长度
s=0
forimrange(binarylen):#枚举;进制数的每•位
x=int(binary[i])#逐位取出:进制数
s=2*s+x#累加
print(s)
以上是二进制数转换为十进制数的3种方法,1,2两种方法其实是一样的,
只是顺序不一样而已,第3种方法比较简单明了。其它进制转换为十进制数原理
是一样的,只需要将相应的权值基数2改掉即可,如十六进制转为十进制数,将
程序中2改成16即可。
2.pythonic
Python实现上述问题,有pythonic的方式实现。现介绍2种方法:
①列表生成式
42s=sum([int(x)*2**(len(bina)-k-l)fork,xinenumerate(bina)])|
43print(s)
②利用lambda表达式和reduce()函数
7fromfunctoolsimportreduce
8data=[0^1,0/l/l]
9a=reduce(lambdax,y:2*x+yJdata)
③除此之外,python利用int()方法,将一个数字字符串转换十进制数。
函数int()原型
classint(x,base=10)
参数
x—字符串或数字。
base一进制数,默认十进制。
返回值
返回整型数据
函数int()一般用于将数值字符串转换为数字(十进制数),但是如果加上
base参数,就可以将不同进制数转换为十进制数。如上述的二进制数”1011B”
转换可以用下面的代码。
38s=int('1011',2)
39print(s)
练习
①编程实现十六进制数转换为十进制数。
②[浙2018.4选考14]某种编码以4位二进制码为一组,每组前两输入编码字符中:
00000101
位表示方向,后两位表示距离。编写一个程序,将编码翻译成方向和f0
南1
距离,距离值为每组编码后两位二进制码转换为十进制数的值。
(如右图)
6.2十进制数转二进制数
1.十进制数转二进制数的方法:辗转相除取余法
2.程序实现
思路:除2取余法,并利用字符串的插队累加得到最终结果。
num=“in,,t(input())
rst=
whilenum>0:
r=num%2
num=num//2
rst=str(r)+rst
print(rst)
3.十进制数转十六进制数
思路:与十进制数转二进制数一样,只需要将权值2改为16;同时处理好余数
大于9的数字转换为字母"ABCDEF”的问题。代码如下:
defdToh(n”u,m,):
rst=
HTABLES="0123456789ABCDEF"#十六进制数元素
whilenum>0:
r=num%16#取16的余数
num=nuin//16
rst=HTABLES[r]+rst#余数插队累加
returnrst
上述代码中取得的余数转换成十六进制数应用了一个对照表;也可以利用
chr()函数将大于9的数值转换为十六进制元素“ABCDEF”,代码如下:
defdToh2(num):
rst=
whilenum>0:
r=num%16#取16的余数
nuin=num//16
ifr>9:
rst=chr(r+55)+rst#余数插队累加
else:
rst=chr(r+48)+rst
returnrst
练习
①[浙17.4学考14]奇偶校验是一种校验数据传输正确性的方法。其中奇校验方法:统计
二进制数据的数位中“1”的个数,若个数为奇数,则校验位值为0,否则校验位值为1。
小李编写了一个计算奇校验位值程序,功能如下:输入1〜255十进制待校验数,输出该数
的二进制数及校验位值。
②编写程序求一个负整数的反码。(提示:原码即将一个整数转换为二进制数,正数的反
码等于原码,负数的反码等于原码逐位取反)
③求一个十进制负数(范围T27~T)的8位二进制补码。
6.3二进制与十六进制相互转换
1十六进制数转换为二进制数
思路:将十六进制数中的每一位转换为四位二进制数并累加;本问题难点是将
十六进制中的元素A-Z转化为相应的十进制数10-15。代码如下:
defhtob(hexnum):
rst=
foriinhexnum:#枚举卜六进制数中的每个元素
ifi>="iF':#A-F字母的转化为10-15
t=ord(i)-55
i>=,0*andi<=,9':#数字的转化为0-9
t=int(i)
else:
print('error')
break
rst+=dtob(t)
returnrst
defdtob(num):
“,,#I进制数转:进制数
rst=
foriinrange(4):
rst=str(num%2)+rst
num=num//2
returnrst
2二进制数转换为十六进制数
思路:将二进制数从右往左每隔4位分割,并将之转换为一位十六进制数,最
后逐位按字符串插队累加。
defbtoh(binary):
rst=
hextables=',0123456789ABCDEF"
i=len(binary)-1
whilei>=0:
ifi>=3:
t=binary[i-3:i+l]
else:
t=binary[:i+1]
h=btod(t)
print(h,hextables[h])
rst=hextables[h]+rst
i-=4
returnrst
defbtod(binary):
r-0
foriinbinary:
r=r*2+int(i)
returnr
程序将四位二进制数转换为十进制数自定义了一个函数btod来实现,也可以使
用into函数来实现该问题。本实例是从右往左逐位取出并转换为十六进制数,
也可以从左往右取出,并将之转换为十六进制数;代码请自行实现。
第七讲字符串专题
7.1字符串一般操作
字符串的一般操作有字符串的插入,删除,修改,查找等操作。
L查找
在字符串source中查找指定的关键字key,若存在,则返回第1次出现该key
的位置,否则返回-1。
思路:从字符串第1个位置开始,取出关键帧key长度的子串,并与关键字key
比较,若相同则返回该位置,否则继续,直到字符串结束。
程序代码实现
defsearchStr(sourceStr,key):
result=-1
i=0
end=len(sourceStr)-len(key)+1
whilei<end:
ifsourceStr[i:i+len(key)]!=key:
i+=1
else:
result=i
break
returnresult
r=searchStr(112345678123451251245,,11245')
print(r)
2.插入字符串
编写函数实现字符串中指定位置前插入指定的字符串key
思路:先找到插入字符串的位置,然后插入指定的字符串key。
程序代码1:利用切片实现
strs=input("i行输入原始:帘
pos=int(inRut(“请输入待插入的位置\n"))
key=input("比输入待插入的字符\「)
detinsertPosStr(strs,pos=0,key='):
ifpos>len(strs):
result=strs+key
else:
result=strs[:pos-1]+key+strs[pos-l:]
returnresult
result=insertPosStr(strs,pos,key)#调用函数
print(result)
程序代码2:用循环逐一取字符并累加到结果变量中
definsertPosStr2(strs,pos=0,key=,):
result=
ifpos>len(strs):
returnstrs+key
fork,vinenumerate(strs):
ifk==pos-1:
result=result+key+v
else:
result+=v
returnresult
result=insertPosStr2(strs,pos,key)#调用函数
print(result)
该函数参数说明:strs原始字符串,pos待插入的位置,key待插入的字符串。
3.删除字符串
输入原始字符串,输入待删除的key,返回删除key后的字符串。例如原始字符
串souceStr=,,abcabdabcfab,,>key="abc"。如下图:
下标01234567891011
兀系abcabdabcfab
T
思路1:原始字符串不变,将与key比较后,不同的字符串保存到新的变量中。
算法流程如下:
置初值i=0
①当i<=len(sourceStr)-len(key),从位置i开始取出子串(长度len(key))。将取出
的子串与key比较,若相同转②,否则转③
②i=i+len(key),转①
③将该字符souceStr[i]累加到结果变量result中,并转①
程序代码如下:
de-deleteStr(sourceStr,key):
result=
i=0
end=len(sourceStr)-len(key)+1
whilei<end:
print(sourceStr[i:i+len(key)])
ifsourceStr[i:i+len(key)]!=key:
result+=sourceStr[i]
i+=1
else:
i+=len(key)
ifi!=len(sourceStr):
result+=sourceStr[i:]
returnresult
r=deleteStr('1234567812345124512','129')#调用函数
print(r)
思路2:找到key字符串后修改原始字符串
置初值i=0,s=len(sourceStr)
①当s-i>=len(key),从位置i开始取出子串(长度len(key)),将取出的子串
与key比较,若相同转②,否则转③
②将key内容从原始字符串中删除,转①
③继续下一个位置查找即i=i+l,并转①
程序代码如下:
defdeleteStr2(sourceStr,key):
i=0
s=len(sourceStr)
whiles-i>=len(key):
print(sourceStr[i:i+len(key)])
ifsourceStr[i:i+len(key)]==key:
sourceStr=sourceStr[:i]+sourceStr[i+len(key):]
s=len(sourceStr)
i=i+1
returnsourceStr
r=deleteStr2(,1234567812345124512,,*12*)
print(r)
4.其它:将字符串中的小写字母变大写字母
(1)常规思路:枚举字符串中每1个字符,碰到小写字母的将之转换为大写字母。
因为字符串是不可变对象,因此,需要定义一个新的对象保存新的字符串。
程序代码如下:
strs=input("清输入•字行串
rst="〃
forchinstrs:
ifch>='a*andch<='z':
rst+=chr(ord(ch)-32)
else:
rst+=ch
print(rst)
(2)pythonic方法
python中提供lower()、upper()Acapitalize()>title()>swapcase()
这几个方法分别实现字符串转换为小写、大写字符串、字符串首字母变为大写、
每个首字母变为大写以及大小写互换。因此,上述问题可以用如下代码实现:
rst=strs.upper()
print(rst)
字符串函数的使用举例
s=,whatisYourName?'
print(s.lower())#返回小写字符串
print(s.upper())#返回人叮字符串
print(s.capitalizeO)#字符串苜字符大写
print(s.title())#每个单词的首字母大写
print(s.swapcase())#大小写互换
运行结果
whatisvourname?
WHATISYOURNAME?
Whatisyourname?
WhatIsYourName?
WHATISyOURnAME?
练习
①输入数字的年份转换为中文年份,比如输入2018,输出“二。一八”。
②输入一串字符,将字符串后面相同的字符删除只剩下一个。
请输入字符串
abcadfebxccha
abcdfexh
③输入一个大于10000的正整数,程序会去除其中4个数字,在保证余下的数字不改变顺
序的情况下其数值最大。运行结果如下图。
请输入•个整数654321
65
7.2字符串中取数字
取出字符串中连续数字,并加以处理。如有字符串"aba123aA456a655”,
则输出[123,456,655]。本节讲解解决该问题的3种思路。
思路1.数字字符串累加法
从字符串第1个字符开始,碰到数字的,把它取出来累加到变量中,碰到非数字
字符时,将变量追加到结果列表中,同时清空变量,重复上述过程,直到字符串
结束。
strs=z"asdfadsf34sdfasfasf8asfdjk233asdf2334ascif23,.,al,78,0,48"
defgetNum(s):
iflen(s)==0:
returnNone
num=ntt
result=[]
foriins:
ifi〉="0〃andi<=〃9":二加果是数字,则累加
num+=i
else:
iflen(num)>0:
result,append(int(num))
num=
iflen(num)>0:
result,append(int(num))
returnresult
rl=getNum(strs)
【思考】①处的if语句去掉,分析对程序结果有什么影响?
思路2切片法
从字符串第1个字符开始,碰到数字的,统计数字出现的次数,碰到非数字字符
时,利用切片将该位置之前的长度为num的数字字符串取出来,并记录到结果列
表中,同时清空计数变量num,重复上述过程,直到字符串结束。
defgetNum2(s):
iflen(s)==0:
returnNone
num=0
result=[]
foriinrange(len(s)):
ifands[i]<="9":#如果是数字,则个数加1
num+=1
else:
ifnum>0:
result.append(int(s[i-num:i]))
num=0
ifnum〉0:
result.append(int(s[i+l-num:i+1]))
returnresult
r2=getNum2(strs)
思路3利用秦九韶算法取出数字
从字符串第1个字符开始,碰到数字的,把它取出来,利用秦九韶算法累加到变
量num中,当碰到非数字字符时,将变量追加到结果列表中,同时清空变量num,
重复上述过程,直到字符串结束。
defgetNum3(s):
iflen(s)==0:
returnNone
num=c=0
result=口
foriins:
i>=andi<=〃9":#是数字的,累加到结果变量|
num=num*10+int(i)
c+=1
else:
ifc>0:
result,append(num)
c=0
num=0
ifc>0:
result,append(num)
returnresult
r=getNum(strs)
【思考】本程序中变量c的作用是什么?
小结
字符串一重要公式:下标与长度之间的关系
上图中起始下标i,结束下标j,长度L与ij的关系如下:
L=j+l-i
字符串切片或range(start,end,step)生成对象时,因为end不包括,所以要生
成s[i:j](包含j)时必须用s[i:j+l]或range(i,j+l)o
字符串中取数问题中的思路2就是应用了该公式。
练习
①输出字符串中连续数字的最大值。如"(5YgYi\qly6(uVC4;81Sk"最大数是81。
②[浙2018.11选考14]在平面坐标系中,给定一组有序的点。从原点出发,依次用线段连
接这些点,构成一条折线。要求编写一个“计算折线长度”的程序,功能如下:输入这些点
的坐标值(数据都用逗号分隔并以逗号结尾),程序计算这条折线的长度。例如,三个点的
坐标为(5,10),(8,12),(6,17),则输入的字符串strs=w5,10,8,12,6,17,”,输出20.17»
③[浙2017.11选考14]编写“字符串生成”程输入原始字符中…
pythonaprogramminglanguage.
序,实现如下功能:输入多个正整数(以“,”为输入位置1,18,9,9,
pass
分割符和结束符,这些整数代表字符位置),程序
以这些整数为位置信息,依次从原始字符串(字典内容)提取字符并连接成新的字符串,最
后输出将新的字符串(如右图)。
7.3字符串中取单词
给定一段文本中拆分单词,拆分规则是一个单词以字母开头和结束。实现的
思路可以参考字符串中取数字。
实例1一段文本中拆分单词,将单词取出存入列表。
思路1位置法:枚举文本的所有字符,记录单词中字符的个数,以及单词的结束
位置,截取单词。代码如下:
defgetWordNum(text):
c=0
chars=0
rst=[]
i=0
forchintext:
ifch>='A'andch<='Torch>='a'andch<='z':
c七1
chars+=1
i+=1
else:
ifc>0:
rst・append(text[i-c:i])
c=0
i+=1
ifc>0:
rst.append(text[len(text)-c:])
returnrst
getWordNum(text)
思路2累加法:枚举文本的所有字符,遇到字母开头的,将字母累加,遇到非字
母时,将累加的单词添到列表中。代码如下:
defgetWordNum2(text):
chars=0
rst=[]
words=
forcintext:
ifc>='A?andc<='Z'orc>=?a,andc<='z':
chars+=1
words+=c
else:
iflen(words)>0:
rst.append(words)
words=
ifwords:
rst・append(words)
chars+=len(words)
returnrst
getWordNum2(text)
实例2编写程序实现英文句子每个单词首字母大写。
思路1:首先判断文本首字符是否首字母,若是将之改成大写后保存到结果字符
串中;否则直接复制到结果变量;之后枚举其他字符,并根据规则改写大写;判
断首字母的条件是,当前字符是英文字母,其前一个为标点符号如“,.;!?〃。程
序代码如下:
text=input("i疗输入英文户符”)
result=text[0]
nlen=len(text)
iftext[0]>="a"andtextLO]<="z":
result=chr(ord(text[0])-32)
forimranged,nlen):
iftext[i]>="a"andtext[i]<="z":
iftext[i-1]in(",.:!?”):
result+=chr(ord(text[i])-32)
else:
result+=text[i]
else:
result+=text[i]
print(result)
思路2pythonic方法
python中提供字符串的title。方法,自动将单词首字母变大写。使用方法如下:
>>s=9uhatisyourname?
>>s.title<>
WhatIsYourName?’
练习
①[2017.4浙选考16]小王编写了一个实现文字查找替换功能的程序,输入原始字符串,
待查找的key,输入替换的文本。如下图。
输入原始字符串,内容*'
博客是•种个数的网络出版膨式,博客一经得到「广泛的应用。
输入待杳技而key
博客
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年绿色金融市场政策支持体系构建与绿色金融投资策略研究报告
- 重庆市实验外国语学校2025-2026学年高三上学期9月月考生物试题(有答案)
- 安健环与文明施工管理协议
- 巡检光伏区注意事项
- 屋顶光伏逆变器课件
- 输液空气栓塞课件
- 电商平台存货抵押融资服务合同
- 小鸭上桥课件
- 农业用地磅购置与运营维护合同
- 输液原则注意事项
- 家具制造业2025年原材料价格波动对行业市场发展趋势影响报告
- 山东省济南市2025届中考数学真题(含答案)
- 2025-2030农业传感器网络部署模式与精准农业实践案例
- 接手烂尾项目的合同范本
- 2025-2026学年冀教版(2024)小学数学一年级上册(全册)教学设计(附目录P339)
- GB/T 45451.2-2025包装塑料桶第2部分:公称容量为208.2 L至220 L的不可拆盖(闭口)桶
- 2025年月度工作日历含农历节假日电子表格版
- HY_T 0330-2022 海滩养护与修复工程验收技术方法
- 十四条经络养生课件
- 清洁生产的实施途径
- 钢结构厂房监理实施细则
评论
0/150
提交评论