国庆节10月1日
--


Python3 隐式类型转换和显式类型转换的方法

有时候,我们需要对数据内置的类型进行转换,数据类型的转换,一般情况下你只需要将数据类型作为函数名即可。
Python 数据类型转换可以分为两种:
在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要我们去干预。
以下实例中,我们对两种不同类型的数据进行运算,较低数据类型(整数)就会转换为较高数据类型(浮点数)以避免数据丢失。
1num_int = 1232num_flo = 1.233
4num_new = num_int + num_flo5
6print("num_int 数据类型为:",type(num_int))7print("num_flo 数据类型为:",type(num_flo))8
9print("num_new 值为:",num_new)10print("num_new 数据类型为:",type(num_new))以上实例输出结果为:
1num_int 数据类型为: <class 'int'>2num_flo 数据类型为: <class 'float'>3num_new: 值为: 124.234num_new 数据类型为: <class 'float'>代码解析:
num_int 和 num_flo 进行相加运算,并存储在变量 num_new 中。num_int 是 整型(integer) , num_flo 是 浮点型(float) 。num_new 是 浮点型(float) ,这是因为 Python 会将较小的数据类型转换为较大的数据类型,以避免数据丢失。我们再看一个实例,整型数据与字符串类型的数据进行相加:
1num_int = 1232num_str = "456"3
4print("num_int 数据类型为:",type(num_int))5print("num_str 数据类型为:",type(num_str))6
7print(num_int+num_str)以上实例输出结果为:
1num_int 数据类型为: <class 'int'>2num_str 数据类型为: <class 'str'>3Traceback (most recent call last):4 File "/runoob-test/test.py", line 7, in <module>5 print(num_int+num_str)6TypeError: unsupported operand type(s) for +: 'int' and 'str'从输出中可以看出,整型和字符串类型运算结果会报错,输出 TypeError。 Python 在这种情况下无法使用隐式转换。
但是,Python 为这些类型的情况提供了一种解决方案,称为显式转换。
在显式类型转换中,用户将对象的数据类型转换为所需的数据类型。 我们使用 int()、float()、str() 等预定义函数来执行显式类型转换。
int() 强制转换为整型:
1x = int(1) # x 输出结果为 12y = int(2.8) # y 输出结果为 23z = int("3") # z 输出结果为 3float() 强制转换为浮点型:
1x = float(1) # x 输出结果为 1.02y = float(2.8) # y 输出结果为 2.83z = float("3") # z 输出结果为 3.04w = float("4.2") # w 输出结果为 4.2str() 强制转换为字符串类型:
1x = str("s1") # x 输出结果为 's1'2y = str(2) # y 输出结果为 '2'3z = str(3.0) # z 输出结果为 '3.0'整型和字符串类型进行运算,就可以用强制类型转换来完成:
1num_int = 1232num_str = "456"3
4print("num_int 数据类型为:", type(num_int))5print("类型转换前,num_str 数据类型为:", type(num_str))6
7num_str = int(num_str) # 强制转换为整型8print("类型转换后,num_str 数据类型为:", type(num_str))9
10num_sum = num_int + num_str11
12print("num_int 与 num_str 相加结果为:", num_sum)13print("sum 数据类型为:", type(num_sum))以上实例输出结果为:
1num_int 数据类型为: <class 'int'>2类型转换前,num_str 数据类型为: <class 'str'>3类型转换后,num_str 数据类型为: <class 'int'>4num_int 与 num_str 相加结果为: 5795sum 数据类型为: <class 'int'>以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
| 函数 | 描述 |
|---|---|
| int(x [,base]) | 将x转换为一个整数 |
| float(x) | 将x转换到一个浮点数 |
| complex(real [,imag]) | 创建一个复数 |
| str(x) | 将对象 x 转换为字符串 |
| repr(x) | 将对象 x 转换为表达式字符串 |
| eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
| tuple(s) | 将序列 s 转换为一个元组 |
| list(s) | 将序列 s 转换为一个列表 |
| set(s) | 转换为可变集合 |
| dict(d) | 创建一个字典。d 必须是一个 (key, value)元组序列。 |
| frozenset(s) | 转换为不可变集合 |
| chr(x) | 将一个整数转换为一个字符 |
| ord(x) | 将一个字符转换为它的整数值 |
| hex(x) | 将一个整数转换为一个十六进制字符串 |
| oct(x) | 将一个整数转换为一个八进制字符串 |
| bool(x) | 将对象 x 转换为布尔值(True 或 False) |
| bytes([source[, encoding[, errors]]]) | 将对象转换为不可变字节序列 |
| bytearray([source[, encoding[, errors]]]) | 将对象转换为可变字节数组 |
| memoryview(obj) | 返回给定参数的内存视图对象(不复制数据) |
| bin(x) | 将一个整数转换为一个二进制字符串 |
| ascii(x) | 返回对象的 ASCII 表示,非 ASCII 字符会被转义 |
int + float → float),避免数据丢失;数字直接加字符串则会报 TypeError,Python 不会偷偷替你转目标类型(值),常用的有 int()、float()、str()、bool()int(x):int(2.8) 得 2(小数部分直接截断,不是四舍五入)、int("123") 得 123;但 int("3.14") 会报 ValueError——字符串得是纯整数写法,带小数点要先 float() 再 int()float(x):float(1) 得 1.0、float("3.14") 得 3.14、float("100") 得 100.0,整数字符串也能直接转str(x):任何类型都能转(str(123)、str(3.14)、str(True));只有转成字符串之后,才能用 + 和别的字符串拼接bool(x):0、0.0、""、[]、{}、None 这些”空/零”的值都是 False,其余为 True;注意非空字符串 "0"、"False" 也是 Truelist(s) 转列表、tuple(s) 转元组、set(s) 转集合;字符串会被拆成一个个字符,集合本身无序,转成列表/元组的顺序不保证set() 顺带去重:set([1, 2, 2, 3, 3, 3]) 得 {1, 2, 3},set("aabbbccc") 得 {'a', 'b', 'c'}dict():用键值对序列创建,如 dict([("name", "小明"), ("age", 18)]) 得 {'name': '小明', 'age': 18}chr(65) 得 'A'、ord('A') 得 65;hex(255) 得 '0xff'、oct(8) 得 '0o10'、bin() 同理;另外 eval("3 + 5 * 2") 得 13(把字符串当表达式算),repr(3.14) 得 '3.14' 2-1 隐式类型转换
创建文件 test_implicit.py,完成以下操作:
a = 10(整数)和 b = 3.14(浮点数)c = a + btype() 打印 a、b、c 的类型c 是浮点数批改(2026-09-28):✅ 正确(
a、b、c类型实测<class 'int'> <class 'float'> <class 'float'>;注释里也答出了”自动把整数转成浮点数,避免数据丢失”)。
一级 · 思路:两种不同类型直接相加时,Python 会自动往更宽的类型上靠,这一步不需要你写任何转换代码;用查看类型的函数逐个验证就行
二级 · 方法:两个变量直接用 + 相加;查看类型用内置函数 type(x)
三级 · 骨架:c = a ____ b / print(f"c = {c}, 类型: {____(c)}")
1# 2-12a = 103b = 3.144c = a + b5
6print(f"a = {a}, 类型: {type(a)}")7print(f"b = {b}, 类型: {type(b)}")8print(f"c = {c}, 类型: {type(c)}")9# 输出:10# a = 10, 类型: <class 'int'>11# b = 3.14, 类型: <class 'float'>12# c = 13.14, 类型: <class 'float'>13# 解释:Python 会自动将整数转换为浮点数,避免数据丢失 2-2 整数转换
创建文件 test_int.py,完成以下操作:
3.14 转换为整数"123" 转换为整数"3.14" 转换为整数(观察是否报错)批改(2026-09-28):⚠️
int(3.14)=3、int("123")=123、int(float("3.14"))=3 都对;但int("3.14")那行被注释掉了,没有实际跑出报错(去掉注释会得到ValueError: invalid literal for int() with base 10: '3.14'),另外print(a,b,d)只打了值、没打印类型(题面要求”打印每个结果及其类型”)。
一级 · 思路:转整数就是把值交给”整数类型函数”;小数会直接被切掉小数部分,字符串里带小数点这个函数不认,会报错
二级 · 方法:int(x) 转整数;int(2.8) 截断成 2;字符串要先 float("3.14") 转成 3.14 再 int()
三级 · 骨架:a = ____(3.14) / b = int("____") / c = int(____("3.14"))
1# 2-22a = int(3.14)3b = int("123")4# c = int("3.14") # 这行会报错,因为不能直接将小数字符串转为整数5
6print(f"int(3.14) = {a}, 类型: {type(a)}") # 3, <class 'int'>7print(f"int('123') = {b}, 类型: {type(b)}") # 123, <class 'int'>8# 如果要转换 "3.14",需要先转为 float 再转 int:9c = int(float("3.14"))10print(f"int(float('3.14')) = {c}") # 3 2-3 浮点数转换
创建文件 test_float.py,完成以下操作:
100 转换为浮点数"3.14" 转换为浮点数"100" 转换为浮点数批改(2026-09-28):⚠️ 第 3 项题面是
float("100")(字符串),你写成了c = float(100)(整数),虽然结果都是 100.0,但没测到”字符串转浮点”这个点;另外print(a, b, c)只打印了值、没有打印类型(题面要求”打印每个结果及其类型”)。
一级 · 思路:转浮点也是”类型函数”套路,整数和小数字符串都能收;整数转出来会补上 .0
二级 · 方法:float(x);float(100) → 100.0、float("3.14") → 3.14、float("100") → 100.0
三级 · 骨架:a = ____(100) / b = float("3.14") / c = float("____")
1# 2-32a = float(100)3b = float("3.14")4c = float("100")5
6print(f"float(100) = {a}, 类型: {type(a)}") # 100.0, <class 'float'>7print(f"float('3.14') = {b}, 类型: {type(b)}") # 3.14, <class 'float'>8print(f"float('100') = {c}, 类型: {type(c)}") # 100.0, <class 'float'> 2-4 字符串转换
创建文件 test_str.py,完成以下操作:
123 转换为字符串3.14 转换为字符串True 转换为字符串+ 拼接字符串批改(2026-09-28):✅ 正确(输出
123 <class 'str'> 3.14 <class 'str'> True <class 'str'>,用+拼接得到1233.14True)。
一级 · 思路:任何类型都能变成字符串,转完类型都是字符串;只有都变成字符串之后,才能用加号拼接
二级 · 方法:str(x) 转字符串;转换后 a + b 得到拼接结果
三级 · 骨架:a = ____(123) / print(f"拼接: 数字是 {____}")
1# 2-42a = str(123)3b = str(3.14)4c = str(True)5
6print(f"str(123) = '{a}', 类型: {type(a)}") # '123', <class 'str'>7print(f"str(3.14) = '{b}', 类型: {type(b)}") # '3.14', <class 'str'>8print(f"str(True) = '{c}', 类型: {type(c)}") # 'True', <class 'str'>9print(f"拼接: 数字是 {a}") # 拼接: 数字是 123 2-5 布尔值转换
创建文件 test_bool.py,测试下列值的真假,记录哪些是 True,哪些是 False:
0、1、-1""、"0"、"False"[]、[0]None批改(2026-09-28):⚠️ 缺
bool("0")、bool("False")、bool([0])三个测试点,而且第 2 项写的是bool(False)(测的是布尔值 False,不是字符串"False");已测的 0/1/-1/""/[]/None 输出False True True False False False都对,补上的三项应都是True。
一级 · 思路:“空”和”零”一律是假,有内容一律是真;字符串要看有没有字符,容器要看有没有元素——哪怕里面装的是 0 或 False,只要非空就是真
二级 · 方法:bool(x) 转布尔;数字看是否为 0、字符串看是否为空串、列表看是否为空
三级 · 骨架:print(f"bool('') = {____('')}") / print(f"bool([0]) = {bool([____])}")
1# 2-52print(f"bool(0) = {bool(0)}") # False3print(f"bool(1) = {bool(1)}") # True4print(f"bool(-1) = {bool(-1)}") # True5print(f"bool('') = {bool('')}") # False6print(f"bool('0') = {bool('0')}") # True(非空字符串)7print(f"bool('False') = {bool('False')}") # True(非空字符串)8print(f"bool([]) = {bool([])}") # False9print(f"bool([0]) = {bool([0])}") # True(非空列表)10print(f"bool(None) = {bool(None)}") # False 2-6 转列表
创建文件 test_list.py,完成以下操作:
"hello" 转换为列表(1, 2, 3) 转换为列表{3, 1, 2} 转换为列表(观察顺序)批改(2026-09-28):✅ 正确(
['h', 'e', 'l', 'l', 'o']、[1, 2, 3]、[1, 2, 3];集合是无序的,本次正好按 1、2、3 输出)。
一级 · 思路:把别的可迭代对象整个搬进列表;字符串会被拆成一个个字符,集合本来无序、顺序看运气
二级 · 方法:list(s);list("hello") → ['h', 'e', 'l', 'l', 'o']、list((1, 2, 3)) → [1, 2, 3]
三级 · 骨架:a = ____("hello") / b = list((1, 2, 3)) / c = list({3, 1, 2})
1# 2-62a = list("hello")3b = list((1, 2, 3))4c = list({3, 1, 2})5
6print(f"list('hello') = {a}") # ['h', 'e', 'l', 'l', 'o']7print(f"list((1,2,3)) = {b}") # [1, 2, 3]8print(f"list({3,1,2}) = {c}") # 顺序可能不同,因为集合是无序的 2-7 转元组
创建文件 test_tuple.py,完成以下操作:
"Python" 转换为元组[10, 20, 30] 转换为元组批改(2026-09-28):⚠️ 题面是字符串
"Python",你写成了小写"python",输出首字母变成'p'(('p', 'y', 't', 'h', 'o', 'n'));tuple([10, 20, 30])得(10, 20, 30)、类型<class 'tuple'>都对。
一级 · 思路:跟转列表一个套路,只是换了个目标类型;字符串照样会被拆成一个个字符
二级 · 方法:tuple(s);tuple("Python") → ('P', 'y', 't', 'h', 'o', 'n')
三级 · 骨架:a = ____("Python") / b = tuple([10, 20, ____])
1# 2-72a = tuple("Python")3b = tuple([10, 20, 30])4
5print(f"tuple('Python') = {a}") # ('P', 'y', 't', 'h', 'o', 'n')6print(f"tuple([10,20,30]) = {b}") # (10, 20, 30)7print(f"类型: {type(b)}") # <class 'tuple'> 2-8 转集合
创建文件 test_set.py,完成以下操作:
[1, 2, 2, 3, 3, 3] 转换为集合(观察去重效果)"aabbbccc" 转换为集合批改(2026-09-28):⚠️ 第 1 项题面是
[1, 2, 2, 3, 3, 3],你写成了[1, 2, 4, 2, 3, 3, 3](多一个 4),输出{1, 2, 3, 4}(应为{1, 2, 3});第 2 项字符串也写成"aaabbbccc"(多一个 a),去重结果{'a', 'b', 'c'}不受影响。
一级 · 思路:转成集合会自动去掉重复元素,转换过程本身就是一次去重
二级 · 方法:set(s);set([1, 2, 2, 3, 3, 3]) → {1, 2, 3}、set("aabbbccc") → {'a', 'b', 'c'}
三级 · 骨架:a = ____([1, 2, 2, 3, 3, 3]) / b = set("____")
1# 2-82a = set([1, 2, 2, 3, 3, 3])3b = set("aabbbccc")4
5print(f"set([1,2,2,3,3,3]) = {a}") # {1, 2, 3}(自动去重)6print(f"set('aabbbccc') = {b}") # {'a', 'b', 'c'}(自动去重) 2-9 转字典
创建文件 test_dict.py,完成以下操作:
[("name", "小明"), ("age", 18)]{x: x**2 for x in range(1, 5)}批改(2026-09-28):✅ 正确(
dict()创建{'name': '小明', 'age': 18}、推导式得{1: 1, 2: 4, 3: 9, 4: 16})。
一级 · 思路:从”键值对”出发建字典——要么给一串 (键, 值) 小元组,要么用字典推导式一行生成
二级 · 方法:dict([("name", "小明"), ("age", 18)]);推导式 {x: x**2 for x in range(1, 5)}
三级 · 骨架:a = ____([("name", "小明"), ("age", 18)]) / b = {x: x**2 for x in ____(1, 5)}
1# 2-92a = dict([("name", "小明"), ("age", 18)])3b = {x: x**2 for x in range(1, 5)}4
5print(f"dict() 创建: {a}") # {'name': '小明', 'age': 18}6print(f"推导式创建: {b}") # {1: 1, 2: 4, 3: 9, 4: 16} 2-10 表达式求值与字符串表示
创建文件 test_eval.py,完成以下操作:
"3 + 5 * 2" 当作表达式计算,得到它的结果3.14 转成它的表达式字符串形式批改(2026-09-28):✅ 正确(
eval("3+5*2")得13 <class 'int'>,repr(3.14)得3.14 <class 'str'>,值和类型都对)。
一级 · 思路:一个是”把字符串当代码算”,一个是”把值变成能写进代码的字符串”;后者转出来的类型是字符串
二级 · 方法:eval("3 + 5 * 2") → 13;repr(3.14) → '3.14'
三级 · 骨架:a = ____("3 + 5 * 2") / b = ____(3.14)
1# 2-102a = eval("3 + 5 * 2")3b = repr(3.14)4
5print(f"eval('3 + 5 * 2') = {a}") # 136print(f"类型: {type(a)}") # <class 'int'>7print(f"repr(3.14) = {b}") # '3.14'8print(f"类型: {type(b)}") # <class 'str'> 2-11 数字与字符互转
创建文件 test_char.py,完成以下操作:
65、97、48 转换成对应的字符'A'、'a'、'0' 转换成对应的数字批改(2026-09-28):✅ 正确(
chr(65/97/48)输出A/a/0,ord("a"/"A"/"0")输出97/65/48,六项都对)。
一级 · 思路:字符和它的编码数字是一一对应的,两个方向各有一个函数;65 是 'A'、97 是 'a'、48 是 '0'
二级 · 方法:数字转字符 chr(65) → 'A';字符转数字 ord('A') → 65
三级 · 骨架:print(f"chr(65) = {____(65)}") / print(f"ord('A') = {____('A')}")
1# 2-112print(f"chr(65) = {chr(65)}") # A3print(f"chr(97) = {chr(97)}") # a4print(f"chr(48) = {chr(48)}") # 05
6print(f"ord('A') = {ord('A')}") # 657print(f"ord('a') = {ord('a')}") # 978print(f"ord('0') = {ord('0')}") # 48 2-12 进制字符串转换
创建文件 test_hex.py,完成以下操作:
255、16、10 转换成十六进制字符串8、16、255 转换成八进制字符串批改(2026-09-28):✅ 正确(
hex输出0xff/0x10/0xa,oct输出0o10/0o20/0o377,六项都对)。
一级 · 思路:转出来的带前缀标记进制(0x 是十六进制、0o 是八进制),结果类型是字符串
二级 · 方法:hex(255) → '0xff';oct(8) → '0o10'
三级 · 骨架:print(f"hex(255) = {____(255)}") / print(f"oct(8) = {____(8)}")
1# 2-122print(f"hex(255) = {hex(255)}") # 0xff3print(f"hex(16) = {hex(16)}") # 0x104print(f"hex(10) = {hex(10)}") # 0xa5
6print(f"oct(8) = {oct(8)}") # 0o107print(f"oct(16) = {oct(16)}") # 0o208print(f"oct(255) = {oct(255)}") # 0o377如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"生活不是等待暴风雨过去,而是学会在雨中跳舞。"—— 塞维涅夫人


