Python str 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨 Python 的 str 函数,该函数将对象转换为字符串表示形式。我们将介绍基本转换、自定义字符串表示形式、格式化和实践示例。
基本定义
str 函数返回对象的字符串版本。对于大多数对象,它会调用 __str__ 方法。如果不可用,它会退回到 __repr__。
主要特征:创建人类可读的字符串,处理所有 Python 类型,支持自定义字符串表示形式,并在 print() 和字符串格式化中隐式使用。
基本类型转换
以下是使用不同 Python 类型的简单用法,展示了 str 如何将数字、布尔值和其他基本类型转换为字符串。
# With numbers
print(str(42)) # '42'
print(str(3.14)) # '3.14'
# With booleans
print(str(True)) # 'True'
print(str(False)) # 'False'
# With None
print(str(None)) # 'None'
# With strings (no change)
print(str("hello")) # 'hello'
此示例显示 str 将基本 Python 类型转换为其字符串表示形式。数字变为其数字字符串,布尔值变为“True”/“False”,None 变为“None”。
请注意,将字符串传递给 str 会返回相同的字符串,因为它已经是字符串。
自定义对象字符串表示
您可以通过实现 __str__ 方法来定义对象如何转换为字符串。此示例创建一个 Person 类。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name='{self.name}', age={self.age})"
def __repr__(self):
return f"Person('{self.name}', {self.age})"
p = Person("Alice", 30)
print(str(p)) # Person(name='Alice', age=30)
print(p) # Same as above (print calls str implicitly)
Person 类实现 __str__ 以返回格式化的字符串。当我们在 Person 实例上调用 str 时,Python 会使用此方法。
__repr__ 方法提供了一个替代表示形式,当 __str__ 不可用时或在 REPL 中使用。
使用 str 进行字符串格式化
str 函数与字符串格式化配合使用以创建动态字符串。此示例显示了各种格式化技术。
# Old-style formatting
print("Value: %s" % str(42)) # Value: 42
# str.format()
print("Value: {}".format(str(3.14))) # Value: 3.14
# f-strings (Python 3.6+)
value = True
print(f"Value: {str(value)}") # Value: True
# Formatting with conversion
print(f"Value: {42!s}") # Value: 42 (!s calls str)
这些示例演示了 str 如何与 Python 的字符串格式化系统集成。f-字符串中的 !s 转换说明符显式调用 str。
格式化会自动在值上调用 str,但在某些情况下,显式转换可以使代码更清晰。
使用 str 进行文件操作
文件操作通常使用 str 在写入之前转换数据。此示例显示了使用字符串转换读取和写入文件。
# Writing different types to a file
data = [42, 3.14, True, "hello", None]
with open("data.txt", "w") as f:
for item in data:
f.write(str(item) + "\n") # Convert each item to string
# Reading back
with open("data.txt", "r") as f:
for line in f:
print(line.strip()) # Already strings when reading
此示例通过首先将各种 Python 类型转换为字符串来将它们写入文件。文件操作需要字符串(或字节),因此对于非字符串数据,转换是必要的。
当读回时,数据已经采用字符串形式,尽管您可能需要将其解析回原始类型。
错误处理
虽然 str 几乎适用于所有 Python 对象,但了解其在边缘情况下的行为非常重要。
class BadStr:
def __str__(self):
return 42 # Should return string!
try:
print(str(BadStr()))
except TypeError as e:
print(f"Error: {e}") # __str__ returned non-string (type int)
# Default behavior when no __str__ is defined
class NoStr:
pass
print(str(NoStr())) # Uses __repr__ as fallback
这些示例演示了 str 对有问题的对象的行为。 __str__ 必须返回一个字符串,否则会引发 TypeError。
当未定义 __str__ 时,Python 会退回到 __repr__,所有对象都应该具有该方法。
最佳实践
- 实现 __str__: 对于自定义类,以提供可读的输出
- 包含 __repr__: 作为后备和用于调试
- 首选 f-字符串: 用于现代字符串格式化
- 处理编码: 使用 str.encode() 进行字节转换
- 文档行为: 清楚地记录字符串表示形式
资料来源
作者
列出所有 Python 教程。