“Python基础开发”课程_课堂笔记(HTML版_017)
Class notes of "Python basic development",this webPage is seventh page.
本页面的“代码demo索引”:
备注:前面“p=15”(前4步的思路)是“【实训项目】打印某年日历”,与“p=16”(完整代码)合并为一篇博客(https://www.cnblogs.com/Robot-DX3906/p/12848563.html)
第五章 Python序列数据
5.1 字符串
这个部分,主要讲“字符串类型”(介绍这种数据类型)和“字符串函数”(内置函数)。
字符串是以英文和中文为主的文字,计算机使用Unicode编码来存储——在存储到磁盘中时,多采用GBK或者是“UTF-8”这两种“形式”(编码方式)之一。
我们(在这小节)的任务就是掌握字符串的操作。
字符串可以看做是有字符组成的数组——“字符数组”可以用来存储字符串,字符串在内存中是以“字符数组”的形式来存储的。
比如说s = 'Hello',是在内存中的连续空间,按顺序保存
0100 1000
0110 0101
0110 1100
0110 1100
0110 1111
这个(这5个“八位二进制数”)是一个整体,是一个“数组”。
01001000 01100101 01101100 01101100 01101111
5.1.1 字符串长度len
len函数是用来获取字符串长度的,做法是“len(string_name)”,后面的小括号里面就是变量名——注意,每个汉字,是一个字符。
5.1.2 读取字符
读出字符串的各个字符,思路是,想得到其中的第i个字符,就可以访问数组元素,比如说使用“s[i]”来读取——当然,第一个字符的下标为0,最后一个字符下标为长度减一。
s[0],s[1],s[2],…,s[len(s)-1]
用for…in的话,就像这样:
s = 'a我们'
n = len(s)#先用变量,获取长度(3)
for i in range(n):#i默认是从零开始的
print(s[i])
s[0] = 'h'#这种写法的错误的
要注意,字符串中的字符,是不能改变的,因此,不能对单独的字符进行赋值!
5.1.3 字符编码
计算机只认识二进制数字,字符也只能以二进制形式,保存在计算机中。(这里不科普二进制)
字符保存在计算机中的二进制数字,称为“Unicode”编码,每个英文字符占两个字节(2Byte=8bit),要知道字符在内存中的(十进制)编码,那么,我们就要用到ord函数。
【demo】字符在内存中的(十进制)编码
s = 'Hi,你好'
n = len(s)#先用变量,获取长度(3)
for i in range(n):
print(s[i],ord(s[i]))#i默认是从零开始的
运行结果如下:
>>>
==================== RESTART: E:\HTML5\Python2020_demo.py ====================
H 72
i 105
, 44
你 20320
好 22909
>>>
汉字的“Unicode编码”比英文字符都要靠后——可以用ord函数看英文大小写的“Unicode编码”,这里就跳过了。
5.1.4 编码转字符
如果我们知道某个字符的(十进制)编码是n的话,可以通过chr函数
【just for fun】Python“Unicode密码”
a = chr(25105)
b = chr(20204)
c = chr(119)
d = chr(101)
print(a,b,c,d)
运行结果如下:
>>>
==================== RESTART: E:\HTML5\Python2020_demo.py ====================
我 们 w e
>>>
好吧,其实你也可以试试下面这行代码:
print(chr(73)+chr(32)+chr(76)+chr(111)+chr(118)+chr(101)+chr(32)+chr(89)+chr(111)+chr(117)+chr(33))
就在IDLE的“Shell”模式中运行就行。
5.1.5 字符串大小比较
单个字符,就是通过(十进制)“Unicode码”来比较的;
字符串的话,就要麻烦一些了(假设有“a”、“b”两个字符串的话,):
按照顺序,分解为单个字符,看第一个字符,“a[0] ”与“b[0] ”进行比较,相等的话,就是“a[1] ”与“b[1] ”进行比较,直到得出结果位置。
如果比完之后,还有剩的,长度大的字符串就大。
如果不好理解的话,可以理解为十进制数中的正整数的大小比较,毕竟,人类社会的进化顺序是
自然数→人类语言→计算机语言
【思路】字符串比较函数
def compare(a,b):#第一部分是比较函数,获取下标范围
m = len(a)
n = len(b)
if m
k=m#短的那个字符串的长度
else:
k=n
for i in range(k):#第二部分是遍历字符串,进行比较
for a[i]>b[i]:
return 1
elif a[i]>b[i]:
return -1
if m==n:#第三部分是用if语句,进行判断,可以用6个“关系运算符”
return 0
elif m>n:
return 1
else:
return -1
关于字符的“大小比较”,是——数字 < 大写字母 < 小写字母 < 汉字
【练习1】输入字符串,统计大写字母的个数
s = input("Enter a string:\n")
count = 0#计数器清零
for i in range(len(s)):#设置循环次数为字符串长度
if s[i]>="A" and s[i]<="Z":#满足条件就让计数器加一
count = count+1
print("count=",count)
【练习2】统计字符串中,大写字母、小写字母、数字的个数
s = input("Enter a string:\n")
upper = 0
lower = 0
digit = 0
for i in range(len(s)):
if s[i]>="A" and s[i]<="Z":
upper = upper+1
if s[i]>="a" and s[i]<="z":
lower = lower+1
if s[i]>="0" and s[i]<="9":
digit = digit+1
print("大写字母:%d\n小写字母:%d\n数字个数:%d"%(upper,lower,digit))
【练习3】将字符串反向显示的两种方法
#第一种方法是从后往前遍历,往后面放
s = input("Enter a string:\n")#在写自定义函数之前,先输入数据
def reverseA(s):#反向函数
t=""#空字符串,用来保存结果
for i in range(len(s)-1,-1,-1):#“range”函数的三个参数:第一个“len(s)-1”是最后一个值的下标,第二个是减到“-1”就结束,第三个是间隔(负数表示下标数值减少)
t = t + s[i]
print(t)
return t
print("反向显示:",reverseA(s))
运行效果如下:
>>>
==================== RESTART: E:\HTML5\Python2020_demo.py ====================
Enter a string:
12345
5
54
543
5432
54321
反向显示: 54321
>>>
#第二种方法是从前向后遍历,将每个字符放在前面
s = input("Enter a string:\n")#在写自定义函数之前,先输入数据
def reverseB(s):
t=""
for i in range(0,len(s)):#从零开始,取到长度
t = s[i] + t#把后一个字符往前面放
print(t)
return t
print("反向显示:",reverseB(s))
运行效果如下:
>>>
==================== RESTART: E:\HTML5\Python2020_demo.py ====================
Enter a string:
12345
1
21
321
4321
54321
反向显示: 54321
>>>
这两种方法只是两种不同的写法,最后得到的结果是不一样的。
【练习4】去掉字符串首尾的空格
def trims(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:\n")
print(s,"length=",len(s))
t = trims(s)
print(t,"length=",len(t))
运行结果如下:
>>>
==================== RESTART: E:\HTML5\Python2020_demo.py ====================
Enter a string:
2020-05-08 09:55
2020-05-08 09:55 length= 25
2020-05-08 09:55 length= 16
>>>
(HTML语言会自动删除连续空格,知道意思即可)
应该是16行代码,只是删除首尾空格,在可以调用内置属性(方法?)的情况下,就这么麻烦。
而使用(字符串)“内置函数”,就可以节省很多代码。
第17堂课,内容为Python字符串的“内置属性”。
本页面(?p=17)的实际上课时间为2020年5月8日第1小节课