【Python 25】字符串的创建和驻留机制

目录

1. 字符串的驻留机制

2. 字符串的常用操作

2.1 字符串查找操作

2.2 字符串大小写转换操作

2.3 字符串内容对齐的方法

2.4 字符串分割操作的方法

2.5 字符串判断操作的方法

2.6 字符串其他操作的方法

3. 字符串的比较

4. 字符串的切片

5. 格式化字符串

6. 字符串的编码转换


字符串是不可变序列。

1. 字符串的驻留机制

Python当中的驻留机制对相同的字符串只保留了一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把字符串的地址赋给新创建的变量。

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/21 17:17
a = 'Python'
b = "Python"
c = '''Python'''
print(a, id(a))
print(b, id(b))
print(c, id(c))

驻留的几种情况:

① 字符串长度为0或1时。

② 符合标识符的字符串。

③ 数字范围 [-5,256]

python 交互模式下:

Microsoft Windows [版本 10.0.19044.1466]
(c) Microsoft Corporation。保留所有权利。

C:\Users\xxxxx>python
Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s1=''
>>> s2=''
>>> s1 is s2
True
>>> s1='%'
>>> s2='%'
>>> s1 is s2
True
>>> s1 = 'abc%'
>>> s2 = 'abc%'
>>> s1 is s2
False
>>> s1==s2
True
>>> id(s1)
2412639014384
>>> id(s2)
2412639014768
>>> s1='abcx'
>>> s2='abcx'
>>> s1 is s2
True
>>> id(s1)
2412639014832
>>> id(s2)
2412639014832
>>> a= 'abc'
>>> b = 'ab'+'c'
>>> c=''.join(['ab','c'])
>>> type(a)
<class 'str'>
>>> a is b
True
>>> a is c
False
>>> a=-5
>>> b=-5
>>> a is b
True
>>> a= -6
>>> b = -6
>>> a is b
False
>>> import sys
>>> a='abc%'
>>> b='abc%'
>>> a is b
False
>>> a=sys.intern(b)
>>> a is b
True
>>>

但是在pycharm中对驻留机制优化了:下面的代码中结果是 True

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/21 23:28
s1='abc%'
s2='abc%'
print(s1 is s2)

 在使用拼接字符串的时候,建议使用str类型的join方法,而非+,因为+会产生多个对象,进行相加。而join()只会产生一个对象,效率要比+高。

2. 字符串的常用操作

 2.1 字符串查找操作

index()查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出 ValueError
rindex()查找子串 substr 最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError
find()查找子串 substr 第一次出现的位置,如果查找的子串不存在时,则返回-1
rfind()查找子串 substr 最后一次出现的位置,如果查找的子串不存在时,则返回-1

 

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 9:32
# 字符串查询操作
s = 'Hello,Hello'
print(s.index('lo'))
print(s.find('lo'))
print(s.rindex('lo'))
print(s.rfind('lo'))

# print(s.index('k'))  # ValueError: substring not found
print(s.find('k'))
# print(s.rindex('k'))  # ValueError: substring not found
print(s.rfind('k'))

 2.2 字符串大小写转换操作

upper()把字符串中所有字符都转成大写字母
lower()把字符串中所有字符都转成小写字母
swapcase()把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母
capitalize()把第一个字符转换为大写,把其余字符转换为小写
title()把每个单词的第一个字符转换为大写,把每个单词的剩余字符转换为小写
# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 9:49
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)  # 比较的是内容
print(b is a)  # 比较的是内存地址

s2 = "hello,Python"
print(s2.swapcase())
print(s2.capitalize())
print(s2.title())


2.3 字符串内容对齐的方法

center()居中对齐,第1个参数指定宽度,第2个参数指定填充符。第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度,则返回原字符串。
ljust()左对齐,第1个参数指定宽度,第2个参数指定填充符。第2个参数是可选的,默认是空格如果设置宽度小于实际宽度,则返回原字符串
rjust()右对齐,第1个参数指定宽度,第2个参数指定填充符。第2个参数是可选的,默认是空格如果没置宽度小于实际宽度,则返回原字符串
zfill()右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度|小于等于字符串的长度,返回字符串本身
# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 10:05
s = 'hello,python'

print(s.center(20, '*'))

print(s.ljust(20, '*'))
print(s.ljust(10))
print(s.ljust(20))

print(s.rjust(20, '*'))
print(s.rjust(10))
print(s.rjust(20))

print(s.zfill(20))
print(s.zfill(10))

print('-8910'.zfill(8))  # 将0 添加到负号后面

2.4 字符串分割操作的方法

splito

1. 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表

2. 以通过参数 sep 指定劈分字符串是的劈分符

3. 通过参数 maxsplit 指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分

rsplitO

1. 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表

2. 以通过参数 sep 指定劈分字符串是的劈分符

3. 通过参数 maxsplit 指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 10:17
s1 = 'hello world python'
lst = s1.split()
print(lst)

s2 = 'hello|world|python'
print(s2.split(sep='|'))
print(s2.split(sep='|', maxsplit=1))

print(s1.rsplit())
print(s2.rsplit('|'))
print(s2.rsplit(sep='|', maxsplit=1))

 2.5 字符串判断操作的方法

isidentifier()判断指定的字符串是不是合法的标识符
isspace()判断指定的字符串是否全部由空白字符组成(回车、换行,水平制表符)
isalpha()判断指定的字符串是否全部由字母组成
isdecimal()判断指定字符串是否全部由十进制的数字组成
isnumeric()判断指定的字符串是否全部由数字组成
isalnum()判断指定字符串是否全部由字母和数字组成
# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 10:49

s = 'hello,world'
print('1.', s.isidentifier())
print('2.', 'hello'.isidentifier())
print('3.', '张三'.isidentifier())
print('4.', '张三_123'.isidentifier())

print('5.', '\t'.isspace())

print('6.', 'abc'.isalpha())
print('7.', '张三'.isalpha())  # True
print('8.', '张三1'.isalpha())

print('9.', '123'.isdecimal())
print('10.', '123四'.isdecimal())
print('11.', 'ⅠⅡⅢⅣ'.isdecimal())

print('12.', '123'.isnumeric())
print('13.', '123四'.isnumeric())
print('14.', 'ⅠⅡⅢⅣ'.isnumeric())

print('15.', 'abc1'.isalnum())
print('16.', '张三123'.isalnum())
print('17.', 'abc!'.isalnum())

   2.6 字符串其他操作的方法

replace()第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换后得到字符串替换的字符串,替换前的字符串不发生变化,调用该方法时可以通过第3个参数指定最大替换次数字符串的合并。
join()将列表或元组中的字符串合并成一个字符串
# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 11:07
s = 'hello,Python'
print(s.replace('Python', 'Java'))

s1 = 'hello,Python,Python,Python'
print(s1.replace('Python', 'Java', 2))

lst = ['hello', 'Java', 'Python']
print('|'.join(lst))
print(''.join(lst))

t = ('hello', 'Java', 'Python')
print(''.join(t))

print('*'.join('Python'))  # P*y*t*h*o*n

3. 字符串的比较

       比较运算符: >、>=、<、<=、==、!=

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 11:21

print('apple' > 'app')
print('apple' > 'banana')
print(ord('a'), ord('b'))
print(ord('李'))

print(chr(97), chr(98))
print(chr(26446))

4. 字符串的切片

        跟列表的切片很相似

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 12:17
s = 'hello,Python'
s1 = s[:5]
print(s1)
s2 = s[6:]
print(s2)

s3 = '!'
str = s1 + s3 + s2
print(str)

print(id(s))
print(id(s1))
print(id(s2))
print(id(s3))
print(id(str))

print(s[1:5:1])  # 1 2 3 4
print(s[::2])  # 从 0 到 最后,步长为2
print(s[::-1])
print(s[-6::1])

5. 格式化字符串

%s字符串
%d整数
%f浮点数

 三种方式:%、{}、f-format()

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 12:30
name = '张三'
age = 20
print('我是%s,今年%d' %(name, age))
print('我是{0},今年{1}'.format(name, age))
print(f'我是{name},今年{age}')

%m.nf 是浮点型数据的输出格式控制说明,指定了输出浮点型数据时保留 n 位小数,且输出宽度为 m 。

print('%10d' % 99)  # 宽度限定符
print('%.3f' % 3.1415926)  # .3 小数位
print('%10.3f' % 3.1415926)

print('{0}'.format(3.1415926))
print('{0:.3}'.format(3.1415926))  # .3 表示一共三位数
print('{0:.3f}'.format(3.1415926))  # .3f 表示三位小数
print('{0:10.3f}'.format(3.1415926))

6. 字符串的编码转换

编码:将字符串类型转换成二进制类型

解码:将 byte 类型转换成字符串类型

# 作   者:要努力,努力,再努力
# 开发日期:2022/4/22 14:15
s = '天涯共此时'
print(s.encode(encoding='GBK'))  # b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1' b 代表二进制 一个中文占两个字节
print(s.encode(encoding='UTF'))   # b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6' b 代表二进制 一个中文占三个字节

byte = s.encode(encoding='GBK')
print(byte.decode(encoding='GBK'))
# print(byte.decode(encoding='UTF-8'))  # 编码格式不一报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte

byte = s.encode(encoding='UTF-8')
print(byte.decode(encoding='UTF-8'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不菜不菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值