Skip to content

第 5 章 字符串

学习目标

  • 掌握字符串的索引与切片
  • 掌握常用字符串方法:大小写、去除空白、替换、拆分、拼接、查找
  • 掌握 f-string 格式化输出
  • 理解字符串是不可变类型

5.1 字符串基础

字符串(str)是一串字符,用引号包裹。单引号、双引号都可以,内容一致时效果相同:

python
print("你好")
print('你好')

输出:

你好
你好

字符串可以索引:用方括号加下标取出某个位置的字符,下标从 0 开始;负数下标从末尾倒数,-1 是最后一个字符:

python
s = "hello"
print(s[0])
print(s[-1])
print(len(s))

输出:

h
o
5

len() 返回字符串的长度(字符个数)。

多行文本可以用三引号("""'''):

python
poem = """第一行
第二行"""
print(poem)

输出:

第一行
第二行

5.2 切片

切片s[start:stop:step] 取出一个子串,规则与 range 一致:从 start 开始,到 stop 之前结束,不包含 stop;step 是步长,可省略。

python
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

splitjoin 是方向相反的一对:split 字符串→列表,join 列表→字符串。

判断一个子串在不在字符串里,用 in 运算符:

python
print("l" in "hello")
print("x" in "hello")

输出:

True
False

find 在找不到时返回 -1;indexfind 类似,但找不到时抛 ValueError,日常优先用 find

5.4 格式化输出

第 2 章已用过 f-string,这里系统说明。f-string 在字符串前加 f,花括号里写变量或表达式:

python
name = "小明"
age = 18
print(f"{name} 明年 {age + 1} 岁")
print(f"{name.upper()}")

输出:

小明 明年 19 岁
小明

f-string 里可以调用方法、做运算,表达式在运行前先求值再嵌入字符串。

两种旧式写法(能读懂即可,新代码推荐 f-string):

python
print("{}-{}".format(2026, 8))
print("%d-%02d" % (2026, 8))

输出:

2026-8
2026-08

%02d 表示「占 2 位,不足补 0」,%d 是整数占位符。这类格式串在旧代码和日志中很常见,遇到时要能看懂。

5.5 字符串是不可变的

不可变指字符串创建后不能修改它的任何字符。下面代码会报错:

python
s = "hi"
s[0] = "H"

报错:

TypeError: 'str' object does not support item assignment

想得到修改后的字符串,要创建新字符串:

python
s = "hi"
s = "H" + s[1:]
print(s)

输出:

Hi

动手实践

任务:文本统计。 读入一句话,统计并输出:字符总数、单词数(按空格拆分)、其中包含几个字母 a

python
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 的个数: 2

count(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" + 1TypeError: can only concatenate str (not "int") to str拼接前先把数字转成字符串
"hello".index("x")ValueError: substring not foundindex 找不到子串会报错,可用 find 替代
"a,b".split()["a,b"](不报错但结果不对)split() 默认按空白拆分;按逗号拆分要写 split(",")

章末练习

基础

  1. 定义字符串 s = "python",用切片分别取出 "pyt""hon""nohtyp"(倒序)。
  2. 读入一个英文单词,输出它的大写形式,以及字母个数。
  3. 把字符串 "2026-08-02"- 拆分,输出 ["2026", "08", "02"]

提高

  1. 读入一个英文句子,统计其中单词的个数(按空格拆分),并输出每个单词,每行一个。
  2. 判断一个字符串是否是「回文」:正着读和倒着读一样,如 "racecar"。提示:比较 ss[::-1]

挑战

  1. 读入一串以逗号分隔的成绩(如 "85,92,78,90"),拆分后转成整数列表,输出总分与平均分。提示:用 split(",") 得到字符串列表,再逐个 int() 转换。

章末自测

每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。

  1. "hello"[1] 的结果是?
    • A. "h"
    • B. "e"
    • C. "l"
    • D. "o"
  2. "hello"[-1] 的结果是?
    • A. "h"
    • B. "e"
    • C. "l"
    • D. "o"
  3. len("你好") 的结果是?
    • A. 2
    • B. 4
    • C. 1
    • D. 报错
  4. "hello"[1:4] 的结果是?
    • A. "ell"
    • B. "ello"
    • C. "hel"
    • D. "lo"
  5. "hello"[::-1] 的结果是?
    • A. "olleh"
    • B. "hello"
    • C. "h"
    • D. 报错
  6. " hi ".strip() 的结果是?
    • A. "hi"
    • B. " hi"
    • C. "hi "
    • D. "hi hi"
  7. "a,b,c".split(",") 的结果是?
    • A. ["a", "b", "c"]
    • B. ["a,b,c"]
    • C. "a b c"
    • D. "a" , "b" , "c"
  8. "-".join(["a", "b"]) 的结果是?
    • A. "a-b"
    • B. "ab"
    • C. ["a", "-", "b"]
    • D. "-ab"
  9. 下列哪句会报错?
    • A. print("ab" + "cd")
    • B. print("ab" * 3)
    • C. print("ab" + 1)
    • D. print(len("ab"))
  10. "hello".find("x") 的结果是? A. -1 B. 0 C. 报错 D. None