在 Python 程序中,数据都有自己的类型。
例如:
这里:
不同类型的数据能做的事情不同。
例如:
输出:
第一行是数字加法,第二行是字符串拼接。
再看:
这段代码会出错,因为 input() 得到的是字符串,而 18 是整数,字符串不能直接和整数比较大小。
正确写法是:
age = int(input("请输入年龄:"))这里的 int() 就是把字符串转换成整数。
所以,学习类型转换与构造函数,可以帮助学生解决这些问题:
int()、float()、str() 这些看起来像函数的东西到底是什么?
类型转换,指的是把一个数据从一种类型转换成另一种类型。
通俗地说:
类型转换就是给数据“换一种形式”。
例如,把字符串 "18" 转换成整数 18:
输出:
再比如,把整数 18 转换成字符串 "18":
输出:
注意:
屏幕上看到的内容可能一样,但类型可能不同。
输出看起来都是:
但它们的类型不同。
输出:
构造函数是用来创建对象的函数。
在 Python 基础语法中,很多类型名本身就可以像函数一样调用,用来创建对应类型的数据。
例如:
这些都可以看作常见内置类型的构造函数。
例如:
这里:
在基础教学中,可以先这样理解:
构造函数就是用来“造出某种类型数据”的工具。
类型转换和构造函数关系很密切。
很多时候,我们说“类型转换”,实际就是在调用某个类型的构造函数。
例如:
既可以说:
也可以说:
再比如:
既可以理解为:
也可以理解为:
也可以换种思维:
Python 基础阶段常见的类型转换和构造函数如下:
| | |
|---|
int() | | int("18") |
float() | | float("3.14") |
str() | | str(100) |
bool() | | bool(1) |
list() | | list("abc") |
tuple() | | tuple([1, 2, 3]) |
set() | | set([1, 1, 2]) |
dict() | | dict(name="小明", age=18) |
学习类型转换时,经常需要查看转换前后的类型。
可以使用 type()。
输出:
这说明:
type() 很适合演示,可以看清楚“看起来一样”和“类型一样”不是一回事。
隐式类型转换指的是 Python 自动完成的类型转换。
例如,整数和浮点数一起计算时,Python 通常会自动把结果变成浮点数。
输出:
这里:
是整数。
是浮点数。
它们相加后,结果是浮点数。
再如:
输出:
即使 10 / 2 能整除,普通除法 / 的结果也是浮点数。
显式类型转换指的是程序员主动调用构造函数进行转换。
例如:
显式转换的好处是清楚、可控。
例如,处理用户输入时,我们通常需要显式转换:
age = int(input("请输入年龄:"))因为 input() 得到的永远是字符串。
int() 用来创建整数对象,也常用于把其他数据转换成整数。
输出:
不传参数时,int() 会创建整数 0。
输出:
注意:
字符串内容必须是合法整数。
正确:
错误:
这些都会报错。
输出:
注意:
int() 转换浮点数时,不是四舍五入,而是去掉小数部分。
如果需要四舍五入,可以使用 round()。
输出:
提醒:
int() 还可以把指定进制的字符串转换成十进制整数。
输出:
说明:
int("1010", 2) 表示把二进制字符串 "1010" 转成十进制整数。int("12", 8) 表示把八进制字符串 "12" 转成十进制整数。int("A", 16) 表示把十六进制字符串 "A" 转成十进制整数。这部分可以作为扩展内容,不需要初学时讲太深。
最常见应用是处理整数输入。
age = int(input("请输入年龄:"))计算两个整数的和:
a = int(input("请输入第一个整数:"))b = int(input("请输入第二个整数:"))
float() 用来创建浮点数对象,也常用于把其他数据转换成浮点数。
输出:
输出:
也可以转换整数形式的字符串:
输出:
错误示例:
这会报错,因为 "abc" 不是合法数字。
输出:
输入商品价格:
price = float(input("请输入商品单价:"))count = int(input("请输入购买数量:"))print(f"总价是{total:.2f}元")输入身高体重:
height = float(input("请输入身高,单位米:"))weight = float(input("请输入体重,单位千克:"))bmi = weight / (height ** 2)
str() 用来创建字符串对象,也常用于把其他数据转换成字符串。
输出中第一行是空白,因为 str() 得到的是空字符串 ""。
输出:
常见场景:字符串拼接。
输出:
更推荐使用 f-string:
print(str({"name": "小明"}))输出:
str() 会尽量把对象转换成适合人阅读的字符串形式。
基础阶段可以简单了解:
repr() 更偏向给开发者看,通常更接近对象的代码形式。例子:
输出类似:
bool() 用来创建布尔值。
布尔值只有两个:
输出:
输出:
规则:
输出:
注意:
结果是 True,因为 "False" 是一个非空字符串。
结果也是 True,因为 "0" 也是非空字符串。
判断字符串内容是否表示 yes 或 no,应该自己写判断逻辑。
answer = input("是否继续?请输入 yes 或 no:").strip().lower()
print(bool({"name": "小明"}))输出:
规则:
容器包括列表、元组、字典、集合等。
输出:
判断列表是否为空:
这里 if students: 本质上就是根据列表转换成布尔值后的结果来判断。
判断字符串是否为空:
name = input("请输入姓名:").strip()
list() 用来创建列表对象,也可以把可迭代对象转换成列表。
可迭代对象可以简单理解为:
可以一个一个取出元素的对象。
例如:
输出:
输出:
['P', 'y', 't', 'h', 'o', 'n']注意:
list("Python") 会把字符串拆成一个个字符。
如果想把一整段字符串作为列表中的一个元素,应该写:
输出:
numbers_tuple = (1, 2, 3)numbers_list = list(numbers_tuple)输出:
这在需要修改数据时很常见,因为元组不能修改,列表可以修改。
numbers = list(range(1, 6))输出:
student = {"name": "小明", "age": 18}输出:
注意:
字典直接转列表时,得到的是字典的键。
如果想得到值:
print(list(student.values()))输出:
如果想得到键值对:
print(list(student.items()))输出:
[('name', '小明'), ('age', 18)]
tuple() 用来创建元组对象,也可以把其他可迭代对象转换成元组。
输出:
numbers_tuple = tuple(numbers)输出:
元组不能修改,所以适合保存不希望被改变的数据。
输出:
这是元组教学中的重点坑。
输出:
如果直接写字面量,单元素元组必须带逗号:
输出:
如果写成:
它不是元组,而是整数。
set() 用来创建集合对象。
集合的特点:
输出:
注意:
空集合必须用 set() 创建。
输出:
空大括号 {} 表示空字典,不是空集合。
numbers = [1, 2, 2, 3, 3, 3]unique_numbers = set(numbers)输出可能是:
集合会自动去掉重复元素。
如果需要再转回列表:
unique_list = list(set(numbers))注意:
集合不保证原来的顺序,所以转回列表后的顺序不一定和原来一样。
输出可能是:
重复字符会被去掉,顺序也不固定。
判断是否有重复数据:
names = ["小明", "小红", "小明"]iflen(names) == len(set(names)):解释:
dict() 用来创建字典对象。
字典用于保存键值对数据。
输出:
student = dict(name="小明", age=18, score=95)输出:
{'name': '小明', 'age': 18, 'score': 95}注意:
这种写法中,键名要符合变量名规则。
例如可以写:
但不能直接写:
dict("student-name"="小明")这种写法是错误的。
如果键名包含特殊字符,可以使用普通字典写法:
student = {"student-name": "小明"}
pairs = [("name", "小明"), ("age", 18), ("score", 95)]输出:
{'name': '小明', 'age': 18, 'score': 95}这里 pairs 中的每个元素都是一个长度为 2 的元组。
第一个值作为键,第二个值作为值。
keys = ["name", "age", "score"]student = dict(zip(keys, values))输出:
{'name': '小明', 'age': 18, 'score': 95}这适合把两个列表组合成一个字典。
错误示例:
这会报错,因为 dict() 需要的是一组键值对,而不是普通字符串列表。
正确写法:
dict([("name", "小明"), ("age", 18)])
复数不是基础阶段最常用的类型,但可以作为了解。
complex() 用来创建复数。
输出:
这里 1 是实部,2 是虚部。
也可以把字符串转换成复数:
输出:
基础教学中,知道有这个类型即可,不需要深入讲复数运算。
input() 是学习类型转换时最重要的场景。
无论用户输入什么,input() 得到的都是字符串。
即使用户输入:
类型仍然是:
age = int(input("请输入年龄:"))
height = float(input("请输入身高:"))
分步写法:
a, b = input("请输入两个整数,用空格分隔:").split()简写:
a, b = map(int, input("请输入两个整数,用空格分隔:").split())对于初学者,建议先讲分步写法,再讲 map()。
不要直接使用:
is_continue = bool(input("是否继续?"))因为只要用户输入非空字符串,结果就是 True。
例如用户输入 "no",bool("no") 也是 True。
推荐:
answer = input("是否继续?请输入 yes 或 no:").strip().lower()也可以写得更简洁:
answer = input("是否继续?请输入 yes 或 no:").strip().lower()is_continue = answer == "yes"
不是所有数据都能成功转换。
例如:
会报错。
也会报错。
常见错误是 ValueError。
如果只判断正整数,可以使用 isdigit()。
text = input("请输入年龄:").strip()注意:
isdigit() 适合判断普通正整数。
例如:
结果是 True。
但是:
结果都是 False。
所以它不能完整判断负数或小数。
2. 使用 try...except 处理转换错误更通用的方式是使用异常处理。
age = int(input("请输入年龄:"))这段代码的意思是:
如果转换失败,就输出错误提示,而不是让程序直接崩溃。基础阶段可以先让学生知道有这种写法,等讲异常处理时再深入。
list()、tuple()、set() 经常用于容器之间的转换。
常见转换:
list("abc") # ['a', 'b', 'c']tuple([1, 2, 3]) # (1, 2, 3)list(range(3)) # [0, 1, 2]可以简单总结:
如果一个对象可以被一个一个取出元素,它通常就可以传给 list()、tuple()、set()。
numbers_list = [1, 2, 2, 3]numbers_tuple = tuple(numbers_list)numbers_set = set(numbers_list)输出可能是:
说明:
列表转集合:
items = ["A", "B", "A", "C"]可能输出:
注意:
所以不能在需要保留顺序和重复数据的场景中随便转成集合。
创建对象有两种常见方式:
字面量就是直接写出数据本身。
这种写法简单直观,是最常见的写法。
student = dict(name="小明")构造函数更适合:
创建空列表:
两者都可以。
创建空字典:
两者都可以。
创建空集合:
注意,空集合不能写成 {},因为 {} 是空字典。
前面讲的 int()、str()、list() 等,是 Python 内置类型的构造函数。
以后学习面向对象时,也会遇到自定义类的构造函数。
例如:
def__init__(self, name, age):student = Student("小明", 18)这里:
是在创建一个 Student 对象。
而:
def__init__(self, name, age):是对象创建时用来初始化数据的方法。
基础阶段可以先简单理解:
也就是说,构造函数的核心作用是“创建对象”。
即使用户输入 18,age 也是字符串 "18"。
需要计算或比较大小时,要转换:
age = int(input("请输入年龄:"))
错误:
如果字符串是小数形式,要先用 float():
如果确实想再转整数:
number = int(float("3.14"))输出:
注意,这会去掉小数部分。
输出:
如果要四舍五入:
输出:
输出:
原因:
非空字符串转布尔值都是 True。
所以不能用 bool() 直接理解字符串内容的真假含义。
输出:
如果想得到包含整个字符串的列表,要写:
输出:
items = ["A", "B", "A", "C"]输出顺序不一定固定。
所以如果既要去重又要保留顺序,不能简单依赖 set()。
可以使用:
items = ["A", "B", "A", "C"]if item notin unique_items: unique_items.append(item)输出:
错误:
正确:
dict([("name", "小明"), ("age", 18)])
numbers_list = list(numbers)输出:
list(numbers) 会创建一个新的列表,不会把原来的元组本身变成列表。
| | |
|---|
| input() | |
int("abc") | | |
int("3.14") | "3.14" | |
int(3.9) | int() | |
bool("False") | | |
list("abc") | | |
{} | | |
dict(["name", "age"]) | dict() | |
set() | | |
name = input("请输入学生姓名:").strip()age = int(input("请输入学生年龄:"))score = float(input("请输入学生成绩:"))print(f"姓名:{student['name']}")print(f"年龄:{student['age']}")print(f"成绩:{student['score']:.2f}")这段代码中用到了:
可以引导学生分析:
请把字符串 "100" 转换成整数,并输出它的类型。
参考答案:
请让用户输入两个整数,输出它们的和。
参考答案:
a = int(input("请输入第一个整数:"))b = int(input("请输入第二个整数:"))
请让用户输入商品单价和数量,计算总价,保留两位小数。
参考答案:
price = float(input("请输入商品单价:"))count = int(input("请输入购买数量:"))print(f"总价是{total:.2f}元")
请判断下面代码的输出。
参考答案:
给定列表:
numbers = [1, 2, 2, 3, 3, 3]请分别把它转换成元组和集合。
参考答案:
numbers = [1, 2, 2, 3, 3, 3]numbers_tuple = tuple(numbers)numbers_set = set(numbers)
请把字符串 "Python" 转换成列表。
参考答案:
输出:
['P', 'y', 't', 'h', 'o', 'n']
请使用 dict() 创建一个学生字典,包含姓名、年龄和成绩。
参考答案:
student = dict(name="小明", age=18, score=95)
下面代码有什么问题?请改正。
参考答案:
问题是 input() 得到的是字符串,不能直接和整数 18 比较。
正确写法:
age = int(input("请输入年龄:"))
请让用户输入年龄,如果输入的不是整数,提示“输入错误”。
参考答案:
age = int(input("请输入年龄:"))
给定列表:
items = ["A", "B", "A", "C", "B"]请去重,并保留原来的第一次出现顺序。
参考答案:
items = ["A", "B", "A", "C", "B"]if item notin unique_items: unique_items.append(item)输出:
类型转换是把一种类型的数据转换成另一种类型。
构造函数是创建某种类型对象的函数。
在 Python 基础语法中,很多类型名本身就可以作为构造函数使用。
重点掌握:
int() 用来创建整数,常用于把数字字符串转换成整数。float() 用来创建浮点数,常用于处理小数输入。str() 用来创建字符串,常用于把数字转换成文本。bool() 用来创建布尔值,但非空字符串都会转成 True。list() 用来创建列表,可以把字符串、元组、range 等转换成列表。tuple() 用来创建元组,适合保存不希望修改的数据。set() 用来创建集合,可以去重,但不保证顺序。input() 得到的一定是字符串,需要计算时要先转换。一句话概括:
类型转换解决“数据形式不合适”的问题,构造函数负责“创建某种类型的数据”。