Python(十九) 中的字符串
一、什么是字符串
字符串,英文叫 string。
在 Python 中,字符串就是一串文本内容。
通俗地说:
凡是用来表示文字、符号、数字文本的内容,都可以用字符串表示。
例如:
name = "小明"
message = "欢迎学习 Python"
phone = "13800138000"
这里的 "小明"、"欢迎学习 Python"、"13800138000" 都是字符串。
注意:
"123" 是字符串。
123 是整数。
它们看起来相似,但类型不同。
示例:
print(type("123"))
print(type(123))
输出结果:
<class 'str'>
<class 'int'>
教学时可以这样讲:
只要被引号包起来,就是字符串。
二、字符串的创建方式
Python 中可以使用单引号、双引号或三引号创建字符串。
1. 单引号
name = '小明'
print(name)
2. 双引号
name = "小明"
print(name)
单引号和双引号的效果基本一样。
推荐习惯:
同一个项目中尽量保持风格统一。
3. 三引号
三引号可以表示多行字符串。
可以使用三个单引号:
text = '''第一行
第二行
第三行'''
print(text)
也可以使用三个双引号:
text = """第一行
第二行
第三行"""
print(text)
三引号常用于:
多行文本
函数说明文档
较长的字符串内容
三、字符串中的引号问题
如果字符串内容本身包含引号,要注意外层引号和里面的引号不要冲突。
示例:
text = "他说:'你好'"
print(text)
输出结果:
他说:'你好'
也可以这样写:
text = '他说:"你好"'
print(text)
如果外层和里面都想使用同一种引号,就需要转义。
text = "他说:\"你好\""
print(text)
这里的 \" 表示普通的双引号字符,不表示字符串结束。
四、转义字符
转义字符是用反斜杠 \ 开头的特殊字符。
常见转义字符:
\n 换行
\t 制表符,相当于按 Tab 键
\\ 表示一个反斜杠
\' 表示一个单引号
\" 表示一个双引号
示例:
print("第一行\n第二行")
输出结果:
第一行
第二行
示例:
print("姓名\t年龄")
print("小明\t18")
输出结果大致为:
姓名 年龄
小明 18
如果想输出路径:
path = "C:\\Users\\Student\\Desktop"
print(path)
输出结果:
C:\Users\Student\Desktop
五、原始字符串 r-string
有时候字符串中有很多反斜杠,比如 Windows 路径、正则表达式。
这时可以使用原始字符串。
写法是在字符串前面加 r:
path = r"C:\Users\Student\Desktop"
print(path)
输出结果:
C:\Users\Student\Desktop
r 的意思是 raw,表示原始字符串。
通俗理解:
加了 r 以后,大多数反斜杠会按照普通字符处理。
注意:
原始字符串不能以单个反斜杠结尾。
例如下面写法不推荐:
path = r"C:\Users\Student\"
因为最后的反斜杠会影响结尾引号。
六、字符串索引
字符串中的每一个字符都有位置编号,这个编号叫索引。
Python 中的索引从 0 开始。
示例:
text = "Python"
每个字符的位置如下:
字符: P y t h o n
索引: 0 1 2 3 4 5
获取某个位置的字符:
text = "Python"
print(text[0])
print(text[1])
print(text[5])
输出结果:
P
y
n
可以这样记:
第一个字符的索引是 0,不是 1。
七、负数索引
Python 也支持负数索引。
负数索引从右往左数。
示例:
text = "Python"
对应关系:
字符: P y t h o n
正索引: 0 1 2 3 4 5
负索引:-6 -5 -4 -3 -2 -1
示例:
text = "Python"
print(text[-1])
print(text[-2])
输出结果:
n
o
教学时可以这样讲:
text[-1] 永远表示最后一个字符。
八、索引越界
如果访问不存在的位置,会报错。
示例:
text = "Python"
print(text[10])
会报错:
IndexError: string index out of range
原因:
"Python" 只有 6 个字符,最大索引是 5。
text[10] 超出了范围。
避免方法:
text = "Python"
if len(text) > 10:
print(text[10])
else:
print("索引超出范围")
九、字符串切片
切片就是从字符串中取出一部分内容。
基本格式:
字符串[开始位置:结束位置]
注意:
包含开始位置。
不包含结束位置。
示例:
text = "Python"
print(text[0:2])
输出结果:
Py
原因:
text[0:2] 从索引 0 开始,到索引 2 之前结束。
所以取到索引 0 和索引 1 的字符。
可以这样记:
左闭右开:包含左边,不包含右边。
十、切片省略写法
1. 省略开始位置
text = "Python"
print(text[:3])
输出结果:
Pyt
text[:3] 表示:
从开头取到索引 3 之前。
2. 省略结束位置
text = "Python"
print(text[2:])
输出结果:
thon
text[2:] 表示:
从索引 2 开始,一直取到最后。
3. 开始和结束都省略
text = "Python"
print(text[:])
输出结果:
Python
text[:] 表示取整个字符串。
十一、带步长的切片
切片还可以加第三个参数,叫步长。
格式:
字符串[开始位置:结束位置:步长]
示例:
text = "abcdefg"
print(text[0:7:2])
输出结果:
aceg
解释:
从索引 0 到索引 7 之前,每隔 2 个位置取一次。
也可以省略开始和结束:
text = "abcdefg"
print(text[::2])
输出结果:
aceg
十二、使用切片反转字符串
步长可以是负数。
如果步长是 -1,可以反转字符串。
示例:
text = "Python"
print(text[::-1])
输出结果:
nohtyP
解释:
text[::-1] 表示从右往左取整个字符串。
这是 Python 中很常见的写法。
十三、字符串长度 len()
len() 可以获取字符串长度,也就是字符串中字符的个数。
示例:
text = "Python"
print(len(text))
输出结果:
6
中文字符也按字符数量计算:
text = "你好"
print(len(text))
输出结果:
2
注意:
len() 计算的是字符数量,不是字节数量。
十四、字符串拼接
字符串可以使用 + 拼接。
示例:
first_name = "张"
last_name = "三"
name = first_name + last_name
print(name)
输出结果:
张三
也可以拼接句子:
name = "小明"
message = "你好," + name
print(message)
输出结果:
你好,小明
注意:
字符串只能和字符串直接相加。
错误示例:
age = 18
message = "年龄是:" + age
会报错,因为 age 是整数。
正确写法:
age = 18
message = "年龄是:" + str(age)
print(message)
或者使用格式化:
age = 18
message = f"年龄是:{age}"
print(message)
十五、字符串重复
字符串可以使用 * 重复。
示例:
print("Python" * 3)
输出结果:
PythonPythonPython
再如:
print("-" * 20)
输出结果:
--------------------
这个写法常用于输出分隔线。
十六、判断字符串是否包含某内容
可以使用 in 判断一个字符串是否包含另一个字符串。
示例:
text = "I love Python"
print("Python" in text)
print("Java" in text)
输出结果:
True
False
也可以使用 not in:
text = "I love Python"
if "Java" not in text:
print("没有找到 Java")
十七、遍历字符串
字符串可以使用 for 循环逐个字符遍历。
示例:
text = "Python"
for ch in text:
print(ch)
输出结果:
P
y
t
h
o
n
这里的 ch 是每次循环取到的一个字符。
教学时可以这样讲:
字符串可以看作由一个个字符组成的序列。
所以它可以被索引、切片和遍历。
十八、字符串是不可变对象
Python 中的字符串是不可变对象。
意思是:
字符串一旦创建,就不能直接修改其中某一个字符。
错误示例:
text = "Python"
text[0] = "J"
这会报错:
TypeError: 'str' object does not support item assignment
如果想得到 "Jython",可以创建一个新字符串:
text = "Python"
new_text = "J" + text[1:]
print(new_text)
输出结果:
Jython
教学时可以这样讲:
字符串不能原地修改。
所谓修改字符串,本质上通常是创建一个新的字符串。
十九、常用字符串方法
字符串方法就是字符串自带的功能。
调用格式:
字符串.方法名()
例如:
text = "python"
print(text.upper())
输出结果:
PYTHON
下面介绍常见方法。
二十、大小写转换
1. upper()
把字符串转换成大写。
text = "python"
print(text.upper())
输出结果:
PYTHON
2. lower()
把字符串转换成小写。
text = "PYTHON"
print(text.lower())
输出结果:
python
3. title()
把每个单词首字母变成大写。
text = "hello python"
print(text.title())
输出结果:
Hello Python
4. capitalize()
把字符串第一个字符变成大写。
text = "hello python"
print(text.capitalize())
输出结果:
Hello python
注意:
这些方法不会修改原字符串,而是返回一个新字符串。
示例:
text = "python"
text.upper()
print(text)
输出结果:
python
如果想保存转换结果,需要赋值:
text = "python"
text = text.upper()
print(text)
二十一、去除空白字符
1. strip()
去除字符串两边的空白字符。
text = " Python "
print(text.strip())
输出结果:
Python
2. lstrip()
去除左边空白字符。
text = " Python "
print(text.lstrip())
3. rstrip()
去除右边空白字符。
text = " Python "
print(text.rstrip())
常见使用场景:
username = input("请输入用户名:").strip()
这样可以避免用户不小心输入前后空格。
二十二、查找字符串
1. find()
find() 用于查找子字符串的位置。
如果找到,返回第一次出现的索引。
如果找不到,返回 -1。
示例:
text = "I love Python"
print(text.find("Python"))
print(text.find("Java"))
输出结果:
7
-1
2. index()
index() 也可以查找位置。
如果找到,返回索引。
如果找不到,会报错。
text = "I love Python"
print(text.index("Python"))
输出结果:
7
如果:
print(text.index("Java"))
会报错。
教学建议:
初学阶段查找字符串,优先使用 find(),因为找不到时返回 -1,不会直接报错。
3. count()
count() 用于统计某个子字符串出现的次数。
text = "banana"
print(text.count("a"))
print(text.count("na"))
输出结果:
3
2
二十三、替换字符串 replace()
replace() 用于替换字符串中的内容。
格式:
字符串.replace(旧内容, 新内容)
示例:
text = "I love Java"
new_text = text.replace("Java", "Python")
print(new_text)
输出结果:
I love Python
注意:
replace() 不会修改原字符串,而是返回一个新字符串。
示例:
text = "I love Java"
text.replace("Java", "Python")
print(text)
输出结果:
I love Java
如果想保存结果,需要赋值:
text = text.replace("Java", "Python")
二十四、拆分字符串 split()
split() 用于把一个字符串拆分成列表。
示例:
text = "apple,banana,orange"
fruits = text.split(",")
print(fruits)
输出结果:
['apple', 'banana', 'orange']
如果不指定分隔符,默认按空白字符拆分。
text = "I love Python"
words = text.split()
print(words)
输出结果:
['I', 'love', 'Python']
常见使用场景:
data = "小明,18,北京"
name, age, city = data.split(",")
print(name)
print(age)
print(city)
二十五、连接字符串 join()
join() 用于把列表中的多个字符串连接成一个字符串。
示例:
words = ["I", "love", "Python"]
text = " ".join(words)
print(text)
输出结果:
I love Python
再如:
fruits = ["apple", "banana", "orange"]
text = ",".join(fruits)
print(text)
输出结果:
apple,banana,orange
注意:
join() 连接的列表中必须都是字符串。
错误示例:
numbers = [1, 2, 3]
text = ",".join(numbers)
正确写法:
numbers = [1, 2, 3]
text = ",".join(str(num) for num in numbers)
print(text)
输出结果:
1,2,3
二十六、判断开头和结尾
1. startswith()
判断字符串是否以指定内容开头。
filename = "report.pdf"
print(filename.startswith("report"))
输出结果:
True
2. endswith()
判断字符串是否以指定内容结尾。
filename = "report.pdf"
print(filename.endswith(".pdf"))
输出结果:
True
常见使用场景:
filename = "photo.jpg"
if filename.endswith(".jpg"):
print("这是 JPG 图片")
二十七、判断字符串内容类型
常见方法:
isdigit() 是否全是数字
isalpha() 是否全是字母
isalnum() 是否由字母或数字组成
isspace() 是否全是空白字符
islower() 是否全是小写
isupper() 是否全是大写
示例:
print("123".isdigit())
print("abc".isalpha())
print("abc123".isalnum())
print(" ".isspace())
输出结果:
True
True
True
True
常见使用场景:判断用户输入是否是数字。
age = input("请输入年龄:")
if age.isdigit():
age = int(age)
print("年龄是:", age)
else:
print("请输入正确的数字")
注意:
isdigit() 适合判断普通正整数。
它不能直接判断负数或小数。
例如:
print("-3".isdigit())
print("3.14".isdigit())
输出结果:
False
False
二十八、字符串格式化
字符串格式化就是把变量的值放进字符串中。
比如我们想输出:
小明今年18岁
如果姓名和年龄来自变量,就需要格式化。
Python 中常见格式化方式有三种:
1. f-string
2. format()
3. % 格式化
现在最推荐的是 f-string。
二十九、f-string 格式化
f-string 是 Python 3.6 开始支持的格式化方式。
写法是在字符串前面加 f,然后用 {} 放变量或表达式。
示例:
name = "小明"
age = 18
message = f"{name}今年{age}岁"
print(message)
输出结果:
小明今年18岁
也可以在 {} 中写表达式:
a = 3
b = 5
print(f"{a} + {b} = {a + b}")
输出结果:
3 + 5 = 8
教学时可以这样讲:
f-string 就是把变量直接塞进字符串里。
三十、f-string 控制小数位数
格式:
{变量:.位数f}
示例:
price = 3.14159
print(f"价格是:{price:.2f}")
输出结果:
价格是:3.14
这里的 .2f 表示保留 2 位小数。
再如:
score = 95.678
print(f"成绩是:{score:.1f}")
输出结果:
成绩是:95.7
三十一、f-string 设置宽度和对齐
可以设置输出宽度。
示例:
name = "Tom"
print(f"|{name:10}|")
输出大致为:
|Tom |
表示这个位置占 10 个字符宽度,默认左对齐或根据类型对齐。
常见对齐方式:
< 左对齐
> 右对齐
^ 居中对齐
示例:
name = "Tom"
print(f"|{name:<10}|")
print(f"|{name:>10}|")
print(f"|{name:^10}|")
输出效果:
|Tom |
| Tom|
| Tom |
也可以指定填充字符:
name = "Tom"
print(f"|{name:*^10}|")
输出结果:
|***Tom****|
三十二、format() 格式化
format() 是另一种常见格式化方式。
示例:
name = "小明"
age = 18
message = "{}今年{}岁".format(name, age)
print(message)
输出结果:
小明今年18岁
也可以指定位置:
message = "{0}喜欢{1},{1}也喜欢{0}".format("小明", "Python")
print(message)
输出结果:
小明喜欢Python,Python也喜欢小明
也可以使用名字:
message = "{name}今年{age}岁".format(name="小明", age=18)
print(message)
输出结果:
小明今年18岁
三十三、% 格式化
% 格式化是较早的字符串格式化方式。
示例:
name = "小明"
age = 18
message = "%s今年%d岁" % (name, age)
print(message)
输出结果:
小明今年18岁
常见占位符:
%s 字符串
%d 整数
%f 浮点数
保留两位小数:
price = 3.14159
print("%.2f" % price)
输出结果:
3.14
教学建议:
现在新代码更推荐使用 f-string。
format() 和 % 格式化了解即可,阅读旧代码时会遇到。
三十四、三种格式化方式对比
同一个需求:输出姓名和年龄。
1. f-string
name = "小明"
age = 18
print(f"{name}今年{age}岁")
2. format()
name = "小明"
age = 18
print("{}今年{}岁".format(name, age))
3. % 格式化
name = "小明"
age = 18
print("%s今年%d岁" % (name, age))
建议:
初学者优先掌握 f-string。
原因:
写法直观。
变量放在哪里,结果就显示在哪里。
三十五、字符串与 input()
input() 接收到的内容永远是字符串。
示例:
age = input("请输入年龄:")
print(type(age))
即使用户输入的是 18,age 也是字符串 "18"。
如果要进行数字计算,需要转换类型:
age = input("请输入年龄:")
age = int(age)
print(age + 1)
教学提醒:
input() 得到的是字符串。
要计算就转成 int 或 float。
三十六、字符串和编码简单了解
计算机底层只能处理数字。
字符串中的文字也需要用数字表示。
这个转换规则就叫编码。
常见编码:
UTF-8
GBK
ASCII
Python 3 中字符串默认支持 Unicode,可以很好地处理中文。
示例:
text = "你好,Python"
print(text)
print(len(text))
初学阶段只需要记住:
Python 3 对中文支持很好。
保存文件时通常使用 UTF-8 编码。
如果以后学习文件读写,会经常看到:
open("data.txt", "r", encoding="utf-8")
这里的 encoding="utf-8" 就是指定编码。
三十七、常见注意事项
1. 字符串要用引号包起来
错误写法:
name = 小明
正确写法:
name = "小明"
2. 单引号和双引号要成对出现
错误写法:
text = "Python'
正确写法:
text = "Python"
3. 索引从 0 开始
text = "Python"
print(text[0])
输出:
P
不是 y。
4. 切片结束位置不包含在内
text = "Python"
print(text[0:2])
输出:
Py
取到索引 0 和 1,不取索引 2。
5. 字符串不能直接修改某个字符
错误写法:
text = "Python"
text[0] = "J"
正确思路:
text = "Python"
text = "J" + text[1:]
6. 字符串和数字不能直接用 + 拼接
错误写法:
age = 18
print("年龄:" + age)
正确写法:
age = 18
print("年龄:" + str(age))
更推荐:
age = 18
print(f"年龄:{age}")
7. 字符串方法通常返回新字符串
示例:
text = "python"
text.upper()
print(text)
输出:
python
因为 upper() 返回的是新字符串,没有改变原字符串。
应该写:
text = text.upper()
8. split() 得到的是列表
text = "a,b,c"
result = text.split(",")
print(result)
输出:
['a', 'b', 'c']
9. join() 只能连接字符串
错误写法:
numbers = [1, 2, 3]
print(",".join(numbers))
正确写法:
numbers = [1, 2, 3]
print(",".join(str(num) for num in numbers))
10. f-string 前面不要忘记写 f
错误写法:
name = "小明"
print("{name},你好")
输出结果:
{name},你好
正确写法:
name = "小明"
print(f"{name},你好")
输出结果:
小明,你好
三十八、课堂示例
示例 1:获取姓名首字母
name = "Python"
first = name[0]
print(first)
讲解重点:
索引从 0 开始。
name[0] 表示第一个字符。
示例 2:获取文件扩展名
filename = "report.pdf"
ext = filename[-4:]
print(ext)
输出结果:
.pdf
讲解重点:
负数索引可以从右边取字符。
切片可以取出字符串的一部分。
示例 3:判断是否是手机号
phone = input("请输入手机号:").strip()
if len(phone) == 11 and phone.isdigit():
print("手机号格式基本正确")
else:
print("手机号格式错误")
讲解重点:
len() 判断长度。
isdigit() 判断是否全是数字。
strip() 去除前后空格。
示例 4:统计某个字符出现次数
text = "banana"
count = text.count("a")
print(count)
输出结果:
3
示例 5:处理逗号分隔的数据
data = "小明,18,北京"
name, age, city = data.split(",")
print(f"姓名:{name}")
print(f"年龄:{age}")
print(f"城市:{city}")
讲解重点:
split() 可以把字符串拆成列表。
f-string 可以方便地格式化输出。
示例 6:生成欢迎语
name = input("请输入姓名:").strip()
message = f"欢迎你,{name}!"
print(message)
讲解重点:
input() 获取用户输入。
strip() 去除多余空格。
f-string 生成完整句子。
示例 7:隐藏手机号中间四位
phone = "13800138000"
hidden_phone = phone[:3] + "****" + phone[7:]
print(hidden_phone)
输出结果:
138****8000
讲解重点:
字符串不能直接修改。
可以通过切片和拼接生成新字符串。
三十九、课堂练习
练习 1:输出字符串第一个和最后一个字符
要求:给定字符串 "Python",输出第一个字符和最后一个字符。
参考代码:
text = "Python"
print(text[0])
print(text[-1])
练习 2:截取字符串
要求:从 "Hello Python" 中截取 "Python"。
参考代码:
text = "Hello Python"
print(text[6:])
练习 3:反转字符串
要求:把 "Python" 反转成 "nohtyP"。
参考代码:
text = "Python"
print(text[::-1])
练习 4:去除用户输入前后空格
要求:输入用户名,去除前后空格后输出。
参考代码:
username = input("请输入用户名:").strip()
print(username)
练习 5:判断文件类型
要求:判断文件名是否以 .txt 结尾。
参考代码:
filename = "readme.txt"
if filename.endswith(".txt"):
print("这是文本文件")
else:
print("不是文本文件")
练习 6:把列表连接成字符串
要求:把 ["apple", "banana", "orange"] 连接成 "apple,banana,orange"。
参考代码:
fruits = ["apple", "banana", "orange"]
text = ",".join(fruits)
print(text)
练习 7:格式化输出成绩
要求:输出姓名和成绩,成绩保留 1 位小数。
参考代码:
name = "小明"
score = 95.678
print(f"{name}的成绩是{score:.1f}")
练习 8:统计一句话中某个词是否出现
要求:判断 "I love Python" 中是否包含 "Python"。
参考代码:
text = "I love Python"
if "Python" in text:
print("包含 Python")
else:
print("不包含 Python")
四十、教学建议
讲解字符串时,可以按照下面顺序:
1. 先说明字符串就是文本
2. 讲单引号、双引号、三引号
3. 讲转义字符和原始字符串
4. 讲索引,重点强调从 0 开始
5. 讲负数索引
6. 讲切片,重点强调左闭右开
7. 讲字符串不可变
8. 讲常用字符串方法
9. 讲 split 和 join
10. 讲 f-string 格式化
11. 最后通过手机号、文件名、用户输入等例子练习
可以用下面的问题引导学生:
为什么 text[0] 是第一个字符?
为什么 text[0:3] 不包含第 3 个索引?
字符串能不能像列表一样直接修改某个字符?
input() 得到的是字符串还是数字?
为什么 f-string 前面要写 f?
教学重点建议放在:
字符串创建
索引
切片
不可变性
常用方法
split 和 join
f-string 格式化
四十一、总结
字符串是 Python 中用来表示文本的数据类型。
可以这样记:
字符串:用引号包起来的文本
索引:根据位置取一个字符
切片:根据范围取一部分字符串
方法:字符串自带的常用功能
格式化:把变量放进字符串中
字符串常见操作:
text[0] 获取第一个字符
text[-1] 获取最后一个字符
text[1:4] 获取一部分内容
text[::-1] 反转字符串
len(text) 获取长度
"a" in text 判断是否包含
text.split() 拆分字符串
" ".join(list) 连接字符串
常用格式化方式:
name = "小明"
age = 18
print(f"{name}今年{age}岁")
最重要的注意事项:
1. 字符串要用引号包起来
2. 索引从 0 开始
3. 切片结束位置不包含在内
4. 字符串是不可变对象
5. 字符串和数字不能直接用 + 拼接
6. 字符串方法通常返回新字符串
7. input() 获取到的是字符串
8. 新代码优先使用 f-string 格式化
一句话总结:
字符串是 Python 中处理文本的基础,掌握索引、切片、常用方法和格式化,就能完成大多数文本处理任务。