1、字符串的驻留机制
- 字符串
·在Python中字符串是基本数据类型,是一个不可变的字符序列 - 什么叫字符串驻留机制呢?
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
a = 'python'
b = "python"
c = '''python'''
print(a,id(a))
print(b,id(b))
print(c,id(c))
输出结果:
python 2957716513880
python 2957716513880
python 2957716513880
三个字符串的的内存地址是一样的。
-
驻留机制的几种情况(交互模式)
·字符串的长度为0或1时
·符合标识符的字符串
·字符串只在编译时进行驻留,而非运行时
·[-5,256]之间的整数数字
· sys中的intern方法强制2个字符串指向同一个对象.
PyCharm对字符串进行了优化处理 -
字符串驻留机制的优缺点:
-
当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁
的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是
会比较影响性能的 -
在需要进行字符串拼接时建议使用str类型的join方法,而非+ , 因为join()
方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效
率要比"+"效率高
2、字符串的常用操作·
- 字符串的查询操作的方法
s = 'hello,hello'
print(s.index('lo')) #查找第一次出现的位置
print(s.find('lo')) #查找第一次出现的位置
print(s.rindex('lo')) #查找最后一次出现的位置
print(s.rfind('lo')) #查找最后一次出现的位置
输出结果:
3
3
9
9
s = 'hello,hello'
print(s.index('k')) #查询的子串不存在,抛异常
输出结果:
Traceback (most recent call last):
File "F:/myfile/python/code/test.py", line 19, in <module>
print(s.index('k'))
ValueError: substring not found
s = 'hello,hello'
print(s.find('k')) #查找子串不存在就返回-1
输出结果:
-1
- 字符串的大小写转换操作的方法
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) #判断内容是否相等, True
print(b is s) #判断内存地址是否相等 ,False
输出结果:
HELLO,PYTHON 2458502897712
hello,python 2458502897840
hello,python 2458502897776
hello,python 2458502897840
True
False
- 字符串内容对齐操作的方法
s = 'python'
print(s.center(20,'*')) #居中
print(s.ljust(20,'*')) #左对齐
print(s.ljust(4)) #小于字符串长度,原样输出
print(s.ljust(20)) #不指定填充符,会用空格填充
print(s.rjust(20,'*')) #右对齐
print(s.zfill(20)) #右对齐用0填充
输出结果:
*******python*******
python**************
python
python
**************python
00000000000000python
- 字符串劈分操作的方法
s = 'hello world python'
lst = s.split() #默认分隔符是空格,分割后产生一个list
print(lst)
s = "logs;good;script"
lst = s.split(sep=';')
print(lst)
输出结果:
['hello', 'world', 'python']
['logs', 'good', 'script']
- 判断字符串操作的方法
- 字符串的其他操作方法
s = "hello,python"
print(s.replace('python','php'))
s1 = 'hello python python python'
print(s1.replace('python','php',2))
lst = ['mysql','oracle','serversql']
print('|'.join(lst))
print(''.join(lst))
输出结果:
hello,php
hello php php python
mysql|oracle|serversql
mysqloracleserversql
3、字符串的比较
- 运算符:> ,>=, <, <=. ==, !=
- 比较规则:首先比较两个字符串中的第一 个字符,如果相等则继续比较下-一个字
符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个
字符串的比较结果,两个字符串中的所有后续字符将不再被比较 - 比较原理:两上字符进行比较时,比较的是其ordinal value(原始值),调用内置函.
数ord可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,
调用内置函数chr时指定ordinal value’可以得到其对应的字符
s1 = 'apple'
s2 = 'app'
print(s1 > s2)
s1 = 'apple'
s2 = 'bana'
print(s1 > s2)
print(ord('a'),ord('b'))
输出结果:
True
False
97 98
4、字符串的切片操作·
切片操作都会返回一个新的列表
#模式[start:end:step]
"""
其中,第一个数字start表示切片开始位置,默认为0 ;
第二个数字end表示切片截止(但不包含)位置(默认为列表长度);
第三个数字step表示切片的步长(默认为1)。
当start为0时可以省略,当end为列表长度时可以省略,
当step为1时可以省略,并且省略步长时可以同时省略最后一个冒号。
另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行。
"""
aList = [3,4,5,6,7,9,11,13,15,17]
aList[::] #返回包含原列表中所有元素的新列表
aList[::-1] #返回包含原列表中所有元素的逆序列表
print(aList[ ::2]) #隔一个取一个,获取偶数位置的元素
print(aList[1::2]) #隔一个取一个,获取奇数位置的元素
print(aList[3:6]) #指定切片的开始和结束位置
aList[0:100] #切片结束位置大于列表长度时,从列表尾部截断
aList[100:] #切片开始位置大于列表长度时,返回空列表
alist[len(aList):] = [9] #在列表尾部增加元素
aList[:0] = [1,2] #在列表头部插入元素
alist[3:3] = [4] #在列表中间位置插入元素
aList[:3] = [1,2] #替换列表元素,等号两边的列表长度相等
aList[3:] = [4,5,6] #等号两边的列表长度也可以不相等
5、格式化字符串
name = 'mary'
age = 18
print('我叫%s,今年%d岁' % (name,age))
print('我叫{0},今年{1}岁'.format(name,age))
print(f'我叫{name},今年{age}岁')
输出结果:
我叫mary,今年18岁
我叫mary,今年18岁
我叫mary,今年18岁
6、字符串的编码转换
s = "江海寄余生"
print(s.encode("gbk"))
byte = s.encode("gbk") #编码
print(byte.decode("gbk")) #解码
输出结果:
b'\xbd\xad\xba\xa3\xbc\xc4\xd3\xe0\xc9\xfa'
江海寄余生