首页 > 编程语言 > 详细

Python学习系列之字符串的创建与驻留机制 (十七)

时间:2021-02-23 23:16:32      阅读:24      评论:0      收藏:0      [点我收藏+]

字符串的驻留机制

1.字符串

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

2.什么叫字符串驻留机制?

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

举例:

‘‘‘字符串的驻留机制‘‘‘
a=‘Python‘
b="Python"
c=‘‘‘Python‘‘‘
print(a,id(a))
print(b,id(b))
print(c,id(c))

  执行结果:

技术分享图片

  说明:a,b,c三个对象的值和内存地址都相同,即当创建了a后,后面新建与a内容相同的变量时,则不会重新开辟新的内存空间,而是直接把已有的内存地址赋值给b和c变量,如下图

技术分享图片

  3. 驻留机制的几种情况(交互模式)

  3.1 字符串的长度为0或1时

技术分享图片

  

  3.2 符合标识符的字符串(含有数字、字母、下划线是符合标识符的字符串)

技术分享图片

  说明:abc%不符合表示字符串,所有各有一个内存地址,abcx符合标识字符串,所以指向的是同一个内存地址

 

  3.3 字符串只在编译时进行驻留,而非运行时

技术分享图片

 

   3.4 [-5,256]之间的整数数字

技术分享图片

  

  3.5 sys中的intern方法强制2个字符串指向同一个对象

技术分享图片

  说明:a,b因为不是符合标识符的字符串,所以它们的内存地址是不一样的,在使用intern()方法后,使得b的内存地址被强制改成和a的内存地址一样,所以进行is运算时值是True

  3.6 PyCharm对字符串进行了优化处理

  举例:(使用PyCharm运行如下代码)

a=‘abc%‘
b=‘abc%‘
print(a is b)

  执行结果如下:

技术分享图片

  说明:如果使用终端来执行的话,上面代码输出结果是False,但是使用PyCharm运行,则结果是True,表示PyCharm对代码有做一定的优化。

 

4. 字符串驻留机制的优缺点

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

 

5.字符串的常用操作

5.1 字符串的查询操作的方法

技术分享图片

  举例:

查找变量s=‘hello,hello‘ 中 ‘lo‘ 的位置

‘‘‘字符串的查询操作‘‘‘
s=‘hello,hello‘
print(s.index(‘lo‘))
print(s.find(‘lo‘))
print(s.rindex(‘lo‘))
print(s.rfind(‘lo‘))
‘‘‘当查询不存在的字符时,index和rindex会报ValueError,find和rfind则返回-1,推荐用find‘‘‘
#print(s.index(‘k‘)) #ValueError: substring not found
print(s.find(‘k‘))  #-1
#print(s.rindex(‘k‘)) #ValueError: substring not found
print(s.rfind(‘k‘))  #-1

  执行结果如下:

技术分享图片

 

 说明:字符串索引图如下:

技术分享图片

  使用index和find是,‘lo‘ 出现的第一个位置是3,使用rindex和rfind查找最后一个‘lo‘的位置是9,当查找的字符不存在时,使用index和rindex时会报"ValueError",使用find和rfind时则返回-1

 

5.2 字符串的大小写转换操作的方法

技术分享图片

  举例:

  • 使用upper()方法将字符串 s=‘hello,Python‘ 都转成大写字母
s=‘hello,Python‘
# a=s.upper()       #转成大写之后,产生一个新的字符串对象
# print(a,id(a))
# print(s,id(s))

  执行结果:

技术分享图片

  说明:在对字符串进行大小写转换操作,会产生一个新的字符串对象,原来的字符串不变

 

  • 使用lower()方法将字符串 s=‘hello,Python‘ 都转成小写字母
s=‘hello,Python‘
a=s.lower()     #转成小写之后,产生一个新的字符串对象
print(a,id(a))
print(s,id(s))

  执行结果如下:

技术分享图片

  

  • 使用swapcase()方法将字符串 s=‘hello,Python‘ 进行大小写互换
s=‘hello,Python‘
a=s.swapcase()     #转换之后,产生一个新的字符串对象
print(a,id(a))
print(s,id(s))

  执行结果:

技术分享图片

  

  • 使用capitalize()方法将字符串 s=‘hello,Python‘ 把第一个字母转成大写,其它字母转成小写
s=‘hello,Python‘
a=s.capitalize()     #转换之后,产生一个新的字符串对象
print(a,id(a))
print(s,id(s))

  执行结果:

技术分享图片

  

  • 使用title()方法将字符串 s=‘hello,Python‘ 把每个单词的第一个字母转成大写,其它字母转成小写
s=‘hello,Python‘
a=s.title()     #转换之后,产生一个新的字符串对象
print(a,id(a))
print(s,id(s))

  执行结果:

技术分享图片

  

5.3 字符串内容对齐操作的方法

技术分享图片

  举例:

  • 使用center()方法将字符串 s=‘hello,Python‘ 进行居中对齐操作
#居中对齐
s=‘hello,Python‘
print(s.center(20,‘*‘))     #将s居中对齐,其它位置使用*进行填充

  执行结果:

技术分享图片

  

  • 使用ljust()方法将字符串 s=‘hello,Python‘ 进行左对齐操作
#左对齐
s=‘hello,Python‘
print(s.ljust(20,‘*‘))
print(s.ljust(10))
print(s.ljust(20))

  执行结果:

技术分享图片

  说明:使用ljust()方法进行左对齐操作时,如果设置宽度10小于原字符串宽度12时,则返回原字符串,如果设置宽度20大于原字符串宽度12时,则右边默认使用空格填充

 

  • 使用rjust()方法将字符串 s=‘hello,Python‘ 进行右对齐操作
#右对齐
s=‘hello,Python‘
print(s.rjust(20,‘0‘))
print(s.rjust(20))
print(s.rjust(8))

  执行结果:

技术分享图片

 说明:使用rjust()方法进行右对齐操作,当设置宽度20大于原字符串宽度12时,左侧默认使用空格填充,如果设置的宽度8小于原宽度12,则返回原字符串

 

  • 使用zfill()方法将字符串 s=‘hello,Python‘ 进行右对齐操作
#右对齐,使用0进行填充
s=‘hello,Python‘
print(s.zfill(20))
print(s.zfill(10))
print(‘-8910‘.zfill(8))

  执行结果:

技术分享图片

  说明:使用zfill()方法进行右对齐时,左侧默认使用0填充,当填充的数据前有符号时,则将0填充至符号之后

 

5.4 字符串劈分操作的方法

技术分享图片

  举例:

  • 用split()方法对字符串 s=‘hello world python‘ 进行劈分,使用默认空格劈分符
‘‘‘字符串的劈分(分割)‘‘‘
s=‘hello world python‘
lst=s.split()   #当不输入参数时,默认使用空格进行分割,分割后是一个列表
print(lst,type(lst))

  执行结果:

技术分享图片

  说明:s=‘hello world python‘中本身就包含空格,则会默认从空格处进行劈分,会劈分成‘hello‘,‘world‘,‘python‘3个字符串组成的列表

  • 用split()方法对字符串 s=‘hello world python‘ 进行劈分,使用劈分符 ‘|‘ 进行劈分,并最多劈分1次
‘‘‘使用指定的劈分符进行劈分‘‘‘
s1=‘hello|world|python‘
print(s1.split(sep=‘|‘))         #使用‘|‘进行劈分
print(s1.split(sep=‘|‘,maxsplit=1))     #使用‘|‘进行劈分,最多劈分1次,劈分之后剩余的子字符串会成为一个字符串

  执行结果:

技术分享图片

   说明:使用split()从右侧使用‘|‘进行劈分时,劈分成3个字符串,当使用参数 maxsplit=1 设置最大劈分次数为1时,剩下的 world|python 会作为一个字符串进行保存

  • 用rsplit()方法对字符串 s=‘hello world python‘ 进行劈分,使用劈分符 ‘|‘ 进行劈分,并最多劈分1次
‘‘‘rsplit()从右侧开始劈分‘‘‘
s1=‘hello|world|python‘
print(s1.rsplit(sep=‘|‘))
print(s1.rsplit(sep=‘|‘,maxsplit=1))    #使用‘|‘进行劈分,最多劈分1次,劈分之后剩余的子字符串会成为一个字符串

  执行结果:

技术分享图片

  说明:使用rsplit()从右侧使用‘|‘进行劈分时,和左侧劈分结果一样,都是劈分成3个字符串,当使用参数 maxsplit=1 设置最大劈分次数为1时,剩下的 hello|world 会作为一个字符串进行保存

 

5.5 判断字符串操作的方法

技术分享图片

  举例:

  • 判断字符串是否是合法的标识符
‘‘‘判断字符串的操作‘‘‘
#判断字符串是否是合法的标识符
s=‘hello,python‘
print(‘1.‘,s.isidentifier())    #False
print(‘2.‘,‘hello‘.isidentifier())    #True
print(‘3.‘,‘张三_‘.isidentifier())    #True
print(‘4.‘,‘张三_123‘.isidentifier())   #True

  执行结果:

技术分享图片

 说明:合法标识符是指含有字母、数字和下划线的字符串,s=‘hello,python‘ 中包含逗号,则执行结果为False

  • 判断字符串是否由空白字符串组成
print(‘5.‘,‘\t‘.isspace())    #True

    执行结果如下:

技术分享图片

  • 判断字符串是否全部由字母组成
#判断字符串是否全部由字母组成
print(‘6.‘,‘abc‘.isalpha())    #True
print(‘7.‘,‘张三‘.isalpha())    #True
print(‘8.‘,‘abc123‘.isalpha())      #False

  执行结果:

技术分享图片

 说明:‘abc123‘ 中包含数字,故输出为False

  • 判断字符串全部由十进制数字组成
#判断字符串全部由十进制数字组成
print(‘9.‘,‘123‘.isdecimal())    #True
print(‘10.‘,‘123四‘.isdecimal())    #False
print(‘11‘,‘ⅡⅡⅡⅢ‘.isalpha())    #False

  执行结果:

技术分享图片

 说明:‘四‘ 不是十进制数字,返回False,‘ⅡⅡⅡⅢ‘也不是十进制数字,返回False

  • 判断字符串是否全部由数字组成
#判断字符串是否全部由数字组成
print(‘12.‘,‘123‘.isnumeric())    #True
print(‘13.‘,‘123四‘.isnumeric())    #True
print(‘14.‘,‘ⅡⅡⅡⅢ‘.isnumeric())    #True

  执行结果:

技术分享图片

  说明:‘四‘ 是数字,返回True,‘ⅡⅡⅡⅢ‘也是数字,返回True

  • 判断字符串是否全部由字母和数字组成
#判断字符串是否全部由字母和数字组成
print(‘15.‘,‘abc1‘.isalnum())    #True
print(‘16.‘,‘张三123‘.isalnum())    #True
print(‘17.‘,‘abc!‘.isalnum())    #False

  执行结果:

技术分享图片

  说明:‘张三123‘是由数字和字母组成,‘abc!‘不是由数字和字母组成,则返回False

5.6 字符串操作的其它方法

技术分享图片

  举例:

‘‘‘字符串的替换‘‘‘
s=‘hello,Python‘
print(s.replace(‘Python‘,‘Java‘))
s1=‘hello,Python,Python,Python‘
print(s1.replace(‘Python‘,‘Java‘,2))

  执行结果:

技术分享图片

  说明:s1.replace(‘Python‘,‘Java‘,2) 中2表示最多替换2次,所以最后一个输出中还有一个Python

  • 字符串的合并
lst=[‘hello‘,‘java‘,‘python‘]
print(‘|‘.join(lst))
print(‘‘.join(lst))

t=(‘hello‘,‘java‘,‘python‘)
print(‘‘.join(t))

print(‘*‘.join(‘Python‘))

  执行结果:

技术分享图片

  说明:‘*‘.join(‘Python‘) 中将Pyhton当成一个序列,如果想用空连接字符串,则用‘‘即可

 

Python学习系列之字符串的创建与驻留机制 (十七)

原文:https://www.cnblogs.com/wx170119/p/14437943.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!