类型转换是编写代码时非常高频的操作,里面存在大量容易出错的细节陷阱,学习结束之后欢迎在评论区留下你的测试代码、疑问,大家一起交流学习!
一、课程前言
前面课程我们已经学习整数、浮点数、字符串、布尔、列表、元组、字典、集合等基础数据类型。
在实际开发过程中,经常需要改变变量的数据类型,例如:输入框接收的内容默认是字符串,无法直接进行加减运算,就需要转为数字。
Python 的类型转换分为隐式自动转换、显式强制转换两大类,本节课完整讲解全部内置转换函数、代码案例以及高频易错细节。
二、基础概念讲解
1. 隐式类型转换(自动转换)
Python 会在运算的时候,自动把低精度的数据转向高精度类型,避免数据丢失,全程不需要手动调用函数。
转换优先级:布尔 → 整数 → 浮点数 → 复数
a = 10 # int整型b = 2.5 # float浮点数res = a + bprint(type(res)) # <class 'float'>,int自动转为浮点print(True + 5) # True等价数值1,结果等于6
注意:字符串和数字之间无法自动转换,相加直接抛出报错,必须手动强制转换。
2. 显式(强制)类型转换
开发者调用系统内置函数,手动将一个数据转为别的类型;
强制转换只会生成一份全新的数据,不会修改原来的变量。
3. 全部内置转换函数总览表
函数 | 功能说明 |
int(x, [base]) | 转为整数,base可以设置进制 |
float(x) | 转为浮点数 |
complex(real, [imag]) | 生成复数 |
str(x) | 转为普通字符串 |
repr(x) | 转为程序可识别的表达式字符串 |
eval(字符串) | 解析并且运行字符串内部的Python表达式 |
tuple(s) | 序列转为元组 |
list(s) | 序列转为列表 |
set(s) | 转为可变集合 |
dict(s) | 嵌套键‑值序列生成字典 |
frozenset(s) | 生成不可变冻结集合 |
chr(数字) | Unicode编码转为对应字符 |
ord(字符) | 单个字符转为Unicode编码数值 |
hex(整数) | 转为十六进制字符串,前缀0x |
oct(整数) | 转为八进制字符串,前缀0o |
bin(整数) | 转为二进制字符串,前缀0b |
注:Python3 已经取消 long() 长整型,整数类型统一为 int。
三、分模块代码案例、使用规则和坑点
(一)数值类转换 int()、float()、complex()
1、int() 整型转换
语法:int(待转换数据, base=进制)
# 浮点数转整数:直接截断小数,不会四舍五入print(int(3.9)) # 输出3print(int(-2.6)) # 输出‑2# 纯数字字符串转整数print(int("123"))# base参数,按照指定进制解析字符串print(int("1101",2)) # 将二进制1101转十进制13
高频坑点
1. int("12.5") 直接报错,带小数点的字符串不能直接转为int;需要先float再int
2. 文字、符号类字符串无法转为数字
2、float() 浮点转换
print(float(6)) # 6.0print(float("3.14"))print(float(True)) # 1.0print(float(False)) # 0.0
3、complex()复数
print(complex(3,5)) # 3+5jprint(complex("2+4j"))
(二)字符串相关 str()、repr()、eval()
1. str():面向普通人阅读的字符串格式,所有类型都能够转换成字符串
print(str(123))print(str([1,2,3]))print(str(True))
2. repr():面向编译器,可以还原出原始对象
text = "hello"print(str(text)) # helloprint(repr(text)) # 'hello',自带引号标记
3. eval() 执行字符串里面的代码
print(eval("1 + 8 * 2"))print(eval("[1,2,3]")) # 字符串列表转为真实列表
安全提醒:不要执行用户随意输入的eval代码,容易引发安全风险。
(三)序列容器互相转换 list、tuple、set、frozenset
# 字符串转列表print(list("python"))# 列表转元组print(tuple([10,20,30]))# 列表转集合(自动去重)print(set([1,1,2,2]))# 普通集合转为不可变冻结集合fs = frozenset([5,6,7])# fs.add(9) 冻结集合无法增删元素# 创建字典,传入成对嵌套序列print(dict([("name","小李"),("age",18)]))
(四)字符与编码 chr()、ord(),二者互为反向函数
# 编码数字转为字符print(chr(65)) # Aprint(chr(97)) # aprint(chr(9731)) # 雪花特殊符号# 单个字符转为Unicode编码print(ord("A")) #65
(五)进制转换 bin、oct、hex
输出结果为带前缀的字符串:0b二进制、0o八进制、0x十六进制
print(bin(10)) # '0b1010'print(oct(10)) # '0o12'print(hex(255)) # '0xff'
四、布尔转换 bool() 重点规则
下面所有数值经过 bool() 判断结果均为False,其余全部为True
1. 数字:0、0.0、0j
2. 空容器:""、[]、()、{}、空集合
3. None、False
print(bool(0))print(bool(""))print(bool([]))print(bool(-66)) # 非零数字Trueprint(bool("文字")) # 非空字符串True
五、全套特殊知识点 & 高频踩坑清单
1. 强制转换生成新对象,原变量不会改动
num = 3.8int(num)print(num) # 依旧等于3.8,原数据不变
2. 浮点数转整数直接舍弃小数,不进行四舍五入,需要四舍五入使用round()
3. 带小数点的字符串不能直接int转换
# 错误写法 int("5.6")# 正确写法print(int(float("5.6")))
4. 加号不能直接拼接字符串和数字
# print(10 + "20") 报错print(str(10)+"20")print(10 + int("20"))
5. set转换列表会自动清除重复元素,同时打乱原有顺序
6. frozenset属于只读集合,不能添加、删除元素,可以用来当做字典的键
7. str()适合展示给用户;repr()用于调试、还原代码对象
8. input函数接收的所有用户输入永远为字符串类型,做运算必须手动转换
六、课后练习题(共3题)
习题1(基础题)
现有字符串 s = "66.88",编写代码将它先转为浮点数,之后再转为整数。
习题2(易错题)
写出下面代码运行结果,并解释原因
print(int(5.99))print(bool("0"))print(bool(""))
习题3(综合实操)
接收字符串表达式 str_res = "3 + 7 * 2",利用eval函数计算表达式结果;再将最终结果转为字符串类型进行输出。
类型转换坑点很多,进制转换、eval、字符串转数字都是新手常出错的地方,如果代码报错或是知识点存在疑惑,可以在评论区留言,一起解决问题!