Python的数据类型大家族
就像我们在生活中需要不同的容器来存放不同的物品,Python也有不同的数据类型来存储不同种类的数据。Python作为一种动态类型语言,其类型系统在运行时进行类型检查,每个对象都携带类型信息。让我们来认识这个大家族:
1. 基础数据类型
数字家族
# 整数 (int):用于存储整数,Python中整数精度不受限制,可表示任意大小的整数
age = 16
student_count = 42
print(f"年龄:{age},学生数量:{student_count}")
# 浮点数 (float):用于存储小数,基于IEEE 754标准的双精度浮点表示
height = 1.75
weight = 62.5
print(f"身高:{height}米,体重:{weight}千克")
年龄:16,学生数量:42
身高:1.75米,体重:62.5千克
文本家族
# 字符串 (str):用于存储文本,在Python中是不可变(immutable)序列类型
name = "Tom"
message = "Hello, Python!"
print(f"姓名:{name}")
print(f"消息:{message}")
# 多行字符串,内部使用Unicode编码表示字符
description = """
这是一个多行字符串
可以写很多行
就像写作文一样
"""
print(description)
姓名:Tom
消息:Hello, Python!
这是一个多行字符串
可以写很多行
就像写作文一样
逻辑家族
# 布尔值 (bool):只有True和False两种值,bool是int的子类
# 在内存中True表示为1,False表示为0
is_student = True
has_passed = False
print(f"是学生吗?{is_student}")
print(f"及格了吗?{has_passed}")
2. 复合数据类型
列表 (list):可以修改的有序集合
# 存储一组成绩,列表在内部实现为动态数组,支持O(1)时间复杂度的索引访问
scores = [95, 92, 88]
print(f"成绩列表:{scores}")
# 存储一组名字,列表是可变(mutable)对象,可存储不同类型的元素
names = ["Tom", "Jerry", "Spike"]
print(f"名字列表:{names}")
# 可以添加新元素,append操作的平均时间复杂度为O(1)
scores.append(90)
print(f"添加新成绩后:{scores}")
成绩列表:[95, 92, 88]
名字列表:['Tom', 'Jerry', 'Spike']
添加新成绩后:[95, 92, 88, 90]
元组 (tuple):不可修改的有序集合
# 存储坐标点,元组是不可变(immutable)序列,创建后无法修改
point = (3, 4)
print(f"坐标点:{point}")
# 存储RGB颜色值,元组比列表占用更少的内存,访问速度更快
rgb = (255, 128, 0)
print(f"颜色值:{rgb}")
坐标点:(3, 4)
颜色值:(255, 128, 0)
字典 (dict):存储配对信息
# 存储学生信息,字典在内部实现为哈希表(hash table),提供O(1)平均查找时间
student = {
"name": "Tom", # 键(key)必须是不可变(immutable)类型
"age": 16,
"scores": [95, 92, 88] # 值(value)可以是任意类型
}
print(f"学生姓名:{student['name']}")
print(f"学生年龄:{student['age']}")
print(f"学生成绩:{student['scores']}")
学生姓名:Tom
学生年龄:16
学生成绩:[95, 92, 88]
集合 (set):存储不重复的元素
# 存储独特的数字,集合也基于哈希表实现,成员检测的平均时间复杂度为O(1)
unique_numbers = {1, 2, 3, 2, 1} # 重复的会被自动去除
print(f"不重复的数字:{unique_numbers}")
# 存储班级里的爱好,集合元素必须是可哈希(hashable)的,即不可变类型
hobbies = {"篮球", "编程", "画画", "篮球"} # 重复的"篮球"会被去除
print(f"班级爱好:{hobbies}")
不重复的数字:{1, 2, 3}
班级爱好:{'编程', '画画', '篮球'}
💡 生活中的类比
- 列表就像是一个可以随时添加或删除物品的购物袋
- 元组就像是一个密封的包裹,一旦封装就不能改变
- 字典就像是一个通讯录,每个名字都对应一个电话号码
- 集合就像是一个俱乐部的会员名单,每个人只能出现一次
3. 特殊类型
日期和时间 (datetime)
from datetime import datetime
# 获取当前时间
now = datetime.now()
print(f"现在是:{now}")
print(f"年份:{now.year}")
print(f"月份:{now.month}")
print(f"日期:{now.day}")
现在是:2025-03-28 09:54:57.021467
年份:2025
月份:3
日期:28
🌟 小贴士
- 使用
type()
函数可以查看任何数据的类型
- 不同类型的数据有不同的操作方法
- 选择合适的数据类型可以让程序更高效
- 复合数据类型可以组合使用,比如列表中存储字典
动手练习
试试看:
- 创建一个列表,存储你最喜欢的5个数字
- 创建一个字典,存储你的个人信息(姓名、年龄、爱好等)
- 创建一个集合,存储班级里同学的爱好
- 使用datetime显示你的生日
类型转换:数据类型的”变身术”
有时候我们需要把一种类型的数据转换成另一种类型,就像把温度从摄氏度转换成华氏度一样。Python作为动态类型语言,提供了显式类型转换(explicit type conversion)或类型强制(type coercion)的机制:
1. 数字之间的转换
# 小数转整数,截断转换(truncation),时间复杂度O(1)
price = 19.99
price_int = int(price) # 去掉小数部分,不进行四舍五入
print(f"价格 {price} 转成整数:{price_int}")
# 整数转小数,精确转换,时间复杂度O(1)
count = 5
count_float = float(count) # 在内存中创建新的浮点数对象
print(f"数量 {count} 转成小数:{count_float}")
价格 19.99 转成整数:19
数量 5 转成小数:5.0
2. 字符串与数字的转换
# 字符串转数字,涉及字符串解析,时间复杂度O(n),其中n为字符串长度
score_str = "85.5"
score_float = float(score_str) # 转成小数,需要字符串符合浮点数格式
score_int = int(float(score_str)) # 转成整数,需要先转为浮点数再截断
print(f"分数字符串 '{score_str}':")
print(f"- 转成小数:{score_float}")
print(f"- 转成整数:{score_int}")
# 数字转字符串,创建新的字符串对象,时间复杂度与数字位数相关
number = 42
text = str(number) # 创建新的不可变字符串对象
print(f"\n数字 {number} 转成字符串:'{text}'")
分数字符串 '85.5':
- 转成小数:85.5
- 转成整数:85
数字 42 转成字符串:'42'
3. 安全的类型转换
def safe_convert_to_int(value):
"""安全地将值转换为整数"""
try:
# 异常处理机制(exception handling)捕获类型转换错误
return int(float(value))
except (ValueError, TypeError):
# 捕获ValueError(无效格式)和TypeError(不兼容类型)异常
print(f"无法将 '{value}' 转换为整数")
return None # 返回None表示空值
# 测试不同的转换情况
values = ["42", "3.14", "hello", "98.6", ""]
print("安全转换测试:")
for value in values:
result = safe_convert_to_int(value)
if result is not None: # 使用身份比较检查是否为None
print(f"'{value}' 转换成功:{result}")
安全转换测试:
'42' 转换成功:42
'3.14' 转换成功:3
无法将 'hello' 转换为整数
'98.6' 转换成功:98
无法将 '' 转换为整数
4. 列表、元组和集合之间的转换
# 创建一个列表
numbers = [1, 2, 2, 3, 3, 4]
print(f"原始列表:{numbers}")
# 转换成集合(去重),时间复杂度O(n),需要遍历整个列表并计算哈希值
unique_numbers = set(numbers) # 集合构造器创建新的集合对象
print(f"转换成集合(去重):{unique_numbers}")
# 转换成元组,时间复杂度O(n),需要复制所有元素
number_tuple = tuple(numbers) # 元组构造器创建新的不可变序列
print(f"转换成元组:{number_tuple}")
# 集合转回列表,时间复杂度O(n),集合是无序的,转换后的列表顺序可能与原列表不同
unique_list = list(unique_numbers) # 列表构造器创建新的可变序列
print(f"集合转回列表:{unique_list}")
原始列表:[1, 2, 2, 3, 3, 4]
转换成集合(去重):{1, 2, 3, 4}
转换成元组:(1, 2, 2, 3, 3, 4)
集合转回列表:[1, 2, 3, 4]
💡 类型转换的注意事项
- 不是所有转换都能成功,要做好错误处理
- 数字字符串(如”123”,“3.14”)可以转换成数字,但需符合目标类型的语法规则
- 小数转整数会去掉小数部分(截断),不进行四舍五入,这是确定性行为
- 转换前最好检查数据是否合适,可以使用isinstance()函数进行类型检查
- 在处理用户输入时,类型转换特别重要,应当实现输入验证(input validation)