大家好,我是煜道。
今天我们一起来学习 Python基本数据类型(下)——字符串类型。
引言
字符串是编程中最常用的数据类型之一。 在Python中,字符串被设计为不可变的序列类型,这一定位与列表、元组等序列类型有本质区别。字符串在文本处理、数据解析、Web开发等领域有着广泛的应用。
Python对字符串的支持非常完善,提供了丰富的操作方法和格式化选项。从简单的字符拼接到复杂的正则表达式匹配,从基础的切片操作到灵活的字符串格式化,Python都提供了直观易用的接口。
本文将深入探讨Python字符串的类型特性、表示方法、常用操作以及格式化技巧,帮助我们建立对字符串的完整认知。

01 字符串的基本特性
1.1 字符串的本质
在Python中,字符串(str)是不可变的序列类型。这意味着字符串一旦创建,其内容就不能被修改。任何看似"修改"字符串的操作,实际上都是创建了一个新的字符串对象。
s = "Python"print(id(s)) # 字符串对象的内存地址s = s + " 3.12"# 创建新字符串print(id(s)) # 新地址,与之前不同
这一设计决定了字符串操作的效率特点:频繁拼接会产生多个中间字符串对象,在处理大量字符串拼接时应考虑使用列表join或其他优化方式。

1.2 字符串是序列
作为序列类型,字符串支持索引和切片操作:
s = "Python"# 索引访问print(s[0]) # 'P'(正向索引,从0开始)print(s[-1]) # 'n'(负向索引,从-1开始)# 切片操作print(s[0:2]) # 'Py'(左闭右开区间)print(s[2:]) # 'thon'print(s[:2]) # 'Py'print(s[::2]) # 'Pto'(步长为2)print(s[::-1]) # 'nohtyP'(逆序)

02 字符串的表示方法
2.1 单引号与双引号
Python中字符串可以用单引号(')或双引号(")包围,两者没有本质区别:
s1 = 'Hello, World!'s2 = "Hello, World!"print(s1 == s2) # True
使用单引号或双引号的常见场景:
# 包含引号的字符串s1 = "It's a beautiful day"# 外部双引号,内部单引号s2 = 'He said: "Hello!"'# 外部单引号,内部双引号# 避免转义path = "C:\\Users\\Admin\\Documents"# 需要转义path = r"C:\Users\Admin\Documents"# 使用原始字符串
2.2 三引号字符串
三引号('''或""")用于创建多行字符串:
# 多行字符串poem = '''床前明月光,疑是地上霜。举头望明月,低头思故乡。'''print(poem)
三引号字符串常用于文档字符串(docstring):
defgreet(name):""" 向用户打招呼的函数 参数: name: 用户的名字 返回: 问候语字符串 """returnf"Hello, {name}!"
2.3 转义字符
转义字符以反斜杠(\)开头,用于表示无法直接输入的字符:
print("Line1\nLine2") # 换行print("Column1\tColumn2") # 制表符print("Backslash: \\") # 反斜杠
2.4 原始字符串
原始字符串(raw string)前缀r或R会阻止转义解析:
# 普通字符串path = "C:\n ew\test"# 包含换行和制表符# 原始字符串path = r"C:\New\test"# 字面值:C:\New\test
原始字符串不能以单个反斜杠结尾,因为\会转义引号:
# 这会报错# s = r"test\"# 解决方案:使用字符串拼接s = r"test" + "\\"
2.5 Python 3.12的f-string改进
Python 3.12(PEP 701)对f-string语法进行了重大改进,解除了诸多限制:
# Python 3.12之前(受限语法)# 不能在f-string内部使用注释# 不能使用反斜杠# 嵌套引号受限# Python 3.12(解放)name = "Python"version = 3.12# 可以使用反斜杠print(f"Name: {name}\nVersion: {version}")# 可以使用注释(Python 3.12+)print(f"Result: {name}{version}") # 这是注释# 可以嵌套引号quote = f"He said: '{name}'"

03 字符串常用操作
3.1 长度与成员判断
s = "Python 3.12"# 长度print(len(s)) # 11# 成员判断print('P'in s) # Trueprint('z'in s) # Falseprint('Py'in s) # True
3.2 大小写转换
s = "Python Programming"# 首字母大写print(s.capitalize()) # 'Python programming'# 标题格式print(s.title()) # 'Python Programming'# 大小写转换print(s.upper()) # 'PYTHON PROGRAMMING'print(s.lower()) # 'python programming'# 大小写交换print(s.swapcase()) # 'pYTHON pROGRAMMING'
3.3 查找与替换
s = "Python is popular. Python is powerful."# 查找位置print(s.find("Python")) # 0(首次出现的位置)print(s.find("Java")) # -1(未找到)print(s.rfind("Python")) # 19(最后一次出现的位置)# 统计出现次数print(s.count("Python")) # 2# 替换print(s.replace("Python", "Java")) # 'Java is popular. Java is powerful.'print(s.replace("Python", "Go", 1)) # 只替换第一个
3.4 去除空白
s = " Python "# 去除两端空白print(s.strip()) # 'Python'print(s.lstrip()) # 'Python 'print(s.rstrip()) # ' Python'# 去除指定字符s = "***Python***"print(s.strip('*')) # 'Python'print(s.lstrip('*')) # 'Python***'
3.5 分割与连接
s = "Python,Java,C++,JavaScript"# 分割print(s.split(',')) # ['Python', 'Java', 'C++', 'JavaScript']print(s.split(',', 2)) # 只分割前2次# 行分割text = "line1\nline2\nline3"print(text.splitlines()) # ['line1', 'line2', 'line3']# 连接languages = ['Python', 'Java', 'C++']print(', '.join(languages)) # 'Python, Java, C++'

3.6 字符串对齐
s = "Python"# 居中print(s.center(15, '*')) # '*****Python*****'# 左对齐print(s.ljust(15, '-')) # 'Python----------'# 右对齐print(s.rjust(15, '-')) # '----------Python'
3.7 编码与解码
# 字符串编码s = "Python中文"encoded = s.encode('utf-8')print(encoded) # b'Python\xe4\xb8\xad\xe6\x96\x87'# 解码decoded = encoded.decode('utf-8')print(decoded) # 'Python中文'# 错误处理try:b'Python\xff\xfe'.decode('utf-8')except UnicodeDecodeError as e: print(f"解码错误: {e}")# 使用错误处理策略print(b'Python\xff\xfe'.decode('utf-8', errors='ignore')) # 'Python'print(b'Python\xff\xfe'.decode('utf-8', errors='replace')) # 'Python��'

04 字符串格式化
4.1 百分号格式化
这是Python最早的字符串格式化方式:
name = "Python"version = 3.12# 基本用法print("Language: %s" % name) # 'Language: Python'print("Version: %.1f" % version) # 'Version: 3.1'print("%s %.2f" % (name, version)) # 'Python 3.12'# 格式说明符print("%10s" % name) # 右对齐,宽度10print("%-10s" % name) # 左对齐,宽度10print("%10.2f" % 3.14159) # 宽度10,精度2
4.2 str.format方法
更现代的格式化方式:
# 位置参数print("{} {}".format("Hello", "World")) # 'Hello World'print("{0} {1}".format("Hello", "World")) # 'Hello World'print("{1} {0}".format("World", "Hello")) # 'Hello World'# 关键字参数print("{name} {version}".format(name="Python", version=3.12))# 格式说明符print("{:.2f}".format(3.14159)) # '3.14'print("{:>10}".format("Python")) # 右对齐print("{:<10}".format("Python")) # 左对齐print("{:^10}".format("Python")) # 居中print("{:,}".format(1000000)) # '1,000,000'(千位分隔)print("{:.2%}".format(0.75)) # '75.00%'
4.3 f-string(格式化字符串字面值)
Python 3.6+引入的最简洁格式化方式:
name = "Python"version = 3.12# 基本用法print(f"{name}{version}") # 'Python 3.12'# 表达式print(f"{2 ** 10}") # '1024'print(f"{name.upper()}") # 'PYTHON'# 格式说明符print(f"{3.14159:.2f}") # '3.14'print(f"{0.75:.2%}") # '75.00%'print(f"{1000000:,}") # '1,000,000'print(f"{42:05d}") # '00042'# 调试输出x = 10print(f"{x=}") # 'x=10'

4.4 模板字符串
当需要避免意外的解释时,可以使用模板字符串:
from string import Templatet = Template("$name is $language version $version")result = t.substitute(name="Python", language="Python", version=3.12)print(result) # 'Python is Python version 3.12'# 安全替换(缺失的键不会报错)result = t.safe_substitute(name="Python")print(result) # 'Python is $language version $version'

05 字符串与类型转换
5.1 数值转字符串
# 基本转换str(42) # '42'str(3.14159) # '3.14159'str(True) # 'True'# 进制转换hex(255) # '0xff'oct(8) # '0o10'bin(10) # '0b1010'
5.2 字符串转数值
# 整数int("42") # 42int("1010", 2) # 10(二进制)int("FF", 16) # 255(十六进制)# 浮点数float("3.14") # 3.14float("1e10") # 10000000000.0# 错误处理try: int("abc")except ValueError as e: print(f"转换错误: {e}")

06 字符串的不可变性
6.1 不可变性的含义
字符串的不可变性意味着所有"修改"操作都会生成新字符串:
s = "Python"s[0] = 'p'# TypeError: 'str' object does not support item assignment# 正确做法:创建新字符串s_new = 'p' + s[1:] # 'python'
6.2 不可变性的意义
不可变性带来以下优点:
- 线程安全:不可变对象天然是线程安全的,无需同步机制。
- 性能优化:解释器可以对字符串进行各种优化(如字符串interning)。
# 字符串internings1 = "Python"s2 = "Python"print(s1 is s2) # True(相同的字符串字面值指向同一对象)# 字典键要求可哈希d = {"key": "value"}d[(1, 2, 3)] = "tuple"# 元组可哈希,可作为键d[[1, 2, 3]] = "list"# 错误:列表不可哈希

07 字符串与Unicode
7.1 Python 3的Unicode支持
Python 3默认使用Unicode编码,内部采用UTF-32或类似表示:
# Unicode字符print(len("中")) # 1(不是2)print(ord("中")) # 20013(Unicode码点)print(chr(0x4E2D)) # '中'(从码点转字符)# 表情符号print("") #print(len("")) # 0
7.2 码点与字符
# 获取字符串的码点序列s = "Python中文"codes = [hex(ord(c)) for c in s]print(codes) # ['0x50', '0x79', '0x74', '0x68', '0x6f', '0x6e', '0x4e2d', '0x6587']# 使用转义序列s = "\u4e2d\u6587"# '中文'


08 小结
本文详细介绍了Python字符串的类型特性、表示方法、常用操作以及格式化技巧。字符串作为Python最基本的数据类型之一,其重要性不言而喻。
核心要点回顾:
- 不可变性:字符串一旦创建不可修改,任何修改操作都会生成新字符串。
- 多种表示:单引号、双引号、三引号、原始字符串各有适用场景。
- 丰富方法:大小写转换、查找替换、分割连接等方法满足各种需求。
- 格式化方式:从百分号格式化到f-string,Python提供了多种格式化选择。
