字符串
字符串是Python中基本数据类型,是一个不可变的字符序列【元组也是不可变序列】。
字符串驻留机制
字符串驻留机制–仅保留一个相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间。
驻留机制的几种情况(交互模式)
- 字符串的长度为0或者1时
- 符合标识符的字符串【字母、数字、下标线】
- 字符串只在编译时进行驻留,而非运行时
# 1. 字符串的长度为0或者1时
str1 = ''
str2 = ""
print(id(str1)) # 2443258133728
print(id(str2)) # 2443258133728
str3 = '1'
str4 = '1'
print(id(str3)) # 2029518993704
print(id(str4)) # 2029518993704
# 2. 符合标识符的字符串【字母、数字、下标线】
str5 = '123456789abcv_'
str6 = '123456789abcv_'
print(id(str5)) # 2292665335344
print(id(str6)) # 2292665335344
str7 = '#@###1234556'
str8 = '#@###1234556'
print(id(str7)) # 2067284476784
print(id(str8)) # 2067284476784
# 3. 字符串只在编译时进行驻留,而非运行时
#下面定义为编译时
str9 = 'abc'
str10 = 'abc'
str11 = 'a'+'bc'
print(id(str9)) # 2532776736504
print(id(str10)) # 2532776736504
print(id(str11)) # 2532776736504
#下面这种为运行时才计算
str12 = 'abc'
str13 = ''.join(['ab','c'])
print(str12) # abc
print(id(str12)) # 1752729188088
print(str13) # abc
print(id(str13)) # 1752729188088
**注意:**第二个,在python交互模式下变量的内存地址是不一样的,在编译器环境中【Pycharm】中是相同的。切记

字符串创建
''创建字符串
str1 = '123456'
print(str1) # 123456
str1 = "123456"
print(str1) # 123456
str1 = """123456
2222222222222222222
"""
print(str1)
# 123456
# 2222222222222222222
str1 = '''123456
2222222222222222222
33333333
'''
print(str1)
# 123456
# 2222222222222222222
# 33333333
str创建字符串
str1 = str(123456)
print(str1) # 123456
print(type(str1)) # <class 'str'>
创建空字符串
str1 = str()
print(str1)
print(type(str1)) # <class 'str'>
str2 = ''
print(str2)
print(type(str2)) #<class 'str'>
字符串查询
index()
index()–查找子串第一次出现的位置,不存在时会报错
str1 = 'hellohid'
print(str1.index('h')) # 0
print(str1.index('q')) # ValueError: substring not found
rindex()
rindex()–查找子串最后一次出现的位置,不存在时会报错
str1 = 'hellohid'
print(str1.rindex('h')) # 5
print(str1.rindex('q')) # ValueError: substring not found
find()
find()–查找子串第一次出现的位置,不存在时返回-1
str1 = 'hellohid'
print(str1.find('h')) # 0
print(str1.find('q')) # -1
rfind()
rfind()–查找子串最后一次出现的位置,不存在时返回-1
str1 = 'hellohid'
print(str1.rfind('h')) # 5
print(str1.rfind('q')) # -1
字符串大小写转换
upper()
upper()—把字符串转换成大写字母
str1 = 'hello world'
print(str1.upper()) # HELLO WORLD
lower()
lower()–把字符串中的字母转换成小写字母
str1 = 'HELLO WORLD'
print(str1.lower()) # hello world
swapcase()
swapcase()–把字符串中的大写转换成小写,小写转换成大写。
str1 = 'HELLO world'
print(str1.swapcase()) # hello WORLD
capitalize()
capitalize()–把字符串中第一个字符转换成大写,其他转换成小写。
str1 = 'HELLO WORLD'
print(str1.capitalize()) # Hello world
title()
title()–把字符串中单词的第一个字符转换成大写,其他转换成小写。
str1 = 'HELLO WORLD'
print(str1.title()) #Hello World
字符串内容对齐操作
center()居中对齐
str1 = 'HELLO WORLD'
print(str1.center(20),1) # HELLO WORLD 1
print(str1.center(20,'*'))# ****HELLO WORLD*****
ljust()左对齐
str1 = 'HELLO WORLD'
print(str1.ljust(20),1) #HELLO WORLD 1
print(str1.ljust(20,"-"))#HELLO WORLD---------
rjust()右对齐
str1 = 'HELLO WORLD'
print(str1.rjust(20)) # HELLO WORLD
print(str1.rjust(20,'+'))#+++++++++HELLO WORLD
zfill()
zfill()–右对齐,左边用0填充,该方法只接收一个参数,用语言指定字符串的宽度,字符串是负数,0填充在-1数之后。
str1 = 'HELLO WORLD'
print(str1.zfill(20)) # 000000000HELLO WORLD
str1 = '1234'
print(str1.zfill(10)) # 0000001234
str1 = '-123'
print(str1.zfill(10)) # -000000123
字符串劈分操作
split()
split()
–从左边开始劈分,默认的劈分字符是空格,返回值是一个列表。
–通过参数sep指定劈分字符串;
–通过参数maxsplit指定劈分字符时的最大劈分次数。
str1 = "hello world wo shi python"
str_pi = str1.split()
print(str_pi) # ['hello', 'world', 'wo', 'shi', 'python']
print(type(str_pi)) # <class 'list'>
str1 = "hello world wo shi python"
str_w = str1.split('w')
print(str_w) # ['hello ', 'orld ', 'o shi python']
str1 = "hello world wo shi python"
str_pi = str1.split(maxsplit=2)
print(str_pi) # ['hello', 'world', 'wo shi python']
rsplit()
rspilt()–从右边开始劈分,其他和split()一样。
str1 = "hello world wo shi python"
print(str1.rsplit()) # ['hello', 'world', 'wo', 'shi', 'python']
print(str1.rsplit(maxsplit=2)) #['hello world wo', 'shi', 'python']
判断字符串
isidentifier()判断标识符
isidentifier()–判断是合法标识字符串,满足变量命令规格的字符串返回True,否则返回Flase。
str1 = "str10_"
print(str1.isidentifier()) # True
str1 = "01234str"
print(str1.isidentifier()) # False
str1 = "str232#$"
print(str1.isidentifier()) # False
isspace()判断空白字符组成
isspace()–判断指定的字符串是否全部由空白字符组成(回车、换行、制表符)
str1 = ' s \t'
print(str1.isspace()) # False
str1 = '\n \t'
print(str1.isspace()) # True
isalpha()判断由字母组成
isalpha()–判断指定的字符串是否全部由字母组成,中文也是。
str1 = 'abcdefgABCDEF'
print(str1.isalpha()) # True
str1 = 'abcd3rfgghh'
print(str1.isalpha()) # False
str1 = '中文'
print(str1.isalpha()) # True
isdecimal()判断十进制
isdecimal()–判断指定的字符串是否全部由十进制数字组成,只包含0-9。
str1 = '1234567890123'
print(str1.isdecimal()) # True
str1 = '0x1d'
print(str1.isdecimal()) # False
isnumeric()判断由数字(罗马数字)组成
isnumeric()–判断指定的字符串是否全部由数字组成,包含四、罗马数字。
str1 = '1234⑩④四'
print(str1.isnumeric()) # True
str1 = 'sghdg88888'
print(str1.isnumeric()) # False
isalnum()判断由数字和字母组成
isalnum()–判断指定的字符串是否由数字和字母组成。
str1 = '7777sssaaa'
print(str1.isalnum()) # True
str1 = 'shhsbsb&&&**'
print(str1.isalnum()) # False
字符串替换拼接
replace()字符串替换
replace()–字符串替换,第一个参数被替换的字串,第二个参数指定替换字串的字符串,第三个参数指定最大替换次数。
str1 = 'rehhrejrekrelrep'
print(str1.replace('re','uu')) # uuhhuujuukuuluup
str1 = 'rehhrejrekrelrep'
print(str1.replace('re','QQ',3)) # QQhhQQjQQkrelrep
join()字符串合并
join()–将列表或者元组的字符串合并成一个字符串。
str1 = ['1','2','3','4','5','6','7']
str3 = '*'.join(str1)
print(str3) # 1*2*3*4*5*6*7
str2 = ['a','b','c','d']
str4 = '-'.join(str1)
print(str4) # 1-2-3-4-5-6-7
字符串比较
字符串比较运算符:>、>=、<、<=、==、!=
比较规则:首先比较两个字符串的第一个字符,如果相等则比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,就返回比较结果。
比较原理:比较其的原始值(chr()、ord())
print(chr(97)) # a
print(ord('a')) # 97
print(ord('b')) # 98
str1 = 'hello a'
str2 = 'hello b'
print(str1 > str2) # False
print(str1 < str2) # True
注意:==比较的是值;is比较的是内存地址;
字符串切片操作
字符串是不可变类型,不具备增删改操作,切片操作将产生新的对象;
str1 = 'hello world,wo is xiaoming'
print(str1[12:]) # wo is xiaoming
print(str1[:11]) # hello world
print(str1[1:10:2]) # el ol
print(str1[1:-1:2]) # el ol,oi ioi
print(str1[-1:-5:-1]) # gnim
print(str1[:]) # hello world,wo is xiaoming
print(str1[::2]) # hlowrdw sxamn
print(str1[::-1]) # gnimoaix si ow,dlrow olleh
格式化字符串
%占位符
name = '小明'
age = 24
print('我的名字叫:%s,今年%d岁了' % (name,age)) # 我的名字叫:小明,今年24岁了
{}占位符
name = '小明'
age = 24
print('我的名字叫:{0},今年{1}岁了,我真的叫{0}'.format(name,age))
# 我的名字叫:小明,今年24岁了,我真的叫小明
f:string
name = '小明'
age = 24
print(f'我的名字叫:{name},今年{age}岁了') # 我的名字叫:小明,今年24岁了
注意:%d–整数、%10d–10宽度、%f–小数、%.3f–小数后3位、{0:.3f}–小数后3位。
字符串的编码转换
为什么需要字符串的编码转换?
A计算机【str在内存中以Unicode表示】----编码—>byte字节传输----解码—>B计算机显示
编码与解码方式:编码【字符串–>二进制】、解码【二进制-字符串】
s = '天涯共此时'
print(s.encode(encoding='GBK')) #GBK 中文占2个字节
# b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'
print(s.encode(encoding='UTF-8')) # UTF-8 中文占3个字节
# b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'
byte_z = s.encode(encoding='gbk')
print(byte_z.decode(encoding='gbk')) # 天涯共此时
注意:编码和解码不一样会报错。
本文详细介绍了Python中的字符串基础知识,包括字符串的驻留机制,创建字符串的不同方法,以及字符串的各种操作如查询、大小写转换、对齐、劈分、判断、替换和拼接。此外,还讨论了字符串的比较、切片操作和格式化,以及字符串的编码与解码转换,强调了不同编码格式对存储和传输的影响。

被折叠的 条评论
为什么被折叠?



