04 python 数据类型转换

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

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

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

数值类型相加

以下实例中:

py 复制代码
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_intnum_flo 进行相加运算,并存储在变量 num_new 中。
  • 然后查看三个变量的数据类型。
  • 在输出结果中,我们看到 num_int整型(integer)num_flo浮点型(float)
  • 同样,新的变量 num_new浮点型(float),这是因为 Python 会将较小的数据类型转换为较大的数据类型,以避免数据丢失。

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

py 复制代码
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() 强制转换为整型:

py 复制代码
x = int(1)   # x 输出结果为 1  
y = int(2.8) # y 输出结果为 2  
z = int("3") # z 输出结果为 3

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

py 复制代码
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() 强制转换为字符串类型:

py 复制代码
x = str("s1") # x 输出结果为 's1'
y = str(2)    # y 输出结果为 '2'
z = str(3.0)  # z 输出结果为 '3.0'

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

py 复制代码
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))

输出结果为:

python 复制代码
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、并集 `set1 set2、差集 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 有安全风险,浮点数有精度问题,集合 / 字典查询效率高于列表。
相关推荐
IT_陈寒1 小时前
Python开发者都在偷偷用的5个高效技巧,你竟然还不知道?
前端·人工智能·后端
kevinzeng1 小时前
mysql和redis数据一致性的策略
后端
小码哥_常1 小时前
一文搞懂双Token、SSO与第三方权限打通,附实战代码
后端
SimonKing1 小时前
5分钟学会!把代码从本地推送到 GitHub,就是这么简单
java·后端·程序员
灵境空间1 小时前
企业微信 AI 机器人 PHP SDK —— 免回调地址,三行代码接入,支持流式回复
后端
陈随易1 小时前
Vite 8正式发布,内置devtool,Wasm SSR 支持
前端·后端·程序员
CodeSheep2 小时前
首个OpenClaw龙虾大模型排行榜来了,国产AI霸榜了!
前端·后端·程序员
Moment2 小时前
想转 AI 全栈?这些 Agent 开发面试题你能答出来吗
前端·后端·面试
parafeeee10 小时前
程序人生-Hello’s P2P
数据库·后端·asp.net