当前位置:首页>python>Python 3 入门与进阶(三):Python基本数据类型(下)——字符串类型

Python 3 入门与进阶(三):Python基本数据类型(下)——字符串类型

  • 2026-08-27 00:51:00
Python 3 入门与进阶(三):Python基本数据类型(下)——字符串类型

大家好,我是煜道。

今天我们一起来学习 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 转义字符

转义字符以反斜杠(\)开头,用于表示无法直接输入的字符:

转义字符
说明
\n
换行
\t
水平制表符
\
反斜杠
'
单引号
"
双引号
\r
回车
\b
退格
\0
空字符
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 不可变性的意义

不可变性带来以下优点:

  1. 线程安全:不可变对象天然是线程安全的,无需同步机制。
  2. 性能优化:解释器可以对字符串进行各种优化(如字符串interning)。
  3. 安全可靠:防止意外修改,提高代码可预测性。
  4. 哈希值稳定:字典的键必须可哈希,可变对象不适合。
# 字符串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最基本的数据类型之一,其重要性不言而喻。

核心要点回顾:

  1. 不可变性:字符串一旦创建不可修改,任何修改操作都会生成新字符串。
  2. 序列特性:支持索引、切片等序列操作。
  3. 多种表示:单引号、双引号、三引号、原始字符串各有适用场景。
  4. 丰富方法:大小写转换、查找替换、分割连接等方法满足各种需求。
  5. 格式化方式:从百分号格式化到f-string,Python提供了多种格式化选择。

最新文章

随机文章