字符串是程序中最常用的一种数据类型,字符串可以包含中文与英文等任何字符,再内存中用 Unicode 编码存储,但是存储到磁盘中时候往往采用 GBK 或者 UTF-8 等别的编码形式,目标掌握字符串的操作。
字符数组可以用来存储字符串,字符串在内存中的存放形式也就是字符数组的形式,字符串可以看成是字符的数组,例如:
s="Hello";
其内存分布如图 4-1-1 所示。
H e l l o
实际上字符串 s 的长度为 len(s),例如:
len("abc") #3
len("我们 abc") #5
注意空字符串 s=""是连续两个引号,中间没有任何东西,空串的长度为 0,len(s)=0,
但是 s=" "包含一个空格,s 不是空串,长度为 1。
要得到其中第 i 个字符,可以像数组访问数组元素那样用 s[i]得到,其中 s[0]是第 1个字符,s[1]是第 2 个字符,……,s[len(s)-1]是最后一个字符。例如:
s="a 我们"
n=len(s)
for i in range(n):
print(s[i])
结果:
a
我
们
注意字符串中的字符是不可以改变的,因此不能对某个字符 s[i]赋值,例如 s[0]='h'是错误的。
计算机值认识二进制,字符在计算机中实际上是用二进制数存储的,这个编码称为Unicde,每个英文字符用两个字节存储。要知道某个字符的编码,用函数 ord(字符)便知道了,例如:
s="Hi,你好"
n=len(s)
for i in range(n):
print(s[i],ord(s[i]))
结果:
H 72
i 105
, 65292
你 20320
好 22909
可以看到"H"的 Unicode 码是 72,"你"的是 20320。我们可以用程序测试出
"A"-"Z","a"-"z"的大小写字母的 Unicode 码:
S="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s="abcdefghijklmnopqrstuvwxz"
n=len(s)
for i in range(n):
print(s[i],"---",ord(s[i]),S[i],"---",ord(S[i]))
同样可以测试"0"-"9"的 Unicode 码:
s="0123456789"
n=len(s)
for i in range(n):
print(s[i],"---",ord(s[i]))
汉字的编码也用两个字节才能表示,Unicode 码包含所有的符号。它表示英文字符时有一个字节是 0,这样表示虽然浪费一个字节,但是它把所有的符号都同一成一样的,因此还是划算的。
如果我们知道一个符号的编码为 n,那么可以用 chr(n)函数把它转为一个符号,例如:
a=chr(25105)
b=chr(20204)
c=chr(119)
d=chr(101)
print(a,b,c,d)
结果:
我 们 w e
两个字符串 a,b 可以比较大小,比较规则是按各个对应字符的 Unicode 编码,编码大的一个为大:
比较 a[0]与 b[0],如果 a[0]>b[0]则 a>b,如果 a[0] 比较 a[1]与 b[1],如果 a[1]>b[1]则 a>b,如果 a[1] 续比较 a[2]与 b[2];
......
这个过程一直进行下去,直到比较出大小,如果比较完毕两个字符串的每个字符都一样,
那么如果两个一样长 len(a)=len(b),那么 a=b,如果 len(a)>len(b)则 a>b,如果 len(a)def compare(a,b):
m=len(a)
n=len(b)
if m
在实际应用中我们可以简单使用 ==, >=,<=,>,<,!=等符号来判断两个字符串的大小。
根据字符的编码我们要记住有下列关系:
"0"<"1"<....<"9"<"A"<"B"<....<"Z"<"a"<"b"<......<"z"<汉字
特别注意大写的字母比小写的小!
例 4-1-1:输入一个字符串,统计它包含的大小字母的个数
s=input("Enter a string: ")
count=0
for i in range(len(s)):
if s[i]>="A" and s[i]<="Z":
count=count+1
print("count=",count)
例 4-1-2:输入一个字符串,统计它包含的大小字母、小写字母、数字的个数
s=input("Enter a string: ")
upper=0
lower=0
digit=0
for i in range(len(s)):
if s[i]>="A" and s[i]<="Z":
upper=upper+1
elif s[i]>="a" and s[i]<="z":
lower=lower+1
elif s[i]>="0" and s[i]<="0":
digit=digit+1
print("Upper chars: ",upper)
print("Lower chars: ",lower)
print("Digit chars: ",digit)
例 4-1-3:输入一个字符串,把它反向显示
# 函数 reverseA 与 reverseB 都可以反向字符串:
def reverseA(s):
t=""
for i in range(len(s)-1,-1,-1):
t=t+s[i]
return t
def reverseB(s):
t=""
for i in range(0,len(s)):
t=s[i]+t
return t
print(reverseA("reverse"))
print(reverseA("reverse"))
例 4-1-4:输入一个字符串,去掉它左右多余的空格,例如" a bc "返回"a bc"。
def trim(s):
t=""
i=0
j=len(s)-1
while i<=j and s[i]==" ":
i=i+1
while i<=j and s[j]==" ":
j=j-1
for k in range(i,j+1):
t=t+s[k]
return t
s=input("Enter a string: ")
print(s,"length=",len(s))
t=trim(s)
print(t,"length=",len(t))
6、英文字母的大小写转换
如果 c 是一个大写英文字母,那么 ord(c)是它的编码,ord(c)-ord("A")是它相对"A"的偏移量, ord("a")是"a"的编码,显然 ord("a")+ord(c)-ord("A")是 c 对应的小写字母的编码,因此 chr(ord("a")+ord(c)-ord("A"))就是 c 对应的小写字母。例如:
c="P"
d=chr(ord("a")+ord(c)-ord("A"))
print(d)
那么 d 是小写"p"。
同样如果 c 是一个小写的英文字母,那么 chr(ord("A")+ord(c)-ord("a"))是它对应的大写字母。
例 4-1-5:编写把一个串中所有小写字母变大写的函数
def myToUpper(s):
t=""
for i in range(len(s)):
if s[i]>="a" and s[i]<="z":
t=t+chr(ord("A")+ord(s[i])-ord("a"))
else:
t=t+s[i]
return t
def myToLower(s):
t=""
for i in range(len(s)):
if s[i]>="A" and s[i]<="Z":
t=t+chr(ord("a")+ord(s[i])-ord("A"))
else:
t=t+s[i]
return t
s=input("Enter a string: ")
print("myToUpper: ",myToUpper(s))
print("myToLower: ",myToLower(s))
7、字符串中的子串
设置 s 为字符串变量,在 s 中取出它的一截,即一个子串,是常用的一个操作。
例 4-1-6: 设计函数 subString(s,start,length)表示从 s 的 start 位置开始,取出长度
为 length 的一个子串。
def subString(s,start,length):
m=len(s)
if start>=length:
return ""
t=""
i=start
while i
i=i+1
return t
s="abcdefghijk"
print(subString(s,2,4))
print(subString(s,2,24))
4.1.3 【案例】字符串的对称
1、案例描述
设计程序判断一个字符串是否对称。
2、案例分析
方法一:编写一个函数 reverse(s)把字符串 s 反向,然后把反向的结果与原来的字符串比较,如果一样就说明是对称的。
方法二:有一种判别对称的方法,用 i,j 表示左右的下标,逐步比较(s[0],s[len(s)-1]) , (s[1],s[len(s)-2]) ,......, 如果由不相等的,一定不对称,如果全部比较完毕都相等,则对称。
3、案例代码
# 方法一:
def reverse(s):
t=""
for i in range(len(s)-1,-1,-1):
t=t+s[i]
return t
def isSymmetry(s):
t=reverse(s)
if s==t:
return 1
else:
return 0
s=input("Enter a string: ")
if isSymmetry(s)==1:
print("对称")
else:
print("不对称")
# 方法二:
def isSymmetry(s):
i=0
j=len(s)-1
while i<=j:
if s[i]!=s[j]:
return 0
i=i+1
j=j-1
return 1
s=input("Enter a string: ")
if isSymmetry(s)==1:
print("对称")
else:
print("不对称")