Python 现代开发学习笔记

(七)字符串、索引与切片

1. 从一段文本中取出部分内容

字符串中的字符按位置排列,下标从 0 开始。取末尾字符时可以从右边倒着数:

# Python 没有独立的字符类型,取出一个字符仍得到字符串。
word = "Python"
print(word[0], word[-1])
# 切片包含起点,不包含停止位置。
print(word[1:4])
print(word[:2], word[2:])
# 第三个部分表示步长;-1 从末尾反向取值。
print(word[::2], word[::-1])

输出:

P n
yth
Py thon
Pto nohtyP
切片位置与取值顺序

word[1:4] 依次取下标 1、2、3。可以把字符之间的分隔处也编号:从分隔处 1 走到分隔处 4,中间刚好是 yth。word[::-1] 省略起止位置,并选择负步长,默认从末尾走到开头;显式写出 -1 的含义是最后一个字符的位置,和省略停止位置不是同一个动作。

切片选到的范围可以为空,例如 word[3:3] 得到空字符串。单个下标越过末尾则会报 IndexError。需要取第一个字符时,可以先用 if word: 判断是否有字符,再读取 word[0]。

2. 文本处理的常用操作

# strip 去掉两端空白;原字符串本身没有被修改。
raw = "  Python 入门  "
title = raw.strip()
print(title)
# replace 返回替换后的新字符串。
print(title.replace("入门", "练习"))
# split 不传分隔符时按空白切分,并合并相邻空白。
print("10   20\t30".split())
# 指定逗号后,空字段也会保留下来。
print("a,,b,".split(","))

最后两行分别得到 ['10', '20', '30'] 和 ['a', '', 'b', '']。方括号中的多个值组成列表,下一节会专门用它保存多条数据。这里先观察:切分结果中的每一项还是字符串。

"python" in title.lower() 可以先转小写再查找;startswith、endswith 分别检查开头与末尾;find 返回第一次匹配的位置,没有找到时返回 -1。.strip("ab") 中的 "ab" 是要从两端去掉的字符集合,若要去掉完整前缀,使用 .removeprefix("ab")。

# \n 是换行,原始字符串前缀 r 让这里的反斜线按文本保留。
print("第一行\n第二行")
print(r"C:\notes\reading.txt")
# encode 把 Unicode 文本转成字节,decode 把字节解回文本。
encoded = "书".encode("utf-8")
print(len("书"), len(encoded))
print(encoded.decode("utf-8"))

len 返回长度,len("书") 是 1,UTF-8 编码后的字节长度是 3。Python 字符串由 Unicode 码点组成,文字中的组合符号也会各自占据码点;字节则保存编码后的整数。爬虫和文件读取遇到乱码时,要回到“字节使用什么编码转成文本”这一步检查。

字符串不可变。word[0] = "p" 会报错;需要不同文本时,用 "p" + word[1:] 创建新字符串。+= 用在字符串上也是得到新字符串再重新绑定,与列表的原地扩展会有不同过程。

3. 转义、原始字符串与字符编号

普通字符串里的反斜线可以与后面的字符共同表示一个特殊字符。前面的 \n 表示换行,\t 表示制表符;需要保存反斜线本身时写 \\。

源代码里的写法 字符串实际包含的内容
\n 一个换行字符
\t 一个制表符,常用于对齐文字
\r 回车字符;读取不同来源的行尾时会遇到
\\ 一个反斜线
\"、\' 对应的引号字符
# print 按字符显示换行;repr 把这些字符显示成便于检查的表示。
message = "Python\t入门\n第二行"
print(message)
print(repr(message))
# r 前缀让这里的反斜线按文本保留,不把 \n、\r 解释成控制字符。
path = r"C:\notes\reading.txt"
print(path)
print("C:\\notes\\reading.txt" == path)
# ord 读取单个字符的 Unicode 码点,chr 从码点建立单字符字符串。
print(ord("A"), chr(65))

repr(message) 得到包含 \t、\n 表示的字符串,便于检查肉眼看不到的字符;两种路径写法比较为 True,最后一行输出 65 A。字符码点、UTF-8 字节和屏幕上显示的宽度是不同的量,第五章会把文本与编码连接起来。

引号也可以互相配合:'他说:"继续阅读"' 把双引号保存在单引号字符串中。原始字符串依然需要配对的结束引号;需要以一个反斜线结尾的路径文本时,可以像 "C:\\notes\\" 这样明确写出转义。字符串与转义

4. 连接多段文本

前面用 split 把一段文字切成多项字符串,join 则把这些项用指定分隔符连接起来:

# 先沿用上一节的 split 取得字符串项,再用分隔符连接。
titles = "Python NumPy Pygame".split()
print(" / ".join(titles))
# 空分隔符直接连接各项;join 的调用者是分隔符字符串。
print("".join(titles))

输出 Python / NumPy / Pygame 和 PythonNumPyPygame。分隔符只放在相邻两项之间,开头和末尾不会额外增加一次。后面的 CSV 报告、日志与页面显示可以继续沿用这个动作。

笔记正文与全部题解 · Ctrl / ⌘ K