【Python】字符串详解

目录

1、字符串的驻留机制

驻留机制的优缺点

2、字符串的常用操作

2.1 查询

 2.2 大小写转换

2.3 字符串对齐

 2.4 字符串劈分

 2.5 判断字符串

2.6 替换和合并 

3、字符串的比较

4、字符串的切片操作

5、格式化字符串

6、字符串的编码转换


字符串

在Python中字符串是基本数据类型,是一个不可变的字符序列

1、字符串的驻留机制

仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串时,不会开辟新空间,而把该字符串的地址赋给新创建的变量

a = 'Python'
b = "Python"
c = '''Python'''
print(id(a))
print(id(b))
print(id(c))
#三者的值相同

驻留机制的优缺点

  • 当需要值相同的字符串时,可以直接从字符串池里面拿来使用,避免频繁创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的
  • 在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率更高

2、字符串的常用操作

2.1 查询

  • index():查找子串substr第一次出现的位置,若不存在,则抛出ValueError
  • rindex():查找子串substr最后一次出现的位置,若不存在,则抛出ValueError
  • find():查找子串substr第一次出现的位置,若不存在,则返回-1
  • rfind():查找子串substr最后一次出现的位置,若不存在,则返回-1
s='hello,hello'
print(s.index('lo')) #3
print(s.find('lo')) #3
print(s.rindex('lo')) #9
print(s.rfind('lo')) #9

 2.2 大小写转换

  • upper():把字符串中所有字符转换成大写字母
  • lower():把字符串中所有字符转换成小写字母
  • swapcase():把字符串中所有大写字符转换成小写字母,把所有小写字符转换成大写字母
  • capitalize():把第一个字符转换成大写,其余字符转换成小写
  • title():把每个单词的第一个字符转换成大写,其余字符转换成小写

2.3 字符串对齐

  •  center():居中对齐,第1个参数指定宽度,第2个参数指定填充符(可选,默认为空格),如果设置宽度小于实际宽度则返回原字符串
  • ljust():左对齐,第1个参数指定宽度,第2个参数指定填充符(可选,默认为空格),如果设置宽度小于实际宽度则返回原字符串
  • rjust():右对齐,第1个参数指定宽度,第2个参数指定填充符(可选,默认为空格),如果设置宽度小于实际宽度则返回原字符串
  • zfill():右对齐,左边用0填充,只接收一个参数用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回原字符串
s='hello,python'
print(s.center(20,'*')) # ****hello,python****
print(s.ljust(20,'*')) # hello,python********
print(s.rjust(20,'*')) # ********hello,python
print(s.zfill(20)) # 00000000hello,python
print(s.zfill(10)) # hello,python

m='-2736'
print(m.zfill(8)) # -0002736

 2.4 字符串劈分

  • split():从字符串左边开始劈分,默认的劈分字符(通过sep参数指定)是空格字符串,返回的值都是一个列表,参数maxsplit指定最大劈分次数
  • rsplit():从字符串右边开始劈分
s='hello world python'
lst=s.split()
print(lst) #['hello','world','python']

s1='hello|world|python'
print(s1.split(sep='|')) #['hello','world','python']
print(s1.split(sep='|',maxsplit=1)) #['hello','world|python']


print(s.rsplit())#['hello','world','python']
print(s1.rsplit(sep='|')) #['hello','world','python']
print(s1.rsplit(sep='|',maxsplit=1)) #['hello|world','python']

 2.5 判断字符串

  • isidentifier():判断指定的字符串是不是合法的标识符
  • isspace():判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)
  • isalpha():判断指定的字符串是否全部由字母组成
  • isdecimal():判断指定的字符串是否全部由十进制的数字组成
  • isnumeric():判断指定的字符串是否全部由数字组成
  • isalnum():判断指定的字符串是否全部由字母和数字组成
s='hello,python'
print(s.isidentifier()) #False
print('\t'.isspace()) #True
print('abc'.isalpha()) #True
print('张三'.isalpha()) #True
print('123四'.isdecimal()) #False
print('123'.isnumeric()) #True
print('123四'.isnumeric()) #True
print('abc1'.isalnum()) #True

2.6 替换和合并 

  • replace():用第2个参数替换第1个参数指定的字符串
  • join():将列表或元组中的字符串合并成一个字符串
s='hello,python'
print(s.replace('python','java'))# hello,java

lst=['hello','java','python']
print('|'.join(lst)) # hello|java|python
print(''.join(lst)) # hellojavapython

t=('hello','java','python')
print(''.join(t)) # hellojavapython

print('*'.join('python')) # p*y*t*h*o*n

3、字符串的比较

运算符:>,>=,<,<=,==,!= (一个字符一个字符进行比较,直至不同)

print('apple'>'app') # True
print('apple'>'banana') # False 比较的是a和b的ord值(a为97,b为98)

==和is的区别

==比较的是value

is比较的是两者的id

4、字符串的切片操作

切片将产生新的对象

 切片左闭右开

s='hello,python'
s1=s[:5]
print(s1) #hello

s2=s[6:]
print(s2) #python

s3='!'
newstr=s1+s3+s2
print(newstr) #hello!python

#s1,s2,s3,newstr的id都不相同

切片[start:end:step] 

s='hello,python'
print(s[1:5:1]) #ello
print(s[::2]) #hlopto
print(s[::-1]) #nohtyp,olleh
print(s[-6::1]) #python

5、格式化字符串

格式化字符串的两种方式

(1)%作占位符

%s:字符串

%d:整数

%f:浮点数

例:'我的名字叫:%s,今年%d岁了' % (name,age)

name='张三'
age=20
print('我叫%s,今年%d岁' % (name,age)) #我叫张三,今年20岁

(2){}作占位符

例:'我的名字叫:{0},今年{1}岁了' .format(name,age)

name='张三'
age=20
print('我叫{0},今年{1}岁'.format(name,age)) #我叫张三,今年20岁
print(f'我叫{name},今年{age}岁') #我叫张三,今年20岁

print('{0:.3}'.format(3.1415926)) #3.14(0是占位符,3代表一共3位数)
print('{:.3f}'.format(3.1415926)) #3.142

宽度和精度

print('%10d' % 99) #        99(10表示宽度)
print('%.3f' % 3.1415926) #3.142(3表示小数点后三位)
print('%10.3f' % 3.1415926) #     3.142

6、字符串的编码转换

为什么要进行编码转换

编码:将字符串转换为二进制(bytes)

解码: 将bytes类型的数据转换成字符串

编码和解码的格式一定要相同 

s='天涯共此时'
#编码
print(s.encode(encoding='GBK')) # b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'
print(s.encode(encoding='UTF-8')) #b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'

#解码
byte=s.encode(encoding='GBK')
print(byte.decode(encoding='GBK')) #天涯共此时

byte=s.encode(encoding='UTF-8')
print(byte.decode(encoding='UTF-8')) #天涯共此时

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RexHarrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值