Python 3 教程

Python3 数据类型转换

在 Python 3 中,数据类型转换分为隐式转换(Python 自动完成)和显式转换(开发者使用内置函数强制转换)。由于 Python 是强类型语言,它不会像 JavaScript 那样随意进行隐式转换(例如不会把字符串 "1" 和数字 1 自动相加),因此掌握显式转换非常重要。

以下是 Python 3 数据类型转换的全面指南:


1. 数字与字符串的转换

这是最常见的转换场景。

纯文本
plaintext
# 1. 数字 -> 字符串 (str)
num = 100
print(str(num) + " apples")  # 输出: "100 apples"
print(str(3.14))             # 输出: "3.14"

# 2. 字符串 -> 整数 (int)
print(int("42"))             # 输出: 42
print(int("-10"))            # 输出: -10

# 3. 字符串 -> 浮点数 (float)
print(float("3.14"))         # 输出: 3.14
print(float("1e3"))          # 输出: 1000.0 (支持科学计数法)

# ⚠️ 常见陷阱:不能直接将包含小数点的字符串转为 int
# int("3.14")  # 会报错: ValueError: invalid literal for int() with base 10: '3.14'
# 正确做法:先转 float,再转 int
print(int(float("3.14")))    # 输出: 3 (注意:是向下截断,不是四舍五入)

2. 数字类型之间的转换

纯文本
plaintext
# 1. 浮点数 -> 整数 (int)
# 注意:int() 转换浮点数时是直接“截断”小数部分,而不是四舍五入
print(int(3.9))   # 输出: 3
print(int(-3.9))  # 输出: -3
# 如果需要四舍五入,请使用 round()
print(round(3.9)) # 输出: 4

# 2. 整数 -> 浮点数 (float)
print(float(5))   # 输出: 5.0

# 3. 数字 -> 布尔值 (bool)
# 0 和 0.0 转换为 False,其他所有数字转换为 True
print(bool(0))    # False
print(bool(1))    # True
print(bool(-5))   # True

3. 容器(序列)类型之间的转换

列表 (list)、元组 (tuple) 和集合 (set) 之间可以相互转换。字符串也可以被视为字符的序列进行转换。

纯文本
plaintext
# 1. 字符串 -> 列表/元组/集合
text = "hello"
print(list(text))   # ['h', 'e', 'l', 'l', 'o']
print(tuple(text))  # ('h', 'e', 'l', 'l', 'o')
print(set(text))    # {'h', 'e', 'l', 'o'} (自动去重且无序)

# 2. 列表 <-> 元组 <-> 集合
my_list = [1, 2, 2, 3]
my_tuple = tuple(my_list)  # (1, 2, 2, 3)
my_set = set(my_list)      # {1, 2, 3} (常用于列表快速去重)
back_to_list = list(my_set)# [1, 2, 3]

# 3. 转换为字典 (dict)
# 方法 A:包含双元素元组/列表的序列
pairs = [("a", 1), ("b", 2)]
print(dict(pairs))  # {'a': 1, 'b': 2}

# 方法 B:使用 zip 函数合并两个列表
keys = ["name", "age"]
values = ["Alice", 25]
print(dict(zip(keys, values)))  # {'name': 'Alice', 'age': 25}

# 方法 C:关键字参数 (键必须是合法的标识符/字符串)
print(dict(name="Bob", age=30)) # {'name': 'Bob', 'age': 30}

4. 布尔值转换 (Truth Value Testing) 🌟

在 Python 中,任何对象都可以被转换为布尔值。理解哪些值被视为 False 是写出 “Pythonic”(地道)代码的关键。

以下所有值转换为 bool 时均为 False

  • 常量:None, False
  • 数字零:0, 0.0, 0j (复数零)
  • 空序列/集合:"" (空字符串), [] (空列表), () (空元组), {} (空字典), set() (空集合)

除此之外的所有值,转换为 bool 均为 True

纯文本
plaintext
# 实际应用:在 if 语句中直接判断,而不是写 if len(my_list) > 0:
my_list = []
if not my_list:  # 空列表被视为 False,not False 即为 True
    print("列表为空")

name = ""
if name:
    print("名字不为空")
else:
    print("名字为空") # 会执行这一行

5. 字符串与复杂数据结构的转换 (进阶)

有时我们需要将形如 "[1, 2, 3]""{'a': 1}"字符串转换回真实的列表或字典。

纯文本
plaintext
import json
import ast

json_str = '["apple", "banana"]'
dict_str = "{'name': 'Alice', 'age': 25}" # 注意:标准 JSON 要求双引号,这是 Python 字典格式的字符串

# ❌ 危险做法:使用 eval()
# eval(dict_str)  # 虽然能工作,但如果字符串来自用户输入,会导致严重的安全漏洞 (代码注入)

# ✅ 推荐做法 1:使用 ast.literal_eval (安全地评估 Python 字面量)
safe_dict = ast.literal_eval(dict_str)
print(type(safe_dict))  # <class 'dict'>
print(safe_dict['name']) # 'Alice'

# ✅ 推荐做法 2:使用 json 模块 (适用于标准 JSON 格式字符串)
# 注意:JSON 字符串中的键和字符串值必须使用双引号 " "
valid_json_str = '{"name": "Alice", "age": 25}'
data = json.loads(valid_json_str)
print(type(data))       # <class 'dict'>

6. 隐式类型转换 (自动转换)

在某些数学运算中,Python 会自动将“较低”的类型提升为“较高”的类型,以避免数据丢失。
优先级大致为:bool < int < float < complex

纯文本
plaintext
# int 和 float 运算,int 自动转为 float
result = 5 + 2.5
print(result)      # 7.5
print(type(result))# <class 'float'>

# bool 参与数学运算时,True=1, False=0
print(True + 3)    # 4

💡 核心避坑总结

  1. int("3.14") 会报错:必须先用 float("3.14") 转换,再用 int() 截断。
  2. int() 是截断不是四舍五入int(3.99) 结果是 3。需要四舍五入请用 round(3.99)
  3. 空字典的表示{} 创建的是空字典,如果要创建空集合,必须使用 set()
  4. list() 转换字符串list("abc") 会变成 ['a', 'b', 'c']。如果你想把整个字符串作为列表的一个元素,应该写成 ["abc"]

如果你对某种特定的转换场景(例如:时间字符串转 datetime 对象,或者字节 bytes 与字符串的转换)有疑问,可以随时告诉我!

发表回复

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