零基础 学 python开发 (Genius套餐A) 二十

夜光序言:

 

 

 

无论什么时候,当你听到一件事情对自己太有利了,那你就绝对不要相信。

 

 

 

 

 

正文:

4.1 字符串类型 
4.1.1 目标 


字符串是程序中最常用的一种数据类型,字符串可以包含中文与英文等任何字符,再内存中用 Unicode 编码存储,但是存储到磁盘中时候往往采用 GBK 或者 UTF-8 等别的编码形式,目标掌握字符串的操作。

 

 



4.1.2 字符串类型 


字符数组可以用来存储字符串,字符串在内存中的存放形式也就是字符数组的形式,字符串可以看成是字符的数组,例如:
s="Hello";


其内存分布如图 4-1-1 所示。
H e l l o


图 4-1-1


1、 获取字符串长度函数 len 


实际上字符串 s 的长度为 len(s),例如:
len("abc") #3
len("我们 abc") #5
注意空字符串 s=""是连续两个引号,中间没有任何东西,空串的长度为 0,len(s)=0,
但是 s=" "包含一个空格,s 不是空串,长度为 1。

 

 



2、 读出字符串各个字符 


要得到其中第 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'是错误的。

 

 


3、 字符在内存中的编码 


计算机值认识二进制,字符在计算机中实际上是用二进制数存储的,这个编码称为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,这样表示虽然浪费一个字节,但是它把所有的符号都同一成一样的,因此还是划算的。

 

 

 



 
4、 编码转为字符 


如果我们知道一个符号的编码为 n,那么可以用 chr(n)函数把它转为一个符号,例如:
a=chr(25105)
b=chr(20204)
c=chr(119)
d=chr(101)
print(a,b,c,d)
结果:
我 们 w e

 

 



 
5、 字符串的大小比较 


两个字符串 a,b 可以比较大小,比较规则是按各个对应字符的 Unicode 编码,编码大的一个为大:

比较 a[0]与 b[0],如果 a[0]>b[0]则 a>b,如果 a[0]<b[0]则 a<b,如果 a[0]=b[0]则继续比较 a[1]与 b[1];
比较 a[1]与 b[1],如果 a[1]>b[1]则 a>b,如果 a[1]<b[1]则 a<b,如果 a[1]=b[1]则继
续比较 a[2]与 b[2];
......
这个过程一直进行下去,直到比较出大小,如果比较完毕两个字符串的每个字符都一样,
那么如果两个一样长 len(a)=len(b),那么 a=b,如果 len(a)>len(b)则 a>b,如果 len(a)<len(b)
则 a<b。
如果自己写一个比较函数 compare(a,b)比较 a,b 大小,如果 a>b 返回 1,如果 a<b 返回 -1,如果 a=b 返回 0,那么 compare 是这样工作的:

def compare(a,b):
 m=len(a)
 n=len(b)
 if m<n:
 k=m
 else:
 k=n
 for i in range(k):
 if a[i]>b[i]:
 return 1
 elif a[i]<b[i]:
 return -1
 if m==n:
 return 0
 elif m>n:
 return 1
 else:
 return -1


在实际应用中我们可以简单使用 ==, >=,<=,>,<,!=等符号来判断两个字符串的大小。
根据字符的编码我们要记住有下列关系:
"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<start+length and i<m:
 t=t+s[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("不对称")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值