目录
字符串是不可变序列。
1. 字符串的驻留机制
Python当中的驻留机制对相同的字符串只保留了一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把字符串的地址赋给新创建的变量。
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/21 17:17
a = 'Python'
b = "Python"
c = '''Python'''
print(a, id(a))
print(b, id(b))
print(c, id(c))
驻留的几种情况:
① 字符串长度为0或1时。
② 符合标识符的字符串。
③ 数字范围 [-5,256]
python 交互模式下:
Microsoft Windows [版本 10.0.19044.1466]
(c) Microsoft Corporation。保留所有权利。
C:\Users\xxxxx>python
Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s1=''
>>> s2=''
>>> s1 is s2
True
>>> s1='%'
>>> s2='%'
>>> s1 is s2
True
>>> s1 = 'abc%'
>>> s2 = 'abc%'
>>> s1 is s2
False
>>> s1==s2
True
>>> id(s1)
2412639014384
>>> id(s2)
2412639014768
>>> s1='abcx'
>>> s2='abcx'
>>> s1 is s2
True
>>> id(s1)
2412639014832
>>> id(s2)
2412639014832
>>> a= 'abc'
>>> b = 'ab'+'c'
>>> c=''.join(['ab','c'])
>>> type(a)
<class 'str'>
>>> a is b
True
>>> a is c
False
>>> a=-5
>>> b=-5
>>> a is b
True
>>> a= -6
>>> b = -6
>>> a is b
False
>>> import sys
>>> a='abc%'
>>> b='abc%'
>>> a is b
False
>>> a=sys.intern(b)
>>> a is b
True
>>>
但是在pycharm中对驻留机制优化了:下面的代码中结果是 True
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/21 23:28
s1='abc%'
s2='abc%'
print(s1 is s2)
在使用拼接字符串的时候,建议使用str类型的join方法,而非+,因为+会产生多个对象,进行相加。而join()只会产生一个对象,效率要比+高。
2. 字符串的常用操作
2.1 字符串查找操作
index() | 查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出 ValueError |
rindex() | 查找子串 substr 最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError |
find() | 查找子串 substr 第一次出现的位置,如果查找的子串不存在时,则返回-1 |
rfind() | 查找子串 substr 最后一次出现的位置,如果查找的子串不存在时,则返回-1 |
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 9:32
# 字符串查询操作
s = 'Hello,Hello'
print(s.index('lo'))
print(s.find('lo'))
print(s.rindex('lo'))
print(s.rfind('lo'))
# print(s.index('k')) # ValueError: substring not found
print(s.find('k'))
# print(s.rindex('k')) # ValueError: substring not found
print(s.rfind('k'))
2.2 字符串大小写转换操作
upper() | 把字符串中所有字符都转成大写字母 |
lower() | 把字符串中所有字符都转成小写字母 |
swapcase() | 把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母 |
capitalize() | 把第一个字符转换为大写,把其余字符转换为小写 |
title() | 把每个单词的第一个字符转换为大写,把每个单词的剩余字符转换为小写 |
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 9:49
s = 'hello,python'
a = s.upper() # 转成大写,会产生新的字符串对象
print(a, id(a))
print(s, id(s))
b = s.lower()
print(b, id(b)) # 转成小写,会产生新的字符串对象
print(s, id(s))
print(b == s) # 比较的是内容
print(b is a) # 比较的是内存地址
s2 = "hello,Python"
print(s2.swapcase())
print(s2.capitalize())
print(s2.title())
2.3 字符串内容对齐的方法
center() | 居中对齐,第1个参数指定宽度,第2个参数指定填充符。第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度,则返回原字符串。 |
ljust() | 左对齐,第1个参数指定宽度,第2个参数指定填充符。第2个参数是可选的,默认是空格如果设置宽度小于实际宽度,则返回原字符串 |
rjust() | 右对齐,第1个参数指定宽度,第2个参数指定填充符。第2个参数是可选的,默认是空格如果没置宽度小于实际宽度,则返回原字符串 |
zfill() | 右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度|小于等于字符串的长度,返回字符串本身 |
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 10:05
s = 'hello,python'
print(s.center(20, '*'))
print(s.ljust(20, '*'))
print(s.ljust(10))
print(s.ljust(20))
print(s.rjust(20, '*'))
print(s.rjust(10))
print(s.rjust(20))
print(s.zfill(20))
print(s.zfill(10))
print('-8910'.zfill(8)) # 将0 添加到负号后面
2.4 字符串分割操作的方法
splito | 1. 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 2. 以通过参数 sep 指定劈分字符串是的劈分符 3. 通过参数 maxsplit 指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分 |
rsplitO | 1. 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 2. 以通过参数 sep 指定劈分字符串是的劈分符 3. 通过参数 maxsplit 指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分 |
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 10:17
s1 = 'hello world python'
lst = s1.split()
print(lst)
s2 = 'hello|world|python'
print(s2.split(sep='|'))
print(s2.split(sep='|', maxsplit=1))
print(s1.rsplit())
print(s2.rsplit('|'))
print(s2.rsplit(sep='|', maxsplit=1))
2.5 字符串判断操作的方法
isidentifier() | 判断指定的字符串是不是合法的标识符 |
isspace() | 判断指定的字符串是否全部由空白字符组成(回车、换行,水平制表符) |
isalpha() | 判断指定的字符串是否全部由字母组成 |
isdecimal() | 判断指定字符串是否全部由十进制的数字组成 |
isnumeric() | 判断指定的字符串是否全部由数字组成 |
isalnum() | 判断指定字符串是否全部由字母和数字组成 |
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 10:49
s = 'hello,world'
print('1.', s.isidentifier())
print('2.', 'hello'.isidentifier())
print('3.', '张三'.isidentifier())
print('4.', '张三_123'.isidentifier())
print('5.', '\t'.isspace())
print('6.', 'abc'.isalpha())
print('7.', '张三'.isalpha()) # True
print('8.', '张三1'.isalpha())
print('9.', '123'.isdecimal())
print('10.', '123四'.isdecimal())
print('11.', 'ⅠⅡⅢⅣ'.isdecimal())
print('12.', '123'.isnumeric())
print('13.', '123四'.isnumeric())
print('14.', 'ⅠⅡⅢⅣ'.isnumeric())
print('15.', 'abc1'.isalnum())
print('16.', '张三123'.isalnum())
print('17.', 'abc!'.isalnum())
2.6 字符串其他操作的方法
replace() | 第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换后得到字符串替换的字符串,替换前的字符串不发生变化,调用该方法时可以通过第3个参数指定最大替换次数字符串的合并。 |
join() | 将列表或元组中的字符串合并成一个字符串 |
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 11:07
s = 'hello,Python'
print(s.replace('Python', 'Java'))
s1 = 'hello,Python,Python,Python'
print(s1.replace('Python', 'Java', 2))
lst = ['hello', 'Java', 'Python']
print('|'.join(lst))
print(''.join(lst))
t = ('hello', 'Java', 'Python')
print(''.join(t))
print('*'.join('Python')) # P*y*t*h*o*n
3. 字符串的比较
比较运算符: >、>=、<、<=、==、!=
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 11:21
print('apple' > 'app')
print('apple' > 'banana')
print(ord('a'), ord('b'))
print(ord('李'))
print(chr(97), chr(98))
print(chr(26446))
4. 字符串的切片
跟列表的切片很相似
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 12:17
s = 'hello,Python'
s1 = s[:5]
print(s1)
s2 = s[6:]
print(s2)
s3 = '!'
str = s1 + s3 + s2
print(str)
print(id(s))
print(id(s1))
print(id(s2))
print(id(s3))
print(id(str))
print(s[1:5:1]) # 1 2 3 4
print(s[::2]) # 从 0 到 最后,步长为2
print(s[::-1])
print(s[-6::1])
5. 格式化字符串
%s | 字符串 |
%d | 整数 |
%f | 浮点数 |
三种方式:%、{}、f-format()
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 12:30
name = '张三'
age = 20
print('我是%s,今年%d' %(name, age))
print('我是{0},今年{1}'.format(name, age))
print(f'我是{name},今年{age}')
%m.nf 是浮点型数据的输出格式控制说明,指定了输出浮点型数据时保留 n 位小数,且输出宽度为 m 。
print('%10d' % 99) # 宽度限定符
print('%.3f' % 3.1415926) # .3 小数位
print('%10.3f' % 3.1415926)
print('{0}'.format(3.1415926))
print('{0:.3}'.format(3.1415926)) # .3 表示一共三位数
print('{0:.3f}'.format(3.1415926)) # .3f 表示三位小数
print('{0:10.3f}'.format(3.1415926))
6. 字符串的编码转换
编码:将字符串类型转换成二进制类型
解码:将 byte 类型转换成字符串类型
# 作 者:要努力,努力,再努力
# 开发日期:2022/4/22 14:15
s = '天涯共此时'
print(s.encode(encoding='GBK')) # b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1' b 代表二进制 一个中文占两个字节
print(s.encode(encoding='UTF')) # b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6' b 代表二进制 一个中文占三个字节
byte = s.encode(encoding='GBK')
print(byte.decode(encoding='GBK'))
# print(byte.decode(encoding='UTF-8')) # 编码格式不一报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte
byte = s.encode(encoding='UTF-8')
print(byte.decode(encoding='UTF-8'))