写在开头:这些题一定要自己去试一试,不能光看一遍!
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,从右往左,也就是从后往前。