Python 语言程序设计 第五章 字符串应用举例

写在开头:这些题一定要自己去试一试,不能光看一遍!

p104


1.输入一个字符串,每次去掉最后的字符并输出。

书上给的代码:

s=input()

for i in range(-1,-len(s),-1):
    print(s[:i])

调整range也可以得到相同的结果:

s=input()

for i in range(len(s)-1,0,-1):
    print(s[:i])


2.翻译密码。 为了保密,常不采用明码电文,而用密码电文,按事先约定的规律将一个字
符转换为另一个字符, 收报人则按相反的规律转换得到原来的字符。例如,将字母“A”→“F",“B”→“G”,“C”→“H”,即将一个字母变成其后第5个字母。例如,“He is in Beijing," 应转换为“Mj nxns Gjnonsl.”。
分析:依次取电文中的字符,对其中的字母进行处理,对字母之外的字符维持原样。取字母的
字符串ASCII代码,加上5,再按其ASCII码转换为另一个字母。还有一个问题要处理, 当字母为“V”时,加5就超过了“Z”, 故应使之转换为“A”,同理,“W”→“B”,“X”一“C”,“Y”一“D”,“Z”→“E”。

 

学过c语言的很容易就会想到这种方法:

#include<iostream>

using namespace std;

int main(){
	char s='a';
	printf("%d",s+1);
	printf("%c",s+1);
}

就是一个字符加上一个数字嘛!

但是在python中不行:

s='a'

print("%d"%(s+5))
print("%c"%(s+5))

 

 这段话的意思是:只能str类型与str类型连接;不能str类型与int类型连接


因为我在看书的p87时,没仔细看就跳过了,这里面有解决这个问题的方法:

python提供了ord()函数和chr()两个内置函数,用于字符与其机器内部编码值之间的转换。

ord()函数将一个字符转化为相应编码值。

chr()函数将一个整数转换成Unicode字符。

z='a'
print(z)
print(ord(z))

x=65
print(x)
print(chr(x))

所以,上面的问题这样解决:

s='a'

#print("%d"%(s+5))
#print("%c"%(s+5))
print(ord(s)+5)
print(chr(ord(s)+5))

代码:

line1=input()
line2=""

for c1 in line1:
    if c1.isalpha():
        i=ord(c1)
        j=i+5
        if(j>ord('z') or (j>ord('Z') and j<ord("Z")+6)):
            j-=26
        line2+=chr(j)
    else:
        line2+=c1
print(line2)

3.Python 的标识符以字母或下画线(_ )开头,后接字母、数字或下画线组成,从键盘输入字符串,判断它是否为Python的标识符。
分析:利用string模块中的常量,包括string.digits (数字0~9)、string.ascii letters (所有大小写字
母)、string .ascii lowercase (所有小写字母)、string.ascii uppercase (所有大写字母)。先输入字符串,再分别判断首字符和中间字符,并给出提示。判断中间字符利用for循环遍历字符串。

首先了解一下string库中的几个常量:

import string
print(string.ascii_letters)   #大写与小写字母
print(string.ascii_lowercase) #小写字母
print(string.ascii_uppercase) #大写字母
print(string.digits)          #数字

书上的代码:(输入的字符串必须大于等于两个字符)

import string
alphas=string.ascii_letters+"_"
nums=string.digits

myInput=input()
if len(myInput)>1:
    if myInput[0] not in alphas:
        print("NO")
    else:
        for otherchar in myInput[1:]:
            if otherchar not in alphas+nums:
                print("NO")
                break
        else:
            print("Yes")

我写的代码:(单个字符也行)

import string
flag1=1#当出现不符合的字符时,赋值为0
flag2=1#用于判断第一个字符
line=input()

line1=string.ascii_letters+"_"
line2=string.ascii_letters+string.digits+"_"
for c in line:
    if flag2:#判断第一个字符
        if c not in line1:
            flag1=0
        flag2=0
    else:#判断其余字符
        if c not in line2:
            flag1=0
            
    if not flag1:
        break

if flag1:
    print("YES")
else:
    print("NO")

使用正则表达式:(单个字符也行)

import re
pattern =re.compile(r"\b[a-zA-Z_](\w|_)*\b")
myInput=input()
m_Obj=pattern.match(myInput)
if m_Obj:
    print("YES")
else:
    print("NO")

4.从键盘输入几个数字,用逗号分隔,求这些数字的和

分析:输入的数字作为一个字符串处理,首先分离出来数字串,在转化为数值,这样就能求和。

我一开始想的是这样的:

#这个代码不对
import string
number=input()
line2=""

for i in number:
    if i in string.digits:
        line2+=i
sum=0
for i in line2:
    sum+=int(i)
print(sum)

输入与输出看似没问题:

 但是输入其他测试样例的时候,结果却是这样:

 为什么呢?因为我输入的是“1.2,45”,i每次读取到的是一个字符,所以i读取到的是

number=input()

for i in number:
    print(i,end="*")

所以导致了不对。


在书上的p96有这样一个函数:

s.split([sep,[maxsplit]])

以sep为分隔符,将字符串拆分为一个列表,默认的分隔符是空格,maxsplit表示拆分的次数,默认取-1,表示无限制拆分。

用split函数来修改上面的代码:

number=input()

for i in number.split(","):
    print(i,end=" ")

代码1:

number=input()
sum=0

for i in number.split(","):
    sum+=float(i)

print(sum)

 

也可以使用正则表达式来实现:

import re
number=input()
p=re.compile(",")
d=p.split(number)

sum=0
for i in d:
    sum+=float(i)

print(sum)


p95

对于strip()函数的理解:

s.strip([chars])     

s.lstrip([chars])

s.rstrip([chars])

课本上的对这三个函数的解释我没理解,下面我用自己的方法来解释一下:

s.strip([chars])   

 

这个函数的意思是,对于字符串s,我们从左到右和从右到左扫描一遍,删除chars中有的字符。

这些字符必须是连续的。

例:

s='Python Program'
print(s)
print(s.strip("Pyt m r"))

 chars是“Pyt m r”,所以从前往后扫描,去掉Pyt  ,然后从后往前扫描,去掉m。

但是这里有一个疑问,为什么Program中有P,r和m,在从后往前扫描中为什么只删除了m?

因为从后往前数,第一个字符是m,第二个字符是a,chars中没有a,第三字符是r,但是r和m并不连续。

如果我们在chars中加上a的话:

s='Python Program'
print(s)
print(s.strip("Pyt m ra"))

 这样r也会被删掉,因为ram是连续的。

s.lstrip([chars])

s.rstrip([chars])

l代表left,从左往右,也就是从前往后;r代表right,从右往左,也就是从后往前。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值