目录
1.字符串索引
使用方括号
[]
来提取字符串中的单个字符或子串。这种方法也称为索引(Indexing)。Python中的字符串是一个字符序列,每个字符都有一个唯一的索引位置,从0开始递增。通过指定索引位置,我们可以提取对应位置的字符。char = string[index]
string
是要提取字符的字符串。index
是字符在字符串中的位置索引,从0开始计数。- 正向搜索:最左侧第一个字符,偏移量是0,第二个偏移量是1,以此类推。直到len(str)-1为止。
- 反向搜索:最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止。
1.1 提取单个字符
提取了字符串 "Hello" 中索引为1的字符,即字符 'e'。
text = "Hello" char = text[1] print(char) # 输出: 'e'
1.2 提取子串
提取了字符串 "Python" 中索引从2到5(不包括5)的子串,即子串 'tho'。
text = "Python" substring = text[2:5] print(substring) # 输出: 'tho'
1.3 倒序提取字符
使用负数索引
-1
来提取字符串 "Python" 中倒数第一个字符,即字符 'n'。text = "Python" char = text[-1] print(char) # 输出: 'n'
1.4 步长提取字符
使用步长为2来提取字符串 "Python" 中的字符,结果为 'Pto'。
text = "Python" chars = text[::2] print(chars) # 输出: 'Pto'
2. 字符串的切片
字符串切片(slice)操作是一种用于提取子串的灵活方法。通过指定起始索引、结束索引和步长,我们可以从原始字符串中获取所需的子串。
[起始偏移量start:终止偏移量end:步长 step]substring = string[start:end:step]
start、end、step 为正数的情况:
操作和说明
示例
结果
[:] 提取整个字符串
“abcdef”[:]
“abcdef”
[start:] 从start索引开始到结尾
“abcdef”[2:]
“cdef”
[:end] 从头开始知道end-1
“abcdef”[:2]
“ab”
[start:end] 从start到end-1
“abcdef”[2:4]
“cd”
[start:end:step] 从start提取到end-1,步长是step
“abcdef”[1:5:2]
“bd”
start、end、step 为负数的情况:
注意: 切片操作时,起始偏移量和终止偏移量不在 [0, 字符串长度 -1] 这个范围,也不会报错。起始偏移量小于 0 则会当做 0 ,终止偏移量大于 “ 长度 -1” 会被当成-1
示例
说明
结果
"abcdefghijklmnopqrstuvwxyz" [-3:]
倒数三个
“xyz”
"abcdefghijklmnopqrstuvwxyz" [-8:-3]
倒数第八个到倒数第三个(包头不包尾)
'stuvw'
"abcdefghijklmnopqrstuvwxyz" [::-1]
步长为负,从右到左反向提取
'zyxwvutsrqponmlkjihgfedcba'
a = "python" print(a[2:100]) # 运行结果:thon
3. 字符串的分割
split
方法来将字符串分割成子串,并返回一个包含分割结果的列表。- split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)
result = string.split(sep, maxsplit)
string
是要进行分割操作的原始字符串。sep
是可选参数,表示分隔符(默认为所有的空白字符,如空格、制表符、换行符等)。maxsplit
是可选参数,表示最大分割次数。text = "Hello, World!" words = text.split() print(words) # 输出: ['Hello,', 'World!'] text = "apple,banana,orange" fruits = text.split(',') print(fruits) # 输出: ['apple', 'banana', 'orange'] text = "one,two,three,four,five" parts = text.split(',', 2) print(parts) # 输出: ['one', 'two', 'three,four,five']
4. 字符串连接join()
string.join(iterable)
- 是用来连接序列中各个元素的字符串。
iterable
是一个可迭代对象,例如列表、元组或者字符串等。
join()
方法会将iterable
中的每个元素转换为字符串,然后使用string
将它们连接起来,并返回最终的字符串结果。my_list = ['Hello', 'world', '!'] result = ' '.join(my_list) print(result) # 结果文件:Hello world !
拼接字符串要点:
使用字符串拼接符 + ,会生成新的字符串对象,因此不推荐使 用 + 来拼接字符串。推荐使用 join 函数,因为 join 函数在拼接字 符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一 次对象。
5. 字符串驻留机制
字符串驻留机制是指对于较短的字符串,解释器会尝试将其存储在内存中的相同位置,以节省内存空间。这意味着当使用相同的字符串值创建多个对象时,解释器会尽量让这些对象共享相同的内存空间,从而减少内存占用。这个优化策略适用于一定范围内的字符串,通常是长度不超过20个字符的字符串。
# 创建两个相同值的字符串 str1 = 'hello' str2 = 'hello' # 检查两个字符串对象是否相同 print(str1 is str2) # True # 使用字符串的切片操作创建一个新的字符串,即使值相同,也会创建新的对象 str3 = str1[:] # 检查新的字符串对象与之前的字符串对象是否相同 print(str1 is str3) # False
6. 字符串比较和同一性
- 直接使用 == 或 != 对字符串进行比较,判断字符串是否相同
- 使用is 或 not is 判断两个对象是否同一个对象,比较的是对象的地址, 即id(obj1)是否id(obj2)相等
6.1 == 操作符
==
用于比较两个对象的值是否相等。- 当使用
==
比较两个对象时,Python会比较它们的值,如果它们的值相等,则返回True
,否则返回False
。- 对于不同类型的对象,
==
操作符会根据对象的类型来确定是否相等,例如对于数字、字符串、列表等基本类型,会比较它们的值是否相等;对于自定义对象,则需要实现__eq__()
方法来定义相等性。x = 5 y = 5 print(x == y) # 输出 True,因为 x 和 y 的值都是 5 list1 = [1, 2, 3] list2 = [1, 2, 3] print(list1 == list2) # 输出 True,因为 list1 和 list2 的值相同
6.2 is 操作符
is
用于比较两个对象是否是同一个对象(即它们是否引用同一个内存地址)。- 当使用
is
比较两个对象时,Python会检查它们是否指向内存中的同一位置,如果是,则返回True
,否则返回False
。is
操作符比较的是对象的身份标识,即它们在内存中的地址是否相同,而不是它们的值是否相等。a = [1, 2, 3] b = [1, 2, 3] c = a print(a is b) # 输出 False,因为 a 和 b 是不同的对象 print(a is c) # 输出 True,因为 a 和 c 引用了同一个对象