文章目录
- 九、容器——字符串
- 1. 字符串概念
- - 字符串的概念:
- - 定义方式
- - 引号的嵌套:
- - 字符串的编码
- - 编码相关函数
- - 类型转换str()
- 2. 字符串的拼接、复制
- - 拼接
- - 复制
- 2. 字符串下标(索引):
- - 字符串下标:
- - 下标的访问
- 3. 字符串的遍历
- *练习-自定义实现int()函数
- 4. 字符串切片
- 索引的顺序和倒序
- *练习-自定义字符串逆序
- 5. 字符串常用方法
- a. 查找、替换、统计
- b. 分割、连接
- c. 判断类型
- d. 大小写转换
- e. 文本对齐
- f. 去除空白字符
- 6. 转义字符
- 7. 字符串驻留机制
- 8. 字符串比较和同一性
- 9. 可变字符串(了解)
九、容器——字符串
1. 字符串概念
- 字符串的概念:
- 以引号引起来的若干字符
字符串的本质是:字符序列
- Python 的字符串是不可变的,我们无法对原字符串做任 何修改。但,可以将字符串的一部分复制到新创建的字符串,达到“看起来修改”的效果。
- Python 不支持单字符类型,单字符也是作为一个字符串使用的。
- 定义方式
- 空字符串
- ‘’
- “”
- 双引号和单引号
- ‘hello’
- “hello”
- 连续三个单引号或三个双引号,可以帮助我们创建多行字符串
- ‘’‘hello’’’:可换行的字符串
- “”“hello”""
在 Python 中可以使用 一对双引号 "
或者 一对单引号 '
定义一个字符串
- 引号的嵌套:
虽然可以使用 \"
或者 \'
做字符串的转义,但是在实际开发中:
- 如果字符串内部需要使用
"
,可以使用'
定义字符串 - 如果字符串内部需要使用
'
,可以使用"
定义字符串
a = 'my_name is "TOM"'
- 字符串的编码
Python3 直接支持 Unicode,可以表示世界上任何书面语言的字符。
Python3 的字符 默认就是 16 位 Unicode 编码,ASCII 码是 Unicode 编码的子集。
- 编码相关函数
- 使用内置函数 ord()可以把字符转换成对应的 Unicode 码;
- 使用内置函数 chr()可以把十进制数字转换成对应的字符。
- 类型转换str()
str()可以帮助我们将其他数据类型转换为字符串。
2. 字符串的拼接、复制
- 拼接
- 可以使用+将多个字符串拼接起来。例如:’aa’+ ’bb’ ==>’aabb’。
- 如果+两边都是字符串,则拼接。
- 如果+两边都是数字,则加法运算。
- 如果+两边类型不同,则抛出异常。
- 可以将多个字面字符串直接放到一起实现拼接。
- 例如:’aa’’bb’==>’aabb
- 复制
使用*可以实现字符串复制。
a = 'Sxt'*3
a # 'SxtSxtSxt'
2. 字符串下标(索引):
- 字符串下标:
- 字符串中,每个字符的编号
- 字符串的下标范围是: 0 ~ 字符串字符个数-1
- 下标的访问
格式
字符串或字符串变量名[下标数字]
eg.
name = 'abcdef'
print(name[0]) # 输出a
print('hello'[0])
正向搜索:
- 最左侧第一个字符,偏移量是 0,第二个偏移量是 1,以此类推。直到 len(str)-1 为止。
反向搜索:
- 最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str) 为止。
3. 字符串的遍历
遍历: 依次访问字符串中的每一个字符
方式一:
for c in s:
print(c) # 无下标
方式二:
字符串的长度 = len(字符串)
for i in range(len(字符串)):
print(s[i]) # 有下标
方式三:
i = 0
while i < len(字符串):
print(s[i]) # 有下标
i += 1
*练习-自定义实现int()函数
def my_int(s):
# 定义一个用来返回转换后的变量
ret_num = 0
# 遍历字符串,拿到字符串中的每一个字符
for c in s:
# 利用并拿到了字符,通过ord函数,和字符ASCII码进行转换,得到差值
n = ord(c) - ord('0')
# 进行数据的累加
ret_num = ret_num * 10 + n # 从百位到各位遍历*10
return ret_num
m = my_int('123')
print(m) # 输出123
print(m*10) # 输出1230
4. 字符串切片
切片作用:通过制定下表,可以获取字符串中的某一段字符
支持类型:
- 切片* 方法适用于 字符串、列表、元组
- 切片 使用 索引值 来限定范围,从一个大的 字符串 中 切出 小的 字符串
- 列表 和 元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据
- 字典 是一个 无序 的集合,是使用 键值对 保存数据
格式
字符串或字符串变量[开始索引:结束索引:步长]
注:
- 左闭右开,不包含结束下标
- 从
起始
位开始,到结束
位的前一位 结束(不包含结束位本身)
- 从头开始,开始索引 数字可以省略,冒号不能省略
- 到末尾结束,结束索引 数字可以省略,冒号不能省略
- 步长默认为
1
,如果连续切片,数字和冒号都可以省略 - 步长可以为负数,即逆序取值
str[::-1] # 输出9876543210
str[-1::-1] # 和上边等价
索引的顺序和倒序
- 在 Python 中不仅支持 顺序索引,同时还支持 倒序索引
- 所谓倒序索引就是 从右向左 计算索引
- 最右边的索引值是 -1,依次递减
特殊使用
s[:]
:完整切片,等效于s[0:len(s)]s[5:]
:从下标位置切片至末尾s[:10]
:从起始位置切片至下标位置s[::2]
:步长为2,完整切片s[::-1]
:等价于str[-1::-1]
,步长为-1,倒序完整切片,即从右往左切片(重点)s[10:2:-1]
:从10切片至2,倒序切片s[2:10:-1]
:输出为''
,即空字符串
了解
起始、结束下标也可以用负数
表示从右往左编号,第一个字符为-1
s[-1:-5:-1]
:从右往左切片,从末尾位置切片至倒数第五个位置s[-5:-1:-1]
:输出为''
,即空字符串- 起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错
"abcdefg"[3:50]
# 输出'defg'
*练习-自定义字符串逆序
逆序的代码实现
# 方法一
s = 'hello'
def rev_str(s):
res = ''
i = len(s) - 1
while i >= 0:
res += s[i]
i -= 1
return res
print(rev_str(s))
# 方法二
s = 'hello'
def rev_str(s):
cl=list(s)
# print(cl)
cl.reverse()
return cl
print(rev_str(s))
5. 字符串常用方法
API 应用程序接口文档
Application Interface
https://docs.python.org/zh-cn/3/
a. 查找、替换、统计
方法 | 说明 |
find(str, start=0, end=len(string)) | 检测 str 是否包含在 string 中,如果 start 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值, 找不到子串时则返回 |
rfind(str, start=0, end=len(string)) | 类似于 find(),不过是从右边开始查找 |
index(str, start=0, end=len(string)) | 跟 find() 方法类似 找不到子串时,程序会报错 |
rindex(str, start=0, end=len(string)) | 类似于 index(),不过是从右边开始 |
replace(old_str, new_str, num=string.count(old)) | 把 string 中的 old_str 替换成 new_str,默认全部替换 如果 num 指定,则替换不超过 num 次 会返回一个新的字符串,而不会修改原有字符串 【常用】 |
count(str, start=0, end=len(string)) | 计数统计某个字符个数 【常用】 |
len(字符串) | 字符串长度 |
注:字符串是不可变对象,replace()方法中,实际上我们是创建了新的字符串对象,并指向了变量 a,而不是修改了以前的 字符串。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dCGtMmK-1609854024014)(Media/image-20201229211855737.png)]
b. 分割、连接
方法 | 说明 |
split(str="", num) | 以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串, 不传递参数str时,默认使用 ‘\r’, ‘\t’, ‘\n’ 和空格作为分隔符 返回一个字符串列表list 【常用】 |
splitlines() | 仅识别换行符(按照行(’\r’, ‘\n’, ‘\r\n’)分隔) 返回一个包含各行作为元素的列表 |
partition(str) | 把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面) 作用:保留分割内容并分割 输出:一个元租 |
rpartition(str) | 类似于 partition() 方法,不过是从右边开始查找 |
s.join(可迭代对象) | 以 s作为分隔符,将 可迭代对象 中所有的元素(的字符串表示)合并为一个新的字符串 eg.‘hello’.join(’-’) # 输出 ‘h-e-l-l-o’ 【常用】 |
拼接字符串要点:
- 使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。
- 推荐 使用 join 函数,因为 join 函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝, 仅新建一次对象。
eg.
'-'.join('hello') # 输出 'h-e-l-l-o'
l = ['Hello', 'World', 'Hello', 'Python']
print('_'.join(l)) # 输出:Hello_World_Hello_Python
print('$'.join('A')) # 输出:A
测试+拼接符和 join(),不同的效率
import time
time01 = time.time() #起始时刻
a = ""
for i in range(1000000):
a += "sxt"
time02 = time.time() #终止时刻
print("运算时间:"+str(time02-time01))
time03 = time.time() #起始时刻
li = []
for i in range(1000000):
li.append("sxt")
a = "".join(li)
time04 = time.time() #终止时刻
print("运算时间:"+str(time04-time03))
c. 判断类型
方法 | 说明 |
startswith(str) | 检查字符串是否是以 str 开头,是则返回 True【常用】 |
endswith(str) | 检查字符串是否是以 str 结束,是则返回 True【常用】 |
isupper() | 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True |
islower() | 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True |
isdigit() | 如果 string 只包含数字则返回 True, |
isalpha() | 如果 string 至少有一个字符并且所有字符都是字母则返回 True |
isalnum() | 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True |
isspace() | 如果 string 中只包含空白字符(包括:空格 \n \r \t),则返回 True【常用】 |
isdecimal() | 如果 string 只包含数字则返回 True, |
isnumeric() | 如果 string 只包含数字则返回 True, |
istitle() | 如果 string 是标题化的(每个单词的首字母大写)则返回 True |
全角数字:不包含小数
d. 大小写转换
方法 | 说明 |
upper() | 转换 string 中的小写字母为大写【常用】 |
lower() | 转换 string 中所有大写字符为小写【常用】 |
title() | 把字符串的每个单词首字母大写 |
capitalize() | 把字符串的第一个字符大写 |
swapcase() | 翻转 string 中的大小写 |
e. 文本对齐
方法 | 说明 |
ljust(width) | 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 |
rjust(width) | 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 |
center(width) | 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 |
默认使用英文空格,对中文效果不好,可做如下优化
#使用center方法居中显示文本 print(poem_str.center(10, " "))# 参数中多一个用引号引起来的中文空格(全角)
f. 去除空白字符
方法 | 说明 |
strip() | 截掉 string 左右两边的空白字符【常用】 |
lstrip() | 截掉 string 左边(开始)的空白字符 |
rstrip() | 截掉 string 右边(末尾)的空白字符 |
# 常用去单词间空白方法【常用】
' '.join(s.split())
6. 转义字符
字符串中的转义字符
-
\t
在控制台输出一个 制表符,协助在输出文本时 垂直方向 保持对齐 -
\n
在控制台输出一个 换行符
制表符 的功能是在不使用表格的情况下在 垂直方向 按列对齐文本
转义字符 | 描述 |
| 续行符 |
| 反斜杠符号 |
| 单引号 |
| 双引号 |
| 换行 |
| 横向制表符 |
| 回车 |
| 退格(Backspace) |
7. 字符串驻留机制
- 字符串驻留机制:**仅保存一份 **相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
- Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母 和数字)会启用字符串驻留机制驻留机制。
- 注意:只有字面量或者字面量的拼接会被缓存在驻留池,其他方式产生的字符串不在驻留池
a = "abd_33" # 仅包含下划线(_)、字母 和数字,在驻留池
b = "abd_33"
a is b # True 指向同一对象
c = "dd#" # 因为有'#',不符合标识符规则的字符串,不在驻留池
d = "dd#"
c is d # False 指向不同对象
str1 = "aa"
str2 = "bb"
str1+str2 is "aabb" # False 只有字面量或者字面量才存在驻留池里,这里是新生成的字符串,所以不在驻留池
str1+str2 == "aabb" # True
s1 = str1 + str2
b = s1 is "aabb" # False
s2 = 'aa' + 'bb'
c = s2 is 'aabb' # True 字面量的拼接缓存在驻留池里
8. 字符串比较和同一性
- ==,!=
- 对字符串进行比较,是否含有相同的字符。
- is / not is
- 判断两个对象是否同一个对象。比较的是对象的地址,即 id(obj1)是 否和 id(obj2)相等。
- 成员操作符,in /not in 关键字:
- 判断某个字符(子字符串)是否存在于字符串中。
9. 可变字符串(了解)
在 Python 中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,智 能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO 对象或 array 模块。
import io
s = "hello, sxt"
sio = io.StringIO(s)
sio # <_io.StringIO object at 0x02F462B0>
sio.getvalue() # 'hello, sxt'
sio.seek(7) # 7
sio.write("g") # 1
sio.getvalue() #'hello, gxt'