学习python的第七天之数据类型——str字符串
Python 中的字符串(String)是最常用的数据类型之一,用于存储和表示文本信息。Python 中的字符串是不可变的,这意味着一旦创建了一个字符串,就不能修改它(但可以创建一个新的字符串作为旧字符串的修改版)。字符串在 Python 中是非常灵活的,可以使用单引号(‘)或双引号(")来定义,甚至可以使用三引号(’‘’ 或 “”")来定义多行字符串。
字符串的创建
# 使用单引号
str1 = 'Hello World!'
# 使用双引号
str2 = "Python is fun!"
# 使用三引号定义多行字符串
str3 = """This is a
multi-line string."""
字符串的连接
可以使用加号(+)来连接两个或多个字符串
str1 = 'Hello'
str2 = 'World'
greeting = str1 + ' ' + str2
print(greeting) #--> 'Hello World'
字符串的格式化
Python 提供了多种方式来格式化字符串,其中一些常用方法包括
# 方式一
# 使用 % 操作符(旧式):
name = 'Alice'
age = 30
info = 'My name is %s and I am %d years old.' % (name, age)
print(info) #--> My name is Alice and I am 30 years old.
# 方式二
# 使用 str.format() 方法:
name = 'Bob'
age = 25
info_1 = 'My name is {} and I am {} years old.'.format(name, age)
print(info_1) #--> My name is Bob and I am 25 years old.
info_2 = 'My name is {NAME} and I am {AGE} years old.'.format(AGE=age, NAME=name) # 打乱顺序后的匹配方式
print(info_2) #--> My name is Bob and I am 25 years old.
info_3 = 'My name is {1} and I am {0} years old.'.format(age, name) # 打乱顺序后的匹配方式
print(info_3) #--> My name is Bob and I am 25 years old.
info_4 = 'My name is {} and I am {:.2f} years old.'.format(name, age) # 控制小数点位数
print(info_4) #--> My name is Bob and I am 25.00 years old.
# 方式三
# 使用 f-strings(Python 3.6+):
name = 'Charlie'
age = 35
info = f'My name is {name} and I am {age} years old.'
print(info) #--> My name is Charlie and I am 35 years old.
字符串的索引和切片
字符串中的每个字符都有一个索引,从 0 开始。可以使用索引来访问字符串中的特定字符,或者使用切片来获取子字符串。
str = 'Hello World!'
print(str) #--> 输出 'Hello World!'
print(str[6:]) #--> World!
print(str[:5]) #--> Hello
print(str[1:8]) #--> ello Wo
print(str[-1]) #--> !(负索引表示从字符串末尾开始计数)
字符串的索引可以通过设置步长(step)和方向来从字符串中提取特定的字符序列。字符串索引的基本形式是
string[start:stop:step]
,其中:
start
是起始索引(包含),stop
是结束索引(不包含),step
是步长,用于指定选取字符的间隔。步长(Step)
- 当
step
为正数时,索引方向从左到右。- 当
step
为负数时,索引方向从右到左。
# 从左到右,步长为正数:
text = "Python Programming"
# 提取从索引 0 到索引 15 的字符,每隔 2 个字符取一个
result = text[0:16:2]
print(result) #--> Pto rgam
# 从右到左,步长为负数:
text = "Python Programming"
# 从字符串末尾开始,每隔 2 个字符取一个,直到索引 0(不包含)
# 注意:此时 start 比 stop 大,因为是从右向左
result = text[-1:-16:-2]
print(result) #--> gimroPnh (注意这里是逆序的)
# 如果想要得到正序的结果,可以再将结果反转
print(result[::-1]) #--> hnPormig
特殊用法:
- 省略
start
,表示从字符串开始位置。- 省略
stop
,表示到字符串结束位置。- 步长不能省略,默认为 1。
text = "Python Programming"
# 从头到尾,每隔 3 个字符取一个
result = text[::3]
print(result) #--> Ph oai
# 从尾到头,每隔 3 个字符取一个
result = text[::-3]
print(result) #--> gmrrnt (逆序)
# 从头部第3个字符开始向后,每隔 3 个字符取一个
result = text[2::3]
print(result) #--> tnrrmg
# 从尾部第2个字符开始向前,每隔 3 个字符取一个
result = text[-2::-3]
print(result) #--> nmgPoy
报错:
- 索引值必须在字符串的有效范围内,否则会引发
IndexError
。- 步长不能为零,否则无法前进,会引发
ValueError
。
字符串的转义
字符串的转义通常指的是将字符串中的特殊字符或特定格式的文本转换为另一种格式,或者解释为程序能够理解和执行的代码。
在Python中,字符串的转义是指通过在字符串中的特定字符前添加反斜杠(
\
)来改变这些字符的通常含义,或者为了表示那些在正常情况下无法在字符串中直接包含的字符(如换行符、制表符等)。
\n
:换行符,表示文本中的一行结束,开始新的一行。\t
:制表符,通常用于文本中对齐列或创建缩进。\\
:表示反斜杠字符本身,因为反斜杠是转义字符,所以要用两个反斜杠来表示一个。\"
:表示双引号字符,允许在字符串中包含双引号。\'
:表示单引号字符,允许在字符串中包含单引号(在单引号字符串中需要转义,但在双引号字符串中不需要)。\r
:回车符,通常与换行符一起使用来表示Windows风格的行结束符(\r\n
)。\b
:退格符,将光标移动到前一个字符的位置。\f
:换页符,用于在文本中插入一个分页符。\v
:垂直制表符,类似于制表符,但用于垂直对齐。\ooo
:八进制数,其中ooo
是一到三位八进制数字,表示相应的ASCII字符。\xhh
:十六进制数,其中hh
是一位或两位十六进制数字,表示相应的ASCII字符。\uhhhh
:Unicode字符,其中hhhh
是四位十六进制数字,表示一个Unicode字符。\Uhhhhhhhh
:Unicode字符,其中hhhhhhhh
是八位十六进制数字,表示一个更广泛的Unicode字符(Python 3.3及更高版本)。- 原始字符串:在字符串前加上
r
前缀,可以创建原始字符串,这样字符串中的反斜杠就不会被当作转义字符。这对于表示文件路径、正则表达式等很有用。
# 使用转义字符创建字符串
string_with_escapes = "Hello\\\nworld!\t\"This is a test\x20!\""
print(string_with_escapes)
输出:
Hello
world! “This is a test !”
(其中test后的空格是由\x20表示的,十六进制20,对应的是十进制32,查找ASCII码表,对应的是空格)
# 使用原始字符串来避免转义
raw_string = r"Hello\\\nworld!\t\"This is a test\x20!\""
print(raw_string)
输出:
Hello\\nworld!\t"This is a test\x20!"
字符串大小写转换函数
str.upper()
:将字符串转换为大写。str.lower()
:将字符串转换为小写。str.title()
:每个单词的首字母大写。str.capitalize()
:字符串的第一个单词的首字母大写。
s1 = 'Hello Python!'
s2 = 'hello world!'
print(s1.upper()) #--> HELLO PYTHON!
print(s1.lower()) #--> hello python!
print(s2.title()) #--> Hello World!
print(s2.capitalize()) #--> Hello world!
字符串去空格函数
str.strip()
:去除字符串左右两端的空白字符。str.lstrip()
:去除字符串左边的空白字符。str.rstrip()
:去除字符串右边的空白字符。
s = ' Hi world! '
print(s.strip()) #--> Hi world!
print(s.lstrip()) #--> Hi world!
print(s.rstrip()) #--> Hi world!
字符串替换和拆分函数
str.replace(old, new, count)
:将字符串中的旧子字符串替换为新子字符串,默认有多少替换多少,count
用于设定需要替换的个数。str.split(separator, maxsplit)
:根据分隔符将字符串拆分为列表,默认切割所有,maxsplit
用于设定最大切割次数。
s = r'C:\Users\Administrator\Downloads'
print(s.replace('\\', '/')) #--> C:/Users/Administrator/Downloads
print(s.replace('\\', '/', 2)) #--> C:/Users/Administrator\Downloads
print(s.split('\\')) #--> ['C:', 'Users', 'Administrator', 'Downloads']
print(s.split('\\', 2)) #--> ['C:', 'Users', 'Administrator\\Downloads']
字符串查找位置和长度函数
str.find(sub[, start[, end]])
:查找子字符串在字符串中第一次出现的位置。str.rfind(sub[, start[, end]])
:查找子字符串在字符串中最后一次出现的位置。str.index(sub[, start[, end]])
:查找子字符串在字符串中第一次出现的位置。str.rindex(sub[, start[, end]])
:查找子字符串在字符串中最后一次出现的位置。lenn(str)
:返回字符串的长度,整数型
s = r'C:\Users\Administrator\Downloads'
print(s.find('Users')) #--> 3
print(s.find('s')) #--> 4
print(s.rfind('s')) #--> 31
print(s.index('s')) #--> 4
print(s.rindex('s')) #--> 31
print(len(s)) # 32
find()
和rfind()
适用于不需要异常处理的查找场景,当未找到子字符串时返回-1。index()
和rindex()
适用于需要确保子字符串存在的查找场景,当未找到子字符串时抛出异常。find()
和index()
从左到右查找,rfind()
和rindex()
从右到左查找。
s = ' Hello World! '
print(s.find('找不到')) #--> -1
print(s.rfind('找不到')) #--> -1
print(s.index('找不到')) #--> 报错 ValueError: substring not found
print(s.rindex('找不到')) #--> 报错 ValueError: substring not found
字符串判断相关的函数
str.isupper()
:是否是全大写str.islower()
:是否是全小写str.isalpha()
:是否是纯字母组成str.isdigit()
:是否是纯数字组成str.isalnum()
:是否是字母或数字组成str.startswith(prefix, start, end)
:在字符串的start
到end
区间,默认全字符串,判断开始字符是否是prefix
str.endswith(prefix, start, end)
:在字符串的start
到end
区间,默认全字符串,判断开始字符是否是end
s1 = 'HELLO'
s2 = 'Hello'
s3 = 'hello'
s4 = 'Hello 123'
s5 = 'hello123'
s6 = '123'
print(s1.isupper(), s1.islower(), s1.isalpha(), s1.isdigit(), s1.isalnum(), s1.startswith('H'), s1.endswith('o'))
# True False True False True True False
print(s2.isupper(), s2.islower(), s2.isalpha(), s2.isdigit(), s2.isalnum(), s2.startswith('H'), s2.endswith('o'))
# False False True False True True True
print(s3.isupper(), s3.islower(), s3.isalpha(), s3.isdigit(), s3.isalnum(), s3.startswith('H'), s3.endswith('o'))
# False True True False True False True
print(s4.isupper(), s4.islower(), s4.isalpha(), s4.isdigit(), s4.isalnum(), s4.startswith('H'), s4.endswith('o'))
# False False False False False True False
print(s5.isupper(), s5.islower(), s5.isalpha(), s5.isdigit(), s5.isalnum(), s5.startswith('H'), s5.endswith('o'))
# False True False False True False False
print(s6.isupper(), s6.islower(), s6.isalpha(), s6.isdigit(), s6.isalnum(), s6.startswith('H'), s6.endswith('o'))
# False False False True True False False
字符串对齐相关函数
str.center(width, fillchar)
:在width
数量宽度的字符串中,将str
居中对齐显示,两侧空白区域用fillchar
填充,其中fillchar
必须是单个字符,默认空格str.ljust(width, fillchar)
:在width
数量宽度的字符串中,将str
左对齐显示,两侧空白区域用fillchar
填充,其中fillchar
必须是单个字符,默认空格str.rjust(width, fillchar)
:在width
数量宽度的字符串中,将str
右对齐显示,两侧空白区域用fillchar
填充,其中fillchar
必须是单个字符,默认空格
s = '我爱中国!'
print(s.center(25)) # 我爱中国!
print(s.center(25, '+')) # ++++++++++我爱中国!++++++++++
print(s.center(24, '+')) # +++++++++我爱中国!++++++++++
print(s.ljust(25, '-')) # 我爱中国!--------------------
print(s.rjust(25, '*')) # ********************我爱中国!
字符串支持的符号
+
:str
+str
字符串拼接,返回字符串
*
:str
*num
字符串重复num
遍拼接,返回字符串
==
:判断两个字符串内容是相等的,返回布尔值
!=
:判断两个字符串内容是不相等的,返回布尔值
%
:字符串的格式化,字符串的占位
in
:判断内容在字符串中,返回布尔值
not in
:判断内容不在字符串中,返回布尔值
is
:判断两个字符串地址是相等的,返回布尔值
is not
:判断两个字符串地址不是相等的,返回布尔值
[]
:字符串的下标或者切片,返回字符串