第 5 章 字符串
学习目标
- 掌握字符串的索引与切片
- 掌握常用字符串方法:大小写、去除空白、替换、拆分、拼接、查找
- 掌握 f-string 格式化输出
- 理解字符串是不可变类型
5.1 字符串基础
字符串(str)是一串字符,用引号包裹。单引号、双引号都可以,内容一致时效果相同:
print("你好")
print('你好')输出:
你好
你好字符串可以索引:用方括号加下标取出某个位置的字符,下标从 0 开始;负数下标从末尾倒数,-1 是最后一个字符:
s = "hello"
print(s[0])
print(s[-1])
print(len(s))输出:
h
o
5len() 返回字符串的长度(字符个数)。
多行文本可以用三引号(""" 或 '''):
poem = """第一行
第二行"""
print(poem)输出:
第一行
第二行5.2 切片
切片用 s[start:stop:step] 取出一个子串,规则与 range 一致:从 start 开始,到 stop 之前结束,不包含 stop;step 是步长,可省略。
s = "hello"
print(s[1:4]) # 下标 1 到 3
print(s[:3]) # 从开头到下标 2
print(s[::2]) # 每隔一个取一个
print(s[::-1]) # 步长为负,倒序输出:
ell
hel
hlo
olleh[::-1] 是反转字符串的常用写法。
5.3 常用方法
方法是依附在数据上的函数,写法是 数据.方法名()。字符串常用方法:
| 方法 | 作用 | 示例 | 结果 |
|---|---|---|---|
lower() / upper() | 转小写 / 大写 | "Hello".lower() | "hello" |
strip() | 去掉两端空白 | " hi ".strip() | "hi" |
replace(a, b) | 把 a 替换成 b | "a-b-c".replace("-", "+") | "a+b+c" |
split(sep) | 按分隔符拆成列表 | "a,b,c".split(",") | ["a", "b", "c"] |
join(列表) | 把列表拼成字符串 | "-".join(["a","b","c"]) | "a-b-c" |
startswith(x) | 是否以 x 开头 | "hello".startswith("he") | True |
find(x) | 返回 x 首次出现的下标 | "hello".find("l") | 2 |
split 与 join 是方向相反的一对:split 字符串→列表,join 列表→字符串。
判断一个子串在不在字符串里,用 in 运算符:
print("l" in "hello")
print("x" in "hello")输出:
True
Falsefind 在找不到时返回 -1;index 与 find 类似,但找不到时抛 ValueError,日常优先用 find。
5.4 格式化输出
第 2 章已用过 f-string,这里系统说明。f-string 在字符串前加 f,花括号里写变量或表达式:
name = "小明"
age = 18
print(f"{name} 明年 {age + 1} 岁")
print(f"{name.upper()}")输出:
小明 明年 19 岁
小明f-string 里可以调用方法、做运算,表达式在运行前先求值再嵌入字符串。
两种旧式写法(能读懂即可,新代码推荐 f-string):
print("{}-{}".format(2026, 8))
print("%d-%02d" % (2026, 8))输出:
2026-8
2026-08%02d 表示「占 2 位,不足补 0」,%d 是整数占位符。这类格式串在旧代码和日志中很常见,遇到时要能看懂。
5.5 字符串是不可变的
不可变指字符串创建后不能修改它的任何字符。下面代码会报错:
s = "hi"
s[0] = "H"报错:
TypeError: 'str' object does not support item assignment想得到修改后的字符串,要创建新字符串:
s = "hi"
s = "H" + s[1:]
print(s)输出:
Hi动手实践
任务:文本统计。 读入一句话,统计并输出:字符总数、单词数(按空格拆分)、其中包含几个字母 a。
text = input("请输入一句话: ")
print(f"字符总数: {len(text)}")
words = text.split(" ")
print(f"单词数: {len(words)}")
print(f"字母 a 的个数: {text.count('a')}")运行示例(输入 learn python with ai):
请输入一句话: learn python with ai
字符总数: 20
单词数: 4
字母 a 的个数: 2count(x) 统计子串 x 出现的次数。上面例子的字符数 20 与单词数 4,可以对照输入数一遍验证。
常见错误
| 错误写法 | 报错信息 | 原因 |
|---|---|---|
s = "hi"; s[0] = "H" | TypeError: 'str' object does not support item assignment | 字符串不可变,不能原地修改 |
"hello"[10] | IndexError: string index out of range | 下标超出范围,合法下标是 0 到 len(s)-1 |
"ab" + 1 | TypeError: can only concatenate str (not "int") to str | 拼接前先把数字转成字符串 |
"hello".index("x") | ValueError: substring not found | index 找不到子串会报错,可用 find 替代 |
"a,b".split() | ["a,b"](不报错但结果不对) | split() 默认按空白拆分;按逗号拆分要写 split(",") |
章末练习
基础
- 定义字符串
s = "python",用切片分别取出"pyt"、"hon"、"nohtyp"(倒序)。 - 读入一个英文单词,输出它的大写形式,以及字母个数。
- 把字符串
"2026-08-02"按-拆分,输出["2026", "08", "02"]。
提高
- 读入一个英文句子,统计其中单词的个数(按空格拆分),并输出每个单词,每行一个。
- 判断一个字符串是否是「回文」:正着读和倒着读一样,如
"racecar"。提示:比较s与s[::-1]。
挑战
- 读入一串以逗号分隔的成绩(如
"85,92,78,90"),拆分后转成整数列表,输出总分与平均分。提示:用split(",")得到字符串列表,再逐个int()转换。
章末自测
每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。
"hello"[1]的结果是?- A.
"h" - B.
"e" - C.
"l" - D.
"o"
- A.
"hello"[-1]的结果是?- A.
"h" - B.
"e" - C.
"l" - D.
"o"
- A.
len("你好")的结果是?- A.
2 - B.
4 - C.
1 - D. 报错
- A.
"hello"[1:4]的结果是?- A.
"ell" - B.
"ello" - C.
"hel" - D.
"lo"
- A.
"hello"[::-1]的结果是?- A.
"olleh" - B.
"hello" - C.
"h" - D. 报错
- A.
" hi ".strip()的结果是?- A.
"hi" - B.
" hi" - C.
"hi " - D.
"hi hi"
- A.
"a,b,c".split(",")的结果是?- A.
["a", "b", "c"] - B.
["a,b,c"] - C.
"a b c" - D.
"a" , "b" , "c"
- A.
"-".join(["a", "b"])的结果是?- A.
"a-b" - B.
"ab" - C.
["a", "-", "b"] - D.
"-ab"
- A.
- 下列哪句会报错?
- A.
print("ab" + "cd") - B.
print("ab" * 3) - C.
print("ab" + 1) - D.
print(len("ab"))
- A.
"hello".find("x")的结果是? A.-1B.0C. 报错 D.None
