Python 3 教程

Python3 字符串

在 Python 3 中,字符串 (str) 是最常用、功能最丰富的数据类型之一。Python 3 的字符串默认使用 Unicode 编码,支持全球所有语言的字符。

以下是 Python 3 字符串的全面指南,涵盖核心特性、常用操作、现代格式化方法及避坑指南。


1. 核心特性与创建

  • 不可变性 (Immutable):字符串一旦创建,其内容不能被修改。所有“修改”操作(如替换、拼接)都会返回一个新的字符串对象
  • 多引号支持:单引号 '、双引号 " 完全等价。三引号 '''""" 用于创建多行字符串或文档字符串。
纯文本
plaintext
s1 = 'Hello'
s2 = "World"
s3 = """这是一个
多行字符串,
保留了换行和缩进。"""

2. 索引与切片 (Indexing & Slicing)

字符串是有序序列,支持正向索引(从 0 开始)和负向索引(从 -1 开始,代表末尾)。

纯文本
plaintext
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
纯文本
plaintext
# 常用内置函数
s = "Hello"
print(len(s))   # 5 (长度)
print(min(s))   # 'H' (最小字符)
print(max(s))   # 'o' (最大字符)

4. 内置方法大全 (分类速查) 🌟

所有方法均不修改原字符串,而是返回新字符串。

🔍 查找与判断

纯文本
plaintext
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 (是否全为空白字符)

✂️ 拆分与合并

纯文本
plaintext
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'

🔄 修改与转换

纯文本
plaintext
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' (大小写互换)

📐 对齐与填充

纯文本
plaintext
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 是绝对的首选,性能最高且最易读。

纯文本
plaintext
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 文件路径。
纯文本
plaintext
path = "C:\\Users\\Admin\\file.txt"  # 需要双反斜杠转义
raw_path = r"C:\Users\Admin\file.txt"  # 更清晰,推荐!

print("Line1\nLine2")   # 输出两行
print(r"Line1\nLine2")  # 输出: Line1\nLine2

7. 编码与解码 (str vs bytes) 🌐

Python 3 严格区分了文本 (str)二进制数据 (bytes)

  • str 是 Unicode 文本,用于代码内部处理。
  • bytes 是原始字节序列,用于网络传输、文件读写、图像处理等。
纯文本
plaintext
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")

💡 核心避坑与最佳实践

  1. 永远记住“不可变性”
纯文本
plaintext
   s = "hello"
   s.replace("h", "H")  # ❌ 毫无作用!replace 返回新字符串,但没被接收
   s = s.replace("h", "H")  # ✅ 正确做法:重新赋值
  1. 循环中拼接字符串的性能陷阱
纯文本
plaintext
   # ❌ 低效:每次 += 都会创建新字符串对象,O(n²) 复杂度
   result = ""
   for i in range(10000):
       result += str(i)

   # ✅ 高效:O(n) 复杂度,推荐做法
   result = "".join(str(i) for i in range(10000))
  1. 判断空字符串
纯文本
plaintext
   s = ""
   # ❌ 不 Pythonic
   if len(s) == 0: ...
   # ✅ 推荐:利用空字符串的布尔值为 False
   if not s: ...
  1. find() vs index()
  • 使用 find() 更安全,找不到时返回 -1,不会中断程序。
  • 使用 index() 时,如果找不到会直接抛出 ValueError,适合“必须存在”的场景。
  1. 字符串驻留 (String Interning)
    Python 会缓存一些短字符串和符合标识符规则的字符串以节省内存。因此 a = "hi"; b = "hi"; a is b 可能为 True,但不要依赖 is 比较字符串内容,始终使用 ==

掌握字符串操作是 Python 开发的基本功。如果你对正则表达式 (re 模块)字符串模板 (string.Template),或多语言/多编码处理有进一步需求,可以随时告诉我!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注