字符串是基本数据类型,是一个不可变的字符序列 字符串可以使用 单引号 双引号 三个单引号 三个双引号 创建
1.字符串的驻留机制:
1。仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中, python的驻留机制对相同的字符串只保留一份拷贝,后续创建的相同字符串时,不会开辟新空间, 而是把该字符串的地址赋给新创建的变量 a = 'python' b = "python" c = '''python''' 这里的abc 都指向同一个内存地址 2。交互模式: 字符串的长度为0或1时 a = '' b = '' 符合表示标识符的字符串(标识符:字母,数字,下划线) a = 'abc' b = 'abc' 字符串只在编译时进行驻留,而非运行时 a = 'abc' b = 'ab'+'c' c = ''.join(['ab','c']) a is b # True a is c # False 为了后续更快,python在启动的时候就已经把能运行的各种乘除加减都算过了;那些编译时候算不了的,就只能运行的时候算, 所以 编译后,b的值是 'abc',c的值还没算出来 所以a和c不指向同一块内存空间 编程的工作原理分三步: 1.程序员在写代码的软件里写下Python这类的编程语言(高级语言) 2.电脑里的解释器(编译器)将我们写的字母标点转化为010之类的二进制数据 3.计算机读取二进制数据信息,执行相应的命令 这里的“+”会在第二步被编译器读取并将a和bc连接,从而产生驻留, 而join()作为函数并不会被编译器读取,而是进入第三步被计算机识别, 计算机识别join()函数后再将前面的空格与后面的ab,c连在一起, 驻留机制只会发生在编译过程就是这个意思 [-5,256]之间的整数数字 3。sys库中的intern方法强制2个字符串指向同一个对象 import sys a = 'abc%' b = 'abc%' a = sys.intern(b) a is b # True 4。pycharm对字符串进行了优化处理,所以只能在命令行中测试 5。驻留机制的优缺点 当需要值相同当字符串时,可以直接从字符串池里拿来使用,避免频繁当创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串比较影响性能 在需要进行字符串拼接时建议使用 str类型当join 方法,而非+,因为join方法是先计算出所有字符串当长度,然后再拷贝,只new一次对象,效率比+高
2. 字符串的常用操作:
1. 查找:
index() 查找子串substr第一次出现的位置,如果查找的子串不存在时,抛错valueError rindex() 查找子串substr最后一次出现的位置,不存在时,抛错valueError find() 查找子串substr第一次出现的位置,不存在时,返回 -1 rfind() 查找子串substr最后一次出现的位置,不存在时,返回 -1
str1 = 'hello,hello'
print(str1.index('lo'))
print(str1.rindex('lo'))
print(str1.find('lo'))
print(str1.rfind('lo'))
2.大小写转换:
转换不管之前是否全大写或全小写,转换后都会产生一个新的字符串对象 upper() 转成大写 lower() 转换小写 swapcase() 把大写转换成小写,小写转换成大写 capitalize() 第一个转换为大写,其他转为小写 title() 每一个单词大第一个字母转换为大写,剩余字符转换为小写
s1 = 'hello WORLD'
print(s1.upper()) # 大写
print(s1.lower()) # 小写
print(s1.swapcase()) # 第一个单词大写
print(s1.capitalize()) # 第一个字母大写
print(s1.title()) # 单词首字母大写
3.对齐方法:
center() 居中对齐,第一个参数指定宽度,第二个参数指定填充符,默认是空格,如果设置宽度小于实际宽度则返回原字符串 ljust() 左对齐 rjust() 右对齐 zfill() 右对齐,左边用0填充,只接受一个参数,用于指定字符串大宽度
print(s1.center(20, '-')) # 总长度20
print(s1.center(1)) # 低于字符串长度,返回原字符串
print(s1.ljust(20)) # 左对齐
print(s1.rjust(20)) # 右对齐
print(s1.zfill(20)) # 右对齐 左边用0填充
print('-111'.zfill(20)) # +或者- 0填充在符号对右边 -0000000000000000111
4.劈分操作:
split() 从字符串的左边开始劈分,默认的劈分字符串是空格字符串,返回值都是一个列表 以通过sep指定劈分字符串的劈分符 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次数劈分之后,剩余的子串会单独作为一部分 rsplit() 从右边开始劈分 如果没指定最大劈分次数 和 split结果是一样的
s = 'hello world python'
print(s.split())
s1 = 'hello,world,python'
print(s1.split(sep=','))
print(s1.split(sep=',', maxsplit=1))
print(s1.rsplit(sep=','))
print(s1.rsplit(sep=',', maxsplit=1))
5.判断方法:
isidentifier() 是不是合法的标识符 isspace() 是否全部由空白字符组成(回车、换行、水平制表符) isalpha() 是否全部由字母组成 isdecimal() 是否全部由十进制的数字组成 isnumeric() 是否全部由数字组成 isalnum() 是否 由字母和数字组成
print('_a1_'.isidentifier()) # 只能是字母,数字,下划线,数字不能作为开头
print('\t'.isspace()) # 空格 换行 水平制表符
print('abc'.isalpha()) # 全部都是由字母组成
print('111'.isdecimal()) # 十进制数字组成 只能是阿拉伯数字
print('123四五'.isnumeric()) # 全部数字组成 包含罗马数字,大写数字
print('111ABC'.isalnum()) # 全部由字母或数字组成
6.替换合并:
replace() 第一个参数指定被替换的子串,第二个参数指定替换子串的字符串, 该方法返回替换后的字符串,不改变原字符串,第三个参数指定最大替换的次数 join() 将列表或元组的字符串合并成一个字符串
print('hello, hello, hello'.replace('hello', 'hi'))
print('hello, hello, hello'.replace('hello', 'hi', 2))
print(','.join(['hello', 'hi'])) # hello,hi
print(' '.join(('hi', 'hello'))) # hi hello
print('-'.join('hello')) # h-e-l-l-o
7. 字符串的比较:
运算符:>, >=, <, <=, ==, != 比较规则: 首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,直到不想等时,其比较的结果就是两个字符串的比较结果, 两个字符串中的所有后续字符将不再进行比较 比较原理: 两个字符串进行比较时,比较的是其 ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal value, 与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value 可以得到其对应的字符
8.字符串的切割:
s = 'hello,python'
print(s[1:5:1]) # 从1开始截取到5(不包含5),步长为1
print(s[::2]) # 默认从0开始,没有写结束,默认字符串的最后一个,步长为2
print(s[::-1]) # 默认从字符串的最后一个开始,到第一个结束,步长为负数
print(s[-6::1]) # 从索引为-6开始,到字符串到最后一个结束,步长为1
9. 格式化字符串:
%作占位符 %s 字符串 %i 或者 %d 整数 %f 浮点数 '我的名字叫:%s, 今年 %d 岁了' %(name, age) {}占位符 '我的名字叫:{0},今年{1}岁了,我真的叫:{0}'.format(name, age) f-string f'我叫{name}, 今年{age}岁
name = '张三'
age = 20
print('我叫 %s,今年 %d 岁了' % (name, age)) # % 后面跟元组
print('我叫{0}, 今年{1}岁了'.format(name, age)) # format 方法
print(f'我叫{name}, 今年{age}岁') # f-string
print('%10d' % 99) # 10表示宽度,如果不够左边加空格补齐
print('%.3f' % 3.1415926) # .3表示将小数点后三位,后面四舍五入
print('%10.3f' % 3.14159) # 同时表示宽度和精度
print('{0:.3}'.format(3.1415926)) # .3表示一共是3位数
print('{0:.3f}'.format(3.1415926)) # .3f表示是3位小数
print('{0:10.3f}'.format(3.1415926)) # 10.3f 同时设置宽度和精度,10位,3位数小数
10.字符串的编码转换:
编码:将字符串转换为二进制数据(bytes) 解码:将bytes类型的数据转换成字符串类型 在gbk这种编码格式中,一个中文占两个字节 在utf-8这种编码格式中,一个中文占三个字节
print('海上生明月'.encode(encoding='utf-8'))
print('海上生明月'.encode(encoding='utf-8').decode(encoding='utf-8'))