04 python 数据类型转换

22 阅读10分钟

在开发过程中,我们需要对数据内置的类型进行转换,数据类型的转换,一般情况下你只需要将数据类型作为函数名即可。

Python 数据类型转换可以分为两种:

  • 隐式类型转换 - 自动完成
  • 显式类型转换 - 需要使用类型函数来转换 -在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要我们去干预。 转换规则:
  • 较低数据类型(整数)就会转换为较高数据类型(浮点数)以避免数据丢失。

数值类型相加

以下实例中:

num_init = 123
num_flo = 1.23

num_new = num_init + num_flo

print("num_init 数据类型为:",type(num_init)) # num_init 数据类型为: <class 'int'>
print("num_flo 数据类型为:",type(num_flo)) # num_init 数据类型为: <class 'float'>

print("num_new 值为:",num_new) # num_new 值为: 123.23
print("num_new 数据类型为:",type(num_new)) # num_new 数据类型为: <class 'float'>

代码解析:

  • 实例中我们对两个不同数据类型的变量 num_int 和 num_flo 进行相加运算,并存储在变量 num_new 中。
  • 然后查看三个变量的数据类型。
  • 在输出结果中,我们看到 num_int 是 整型(integer) , num_flo 是 浮点型(float)
  • 同样,新的变量 num_new 是 浮点型(float),这是因为 Python 会将较小的数据类型转换为较大的数据类型,以避免数据丢失。

整型数据与字符串类型的数据进行相加

num_init = 123
num_str = "1.23"

print("num_init 数据类型为:",type(num_init)) # num_init 数据类型为: <class 'int'>
print("num_str 数据类型为:",type(num_str)) # num_str 数据类型为: <class 'str'>

print("num_new 值为:",num_init + num_str) 
#   File "c:\Users\13538\Desktop\Kimi_Agent_政务大屏可视化\py\0306.py", line 94, in <module>
#     print("num_new 值为:",num_init + num_str) # num_new 值为: 124.23
#                           ~~~~~~~~~^~~~~~~~~
# TypeError: unsupported operand type(s) for +: 'int' and 'str'

从输出中可以看出,整型和字符串类型运算结果会报错,输出 TypeError。 Python 在这种情况下无法使用隐式转换。

如果想要正常计算,Python 为这些类型的情况提供了一种解决方案,称为显式转换。

显式类型转换 在显式类型转换中,用户将对象的数据类型转换为所需的数据类型。 我们使用 int()、float()、str() 等预定义函数来执行显式类型转换。

int() 强制转换为整型:

x = int(1)   # x 输出结果为 1  
y = int(2.8# y 输出结果为 2  
z = int("3"# z 输出结果为 3

float() 强制转换为浮点型:

x = float(1)     # x 输出结果为 1.0
y = float(2.8)   # y 输出结果为 2.8
z = float("3")   # z 输出结果为 3.0
w = float("4.2") # w 输出结果为 4.2

str() 强制转换为字符串类型:

x = str("s1") # x 输出结果为 's1'
y = str(2)    # y 输出结果为 '2'
z = str(3.0)  # z 输出结果为 '3.0'

整型和字符串类型进行运算,就可以用强制类型转换来完成:

num_int = 123
num_str = "456"

print("num_int 数据类型为:",type(num_int))
print("类型转换前,num_str 数据类型为:",type(num_str))

num_str = int(num_str)    # 强制转换为整型
print("类型转换后,num_str 数据类型为:",type(num_str))

num_sum = num_int + num_str

print("num_int 与 num_str 相加结果为:",num_sum)
print("sum 数据类型为:",type(num_sum))

输出结果为:

num_int 数据类型为: <class 'int'>
类型转换前,num_str 数据类型为: <class 'str'>
类型转换后,num_str 数据类型为: <class 'int'>
num_int 与 num_str 相加结果为: 579
sum 数据类型为: <class 'int'>

以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。

函数 函数核心作用详细用法场景使用局限 / 注意事项
int(x [,base])将 x 转换为一个整数1. 字符串转十进制整数(如用户输入的数字字符串 "123" 转可计算的整数);2. 浮点数截断小数(如 int(9.9) 取整为 9);3. 进制转换(如 int("1010",2) 转二进制为十进制);4. 布尔值转整数(int(True) → 1,用于计数)。1. 非数字字符串(如 "abc")、带小数点的字符串(如 "123.45")转换报错;2. 浮点数转换是 “截断” 而非四舍五入;3. base 参数仅对字符串有效,数字指定 base 会报错;4. 超出整数范围(Python 无严格限制,但极端值会占用大量内存)。
float(x)将 x 转换为一个浮点数1. 整数转浮点数(如 float(123) → 123.0,适配小数运算);2. 数字字符串转浮点数(如用户输入的 "3.14" 转可计算的浮点数);3. 科学计数法字符串转换(如 float("1.23e5") → 123000.0)。1. 非数字字符串(如 "xyz")转换报错;2. 浮点数存在精度问题(如 0.1+0.2≠0.3);3. 超大 / 超小数值可能转为 inf(无穷大)或 nan(非数字)。
complex(real [,imag])创建一个复数1. 科学计算(如电路分析、傅里叶变换);2. 数学方程求解(如二次方程判别式小于 0 时的根);3. 自定义复数(如 complex(3,4) → 3+4j)。1. 日常业务开发极少用到;2. 实部 / 虚部最终均为浮点型,无法保留整数类型;3. 复数运算仅支持基础代数运算,高级操作需依赖 cmath 库。
str(x)将对象 x 转换为字符串1. 数据展示(如 str(123) 转字符串用于界面输出);2. 拼接不同类型数据(如 "年龄:"+str(18));3. 自定义对象转字符串(重写 __str__ 方法定制格式)。1. 转换结果是 “易读形式”,不可直接执行(如 str(123)"123",无引号);2. 部分对象(如函数、类)转换结果为内存地址,无实际业务意义。
repr(x)将对象 x 转换为表达式字符串1. 代码调试(如 repr("abc")"'abc'",带引号可直接复制执行);2. 记录对象原始信息(如日志中保存变量的精确值);3. 自定义对象调试(重写 __repr__ 方法)。1. 结果适合开发者查看,不适合展示给普通用户;2. 部分对象的 repr 结果和 str 一致(如整数、浮点数)。
eval(str)计算字符串中的有效 Python 表达式,并返回结果对象1. 动态执行简单表达式(如 eval("1+2*3") → 7);2. 解析配置文件中的简单表达式(如配置文件存 "3.14*r*r",动态计算圆面积);3. 把字符串格式的列表 / 字典(如 "[1,2,3]")转回原类型。1. 极高安全风险:执行未知来源的字符串(如用户输入的 "os.system('rm -rf /')")会导致系统被攻击;2. 仅能执行表达式,无法执行语句(如 eval("if 1>0: print(1)") 报错);3. 性能低于直接编写代码,大量使用会降低程序效率。
tuple(s)将序列 s 转换为一个元组1. 数据不可变保护(如把列表转元组,防止意外修改);2. 作为字典的 key(列表不可作为 key,元组可);3. 函数多返回值(本质是元组,如 a,b = (1,2));4. 解包操作(如 *tuple([1,2,3]) 展开序列)。1. 元组不可变,无法增删改元素(如需修改需转列表);2. 转换非序列对象(如 tuple(123))报错,需先转为可迭代对象;3. 空序列转换为空元组 (),无实际数据意义。
list(s)将序列 s 转换为一个列表1. 增删改查数据(如把元组 / 字符串转列表,添加元素);2. 字符串拆分为字符列表(如 list("abc")['a','b','c']);3. 迭代器 / 生成器转列表(如 list(range(5))[0,1,2,3,4]);4. 集合转列表(解决集合无序、不可索引的问题)。1. 列表可变,占用内存比元组略多;2. 非可迭代对象(如 list(None))转换报错;3. 字典转列表仅获取 key(如 list({"a":1})['a']),需用 items() 取键值对。
set(s)将序列 s 转换为可变集合1. 数据去重(如 set([1,2,2,3]){1,2,3});2. 集合运算(如求交集 set1&set2、并集 `set1set2、差集 set1-set2);<br>3. 快速判断元素是否存在(x in setx in list` 效率高)。1. 集合无序,不支持索引 / 切片(如 set([1,2])[0] 报错);2. 元素必须是不可变类型(列表、字典不能作为集合元素);3. 重复元素会被自动删除,需确认业务是否允许去重。
dict(d)创建一个字典1. 键值对数据存储(如用户信息 {"name":"张三","age":18});2. 元组序列转字典(如 dict([("a",1),("b",2)]));3. 快速映射查询(如通过 key 取 value,比列表遍历效率高)。1. key 必须是不可变类型(字符串、数字、元组),列表 / 集合不能作为 key;2. d 非 (key,value) 元组序列时报错(如 dict([1,2,3]) 报错);3. 重复 key 会被覆盖(如 dict([("a",1),("a",2)]){"a":2})。
frozenset(s)将序列 s 转换为不可变集合1. 作为字典的 key(普通 set 不可,frozenset 可);2. 作为集合的元素(普通 set 不能包含另一个 set,但可包含 frozenset);3. 数据不可变保护(防止集合被意外修改)。1. 不可增删元素,如需修改需先转为普通 set;2. 不支持索引 / 切片,仅支持集合运算;3. 日常开发使用频率远低于普通 set。
chr(x)将一个整数转换为对应的字符1. 生成指定 Unicode 字符(如 chr(65) → "A",chr(20013) → "中");2. 字符批量生成(如循环生成字母 / 数字);3. 编码转换(整数编码转可视化字符)。1. x 必须是有效的 Unicode 编码值(0-0x10FFFF),超出范围报错;2. 仅能转换单个字符,多字符需循环;3. 部分编码对应不可见字符(如 chr(0) 为空字符)。
ord(x)将一个字符转换为对应的 Unicode 整数值1. 字符转编码(如 ord("A") → 65,用于字符排序、比对);2. 验证字符类型(如判断 ord(x) 是否在字母 / 数字编码区间);3. 自定义字符映射规则。1. x 必须是单个字符(如 ord("ab") 报错);2. 非字符类型(如数字、列表)转换报错;3. 不同编码(如 GBK)的字符,Unicode 值不代表原编码值。
hex(x)将一个整数转换为十六进制字符串1. 进制转换(如编程中的内存地址、颜色值表示);2. 硬件 / 网络开发(如十六进制协议解析);3. 数据压缩展示(十六进制比十进制更简短)。1. 仅支持整数转换,浮点数 / 字符串转换报错;2. 结果以 0x 开头(如 hex(255)"0xff"),如需去掉前缀需切片(hex(255)[2:]);3. 负数转换结果带负号(如 hex(-10)"-0xa")。
oct(x)将一个整数转换为八进制字符串1. 进制转换(如文件权限、底层编程中的八进制表示);2. 传统系统数据解析(部分老旧系统用八进制存储数据)。1. 仅支持整数转换,非整数报错;2. 结果以 0o 开头(如 oct(8)"0o10"),需手动去除前缀;3. 日常开发使用频率极低,仅特定场景(如 Linux 权限配置)有用。

总结

  1. 用法场景核心

    • 基础类型转换(int/float/str/repr):适配用户输入处理、数据计算、展示调试;
    • 序列 / 集合转换(list/tuple/set/dict):适配数据存储、去重、查询、不可变保护;
    • 编码 / 进制转换(chr/ord/hex/oct):适配字符处理、底层 / 科学计算;
    • 特殊转换(complex/eval/frozenset):适配专业场景(科学计算、动态执行、数据保护)。
  2. 使用局限关键

    • 类型匹配:非目标类型(如非数字字符串转 int)大概率报错;
    • 不可变 / 可变:元组 /frozenset 不可改,列表 /set/dict 可改,需按业务选择;
    • 安全 / 性能:eval 有安全风险,浮点数有精度问题,集合 / 字典查询效率高于列表。