第九章 字符串

第九章 字符串

字符串的驻留机制

  1. 如果内存中存在字符串的值,内存会直接分配给变量,不再创建新的对象
    驻留机制的几种情况:
    1. 字符串长度为0或1时
    2. 符合标识符的字符串。标识符:数字字母下划线组成的字符串
    3. 字符串只在编译时进行驻留,而非运行时
    4. [-5,256]之间的整数
a = 'python'
b = "python"
c = '''python'''

print(a,id(a))
print(b,id(b))
print(c,id(c))

# a,b,c 的id,type,value都相同

a = 'abc%'
b = 'abc%'
print(a is b) # False a,b都不是符合标识符的字符串
a.sys.intern(b)
print(a is b) # True sys中的intern方法强制将a,b指向同一个对象

a = 'abc'
b = 'ab'+'c'
c = ''.join(['ab','c']) # 运行之后c='abc'
print(a is b) # True
print(a is c) # False
  1. 驻留机制的优缺点
    优点:当需要相同的字符串的时候,直接在字符串池中拿就可以,能避免频繁的创建和销毁,提升效率和节约内存,所以拼接字符串和修改字符串是比较影响性能的。如果要拼接字符串的话,建议使用join方法,只创建一次对象
  2. 强制驻留的方法
    sys包中的intern方法

字符串的常用操作方法

  1. 查询
a = 'hello'
a.index('lo') # 3
a.find('lo') # 3
a.index('k') #ValueError: substring not found
a.find('k') # -1
  1. 大小写转换
a = 'HeLlo'
a.upper() # HELLO
a.lower() # hello
a.swapcase() # hElLO 小写转换成大写,大写转换成小写
a.capitalize() # Hello 字符串首字母大写,其余小写
a = 'hello,python'
a.title() # Hello,Python 单词首字母大写,其余小写 
  1. 内容对齐
a = 'hello'
a.center(20,'*') #  *******hello******** 居中对齐
a.ljust(20,'*') # hello*************** 左对齐 *可省略
a.rjust(20,'*') # ***************hello 右对齐 *可省略
a.zfill(20) # 000000000000000hello 右对齐 使用0补齐
'-810'.zfill(8) # -0000810 
  1. 字符串的劈分
s = 'hello world python'
a = s.split()  # ['hello', 'world', 'python']
s1 = 'hello|world|python'
# 从左侧开始劈分
a1 = s1.split(sep='|') # ['hello', 'world', 'python']
a1 = s1.split(sep='|',maxsplit=1) # ['hello', 'world|python']
# 从右侧开始劈分
a2 = s1.rsplit(sep='|') # ['hello', 'world', 'python']
a2 = s1.rsplit(sep='|',maxsplit=1)  # ['hello|world', 'python']
  1. 字符串的判断
s = 'hello,pyhon'
print('1.',s.isidentifier()) # False 不是合法的字符串
print('2.','hello'.isidentifier()) #True
print('3.','张三'.isidentifier())#True
print('4.','张三_12'.isidentifier())#True

print('5.','\t'.isspace()) # True 是空白字符

print('6.','abc'.isalpha()) # True 是否由字母组成
print('7.','张三'.isalpha()) # True
print('8.','张三1'.isalpha()) # False 1不是字母

print('9.','123'.isdecimal()) #True 是十进制数字组成
print('10.','123四'.isdecimal()) #False
print('11.','ⅡⅡⅡ'.isdecimal()) #False

print('12.','123'.isnumeric()) #True  是数字
print('13.','123四'.isnumeric()) #True
print('14.','ⅡⅡⅡ'.isnumeric()) #True

print('15.','abc1'.isalnum()) # True 由字母和数组组成
print('16.','张三123'.isalnum())# True
print('17.','abc!'.isalnum())# False
  1. 字符串的替换
s = 'hello,python'
print(s.replace('python','java')) # hello,java
s1 = 'hello,python,python,python'
print(s1.replace('python','java',2)) # hello,java,java,python
  1. 字符串的合并
lst = ['hello','java','python']
print('|'.join(lst))
print(' '.join(lst))

tu = ('hello','java','python')
print('|'.join(tu))
print(' '.join(tu))
  1. 字符串的比较
print('apple'>'app') # True
print('apple'>'banana') # False
print(ord('a'),ord('b')) # 获取原始值
print(ord('岳'))

print(chr(97),chr(98)) # 根据原始值获取字符串
print(chr(23731))

'''==与 is 的区别'''
''' == 比较的是值是否相等, is比较的是id'''
a=b='python'
c='python'
print(a==b) # True
print(a==c) # True
print(a is b) # True
print(a is c) # True
print(id(a)) # 2556376421872
print(id(b)) # 2556376421872
print(id(c)) # 2556376421872
  1. 格式化字符串
# 1. % 占位符
name = 'lisa'
age = 20
print('我叫%s,今年%d岁' % (name,age))

# 2. {}做占位符
print('我叫{0},今年{1}岁'.format(name,age))

# 3. f-string
print(f'我叫{name},今年{age}岁')

print('%10d' % 99) # 10表示宽度
print('%.3f' % 3.1415926) # 保留三位小数
# 同时表示宽度和精度
print('%10.3f' % 3.1415926) # 宽度为10,小数点后三位
print('hellohello')

print('{0:.3}'.format(3.1415926)) # .3表示一共三位数
print('{:.3f}'.format(3.1415926)) # .3f表示一共三位小数
print('{:10.3f}'.format(3.1415926)) # .3f表示一共三位小数,10表示宽度
  1. 字符编码
s = '天涯共此时'
# 编码
print(s.encode(encoding='gbk')) # 在GBK编码格式中,一个中文占两个字节
print(s.encode(encoding='utf-8')) # 在utf-8中,一个中文占3个字节
# 解码
# byte 代表的是一个二进制数据
byte = s.encode(encoding='gbk') # 编码
print(byte.decode(encoding='gbk')) # 解码

byte = s.encode(encoding='utf-8')
print(byte.decode(encoding='utf-8'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值