在 Python 3 中,字符串 (str) 是最常用、功能最丰富的数据类型之一。Python 3 的字符串默认使用 Unicode 编码,支持全球所有语言的字符。
以下是 Python 3 字符串的全面指南,涵盖核心特性、常用操作、现代格式化方法及避坑指南。
1. 核心特性与创建
- 不可变性 (Immutable):字符串一旦创建,其内容不能被修改。所有“修改”操作(如替换、拼接)都会返回一个新的字符串对象。
- 多引号支持:单引号
'、双引号"完全等价。三引号'''或"""用于创建多行字符串或文档字符串。
s1 = 'Hello'
s2 = "World"
s3 = """这是一个
多行字符串,
保留了换行和缩进。"""2. 索引与切片 (Indexing & Slicing)
字符串是有序序列,支持正向索引(从 0 开始)和负向索引(从 -1 开始,代表末尾)。
text = "Python3"
# 索引
print(text[0]) # 'P'
print(text[-1]) # '3'
# 切片 [start:end:step] (左闭右开)
print(text[0:4]) # 'Pyth'
print(text[2:]) # 'thon3' (省略 end 表示到末尾)
print(text[:2]) # 'Py' (省略 start 表示从开头)
print(text[::2]) # 'Pto3' (步长为 2)
print(text[::-1]) # '3nohtyP' (步长为 -1,常用于反转字符串)
# ⚠️ 注意:索引越界会报错 IndexError,但切片越界是安全的
# text[10] # IndexError
print(text[0:100]) # 'Python3' (安全截断)3. 常用操作符
| 运算符 | 说明 | 示例 |
|---|---|---|
+ | 字符串拼接 | 'Hi' + ' ' + 'Python' ➔ 'Hi Python' |
* | 重复字符串 | 'ab' * 3 ➔ 'ababab' |
in / not in | 成员检查 | 'Py' in 'Python' ➔ True |
== / != | 内容比较 | 'abc' == 'abc' ➔ True |
< / > | 字典序比较(基于 Unicode 码点) | 'a' < 'b' ➔ True |
# 常用内置函数
s = "Hello"
print(len(s)) # 5 (长度)
print(min(s)) # 'H' (最小字符)
print(max(s)) # 'o' (最大字符)4. 内置方法大全 (分类速查) 🌟
所有方法均不修改原字符串,而是返回新字符串。
🔍 查找与判断
text = "apple, banana, apple"
print(text.count("apple")) # 2 (统计出现次数)
print(text.find("banana")) # 7 (返回首次出现索引,找不到返回 -1)
print(text.index("banana")) # 7 (找不到会抛 ValueError)
print(text.startswith("app")) # True
print(text.endswith("e")) # True
print("123".isdigit()) # True (是否全为数字)
print("abc".isalpha()) # True (是否全为字母)
print("a1".isalnum()) # True (是否全为字母或数字)
print(" ".isspace()) # True (是否全为空白字符)✂️ 拆分与合并
csv = "apple,banana,cherry"
words = csv.split(",") # ['apple', 'banana', 'cherry']
# 默认 split() 按任意空白字符(空格/换行/制表符)分割,且自动过滤空字符串
" a b \t c ".split() # ['a', 'b', 'c']
# 反向拆分
text = "root-user-admin"
print(text.rsplit("-", 1)) # ['root-user', 'admin'] (最多拆1次,从右边开始)
# 合并 (注意:join 调用的是分隔符!)
result = " | ".join(words) # 'apple | banana | cherry'🔄 修改与转换
s = " Hello World \n"
print(s.strip()) # 'Hello World' (去除两端空白/换行)
print(s.lstrip()) # 仅去左端,rstrip() 仅去右端
print(s.replace("World", "Python")) # ' Hello Python \n'
print(s.replace("l", "L", 2)) # 最多替换2次: ' HeLLo World \n'
print(s.upper()) # ' HELLO WORLD \n'
print(s.lower()) # ' hello world \n'
print(s.title()) # ' Hello World \n' (首字母大写)
print(s.capitalize()) # ' hello world \n' (仅第一个字符大写)
print("hELLO".swapcase())# 'Hello' (大小写互换)📐 对齐与填充
num = "42"
print(num.zfill(5)) # '00042' (左侧补零,常用于编号)
print(num.center(10, '-')) # '----42----'
print(num.ljust(5, '*')) # '42***'
print(num.rjust(5, '*')) # '***42'5. 字符串格式化 (现代 Python 推荐)
从 Python 3.6 开始,f-string 是绝对的首选,性能最高且最易读。
name = "Alice"
age = 25
score = 95.567
# 1. f-string (Python 3.6+)
msg = f"姓名: {name}, 年龄: {age}, 分数: {score:.2f}"
print(msg) # 姓名: Alice, 年龄: 25, 分数: 95.57
# f-string 支持表达式
print(f"明年年龄: {age + 1}")
print(f"分数是否及格: {score >= 60}")
# Python 3.8+ 调试技巧: f"{变量=}" 会同时打印变量名和值
x = 10
print(f"{x=}") # x=10
# 2. .format() (Python 2.6+ 兼容旧代码)
msg2 = "姓名: {}, 年龄: {}".format(name, age)
msg3 = "姓名: {n}, 年龄: {a}".format(n=name, a=age)
# 3. % 格式化 (古老方式,仅维护旧项目时使用)
msg4 = "姓名: %s, 年龄: %d" % (name, age)6. 转义字符与原始字符串
- 转义字符:以
\开头,用于表示特殊字符。 \n换行,\t制表符,\\反斜杠,\'/\"引号- 原始字符串 (Raw String):在引号前加
r,忽略所有转义。非常适合正则表达式和 Windows 文件路径。
path = "C:\\Users\\Admin\\file.txt" # 需要双反斜杠转义
raw_path = r"C:\Users\Admin\file.txt" # 更清晰,推荐!
print("Line1\nLine2") # 输出两行
print(r"Line1\nLine2") # 输出: Line1\nLine27. 编码与解码 (str vs bytes) 🌐
Python 3 严格区分了文本 (str) 和二进制数据 (bytes)。
str是 Unicode 文本,用于代码内部处理。bytes是原始字节序列,用于网络传输、文件读写、图像处理等。
text = "中文 Python"
# 编码:str -> bytes (必须指定编码,推荐 utf-8)
b_data = text.encode("utf-8")
print(b_data) # b'\xe4\xb8\xad\xe6\x96\x87 Python'
# 解码:bytes -> str
recovered = b_data.decode("utf-8")
print(recovered) # '中文 Python'
# ⚠️ 常见报错:UnicodeEncodeError / UnicodeDecodeError
# 原因:通常是在读取非 UTF-8 编码的文件(如 GBK)时未指定正确编码。
# 解决:open("file.txt", encoding="gbk")💡 核心避坑与最佳实践
- 永远记住“不可变性”
s = "hello"
s.replace("h", "H") # ❌ 毫无作用!replace 返回新字符串,但没被接收
s = s.replace("h", "H") # ✅ 正确做法:重新赋值- 循环中拼接字符串的性能陷阱
# ❌ 低效:每次 += 都会创建新字符串对象,O(n²) 复杂度
result = ""
for i in range(10000):
result += str(i)
# ✅ 高效:O(n) 复杂度,推荐做法
result = "".join(str(i) for i in range(10000))- 判断空字符串
s = ""
# ❌ 不 Pythonic
if len(s) == 0: ...
# ✅ 推荐:利用空字符串的布尔值为 False
if not s: ...find()vsindex()
- 使用
find()更安全,找不到时返回-1,不会中断程序。 - 使用
index()时,如果找不到会直接抛出ValueError,适合“必须存在”的场景。
- 字符串驻留 (String Interning)
Python 会缓存一些短字符串和符合标识符规则的字符串以节省内存。因此a = "hi"; b = "hi"; a is b可能为True,但不要依赖is比较字符串内容,始终使用==。
掌握字符串操作是 Python 开发的基本功。如果你对正则表达式 (re 模块)、字符串模板 (string.Template),或多语言/多编码处理有进一步需求,可以随时告诉我!