代码:
# 项目名:pythonProject2
# NAME:demo14
# 开发时间:2021/4/15 18:00
#字符串
#字符串驻留机制
s1 = 'abc'
s2 = 'ab'+'c' #在程序编译前完成计算
s3 = 'ab'.join('c') #在编译过程中进行计算所以指针不同
print(id(s1))
print(id(s2))
print(id(s3))
print(s1 is s2)
print(s1 is s3)
#字符串的常用操作
s = 'hello,hello,HEY'
substr = 'lo'
r = s.find(substr) #查找substr第一次出现的位置,不存在返回-1,index同理,不存在返回报错
print(r)
r = s.rfind(substr) #查找substr最后一次出现的位置,不存在返回-1,rindex同理,不存在返回报错
print(r)
s_up = s.upper() #全部转换大写
print(s_up)
s_low = s.lower() #全部转换成小写
print(s_low)
s_cap = s.capitalize() #第一个首字母大写
print(s_cap)
s_swap = s.swapcase() #所有大小写翻转
print(s_swap)
s_tit = s.title() #所有单词首字母大写,其他字母小写
print(s_tit)
s1 = s.center(21,'*') #居中对齐,左右填充*直到到达21个字符,默认填充空格
print(s1)
s1 = s.ljust(21,'*') #左对齐,右侧填充*直到到达21个字符,默认填充空格
print(s1)
s1 = s.rjust(21,'*') #右对齐,左侧填充*直到到达21个字符,默认填充空格
print(s1)
s1 = s.zfill(21) #右对齐,左侧填充0直到到达21个字符
print(s1)
s1 = s.split(sep=',',maxsplit=1) #split()函数对字符串从左进行分割,sep=指定分隔符,默认为空格;maxsplit指定最大分割次数
print(s1)
s1 = s.rsplit(sep=',',maxsplit=1) #split()函数对字符串从左进行分割,sep=指定分隔符,默认为空格;maxsplit指定最大分割次数
print(s1)
s = 'abc123四33'
print(s.isidentifier()) #判断是否为合法标识符,即字母、数字、下划线组成的字符串
print(s.isspace()) #是否包含空白字符,如tab、空格、回车
print(s.isalpha()) #是否仅由字母组成
print(s.isdecimal()) #是否十进制数字符串
print(s.isnumeric()) #是否全部为数字,包含汉字数字以及罗马数字
print(s.isalnum()) #是否由数字和字母组成
print(s.replace('abc','szj')) #用后者替换字符串中的牵着
s = 'fuck,fuck,fuck'
print(s)
s = s.replace('fuck','bee',2) #指定替换次数
print(s)
lst = list(['hello','134','world'])
print(lst)
s = ''.join(lst) #用引号中的符号将列表或元组中的字符串元素连在一起,列表与元组中必须全都是字符串
print(s)
print(ord('a'))
print(chr(97))
print(ord('宋'))
print(chr(23435))
#字符串切片
s = 'suprise,motherf**ker!'
s1 = s[3:9:2] #前闭后开,原理类似数列切片,步长默认为1,正负决定方向
print(s1)
s1 = s[9:3:-2]
print(s1)
#格式化字符串
name = 'szj'
age = 20
print('我叫%s,今年%d岁'%(name,age)) #%s字符串、%i或%d整数、%f浮点数
print('我叫{0},今年{1}岁'.format(name,age)) #用format进行索引
print(f'我叫{name},今年{age}岁')
s = 'lch做饭超好吃'
byte = s.encode(encoding='GBK')
#编码
print(s.encode(encoding='GBK'))
print(s.encode(encoding='UTF-8'))
#解码
print(byte.decode(encoding='GBK'))
byte = s.encode(encoding='UTF-8')
print(byte.decode(encoding='UTF-8'))
值得一提的是编码解码这里,我收集了一下一些编码格式:
ASCII 码
学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。
ISO-8859-1
128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。 GB2312
它的全称是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。
GBK
全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。
GB18030
全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容,这个虽然是国家标准,但是实际应用系统中使用的并不广泛。
UTF-16
说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode 的详细规范可以参考相应文档。Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。
UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。
UTF-8
UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。
UTF-8 有以下编码规则:
如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节