我有个朋友最近在学Python,他问我一个问题:
"整数、浮点数、字符串这些我能理解,但列表、元组、字典、集合到底是干嘛用的?为什么要分这么多种?"
我想了想,跟他说:"你整理过书房吗?"
他愣了一下:"整理过啊,把书分类放。"
"那就是了。整数、浮点数这些是'书',列表、字典这些是'书架'。书的种类有限,但书架的设计各有不同——有的按顺序排列,有的可以随意抽放,有的带标签分类。"
他恍然大悟:"原来如此!"
今天我们就用这个"书和书架"的比喻,把Python里的基础数据类型和容器数据类型一次性说清楚。
基础数据类型就像是单本书。每一本都有自己的特点和用途。
整数就是不带小数点的数:-2、0、42、999。
age = 25
count = -3
year = 2024整数在Python里没有大小限制。你可以写一个1000位的整数,Python照样能处理(虽然会慢一点)。
huge = 10 ** 100 # 1后面100个0,完全没问题什么时候用它? 计数、索引、循环次数、年龄、数量——一切不需要小数的数字。
浮点数就是带小数点的数:3.14、-0.5、2.0。
price = 99.9
pi = 3.1415926
temperature = -5.5需要注意:浮点数在计算机里是近似存储的。0.1 + 0.2 == 0.3 的结果是False,因为0.1+0.2实际上是0.30000000000000004。
print(0.1 + 0.2) # 0.30000000000000004如果要做精确的金额计算,用decimal.Decimal,别用浮点数。
什么时候用它? 价格、测量值、科学计算——一切需要小数的地方。
布尔值只有两个:True和False。
is_login = True
is_admin = False
has_permission = 5 > 3 # True在Python里,布尔值其实是整数(True是1,False是0),但不要依赖这个特性——它会让代码变得难懂。
# 可以这样写,但别这样写
result = True + False # 1什么时候用它? 条件判断、开关控制、标志位——一切需要"是/否"的地方。
字符串就是文本,用引号包起来。
name = "张三"
message = '你好'
multiline = """第一行
第二行
第三行"""字符串的常见操作:
s = "hello world"
print(len(s)) # 11,长度
print(s.upper()) # HELLO WORLD,大写
print(s.split()) # ['hello', 'world'],分割
print(s[0]) # h,取第一个字符
print(s[6:11]) # world,切片字符串在Python里是不可变的——你不能修改字符串里的某个字符,只能创建新字符串。
s = "hello"
# s[0] = "H" # 报错!
s = "H" + s[1:] # 创建新字符串 "Hello"什么时候用它? 所有的文本处理——用户输入、文件内容、数据库字段、API返回数据。
字节是计算机最底层的表示方式,由0到255的数字组成。
b = b"hello" # 直接创建
b = bytes([72, 101]) # 从列表创建,代表"He"字符串和字节之间的转换很常用:
text = "你好"
byte_data = text.encode("utf-8") # 字符串→字节
text_back = byte_data.decode("utf-8") # 字节→字符串什么时候用它? 文件读写(非文本文件)、网络传输、加密解密——一切需要处理二进制数据的地方。
None表示"没有值",相当于其他语言的null或nil。
result = None
data = function_that_might_fail() # 如果失败返回None
if data is None:
print("没有数据")注意:判断是否为None要用is,不要用==。
# 正确
if x is None:
pass
# 不推荐
if x == None:
pass什么时候用它? 表示"无"、"空"、"未初始化"——一个占位符,说明这里暂时没有值。
容器就像书架,用来存放多本书(数据)。不同设计的书架,适合不同场景。
列表是最常用的容器,用方括号表示,有序、可变。
fruits = ["苹果", "香蕉", "橙子"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True] # 可以混放不同类型列表的常见操作:
fruits = ["苹果", "香蕉", "橙子"]
# 增
fruits.append("葡萄") # 末尾添加
fruits.insert(1, "草莓") # 指定位置插入
# 删
fruits.remove("香蕉") # 删除指定元素
last = fruits.pop() # 删除并返回最后一个
# 改
fruits[0] = "芒果" # 修改指定位置
# 查
print(fruits[0]) # 取第一个
print(fruits[-1]) # 取最后一个
print(fruits[1:3]) # 切片,取第1到第2个
# 遍历
for fruit in fruits:
print(fruit)列表推导式(Python的特色写法):
# 传统写法
squares = []
for i in range(10):
squares.append(i**2)
# 列表推导式(更Pythonic)
squares = [i**2 for i in range(10)]
# 带条件
even_squares = [i**2 for i in range(10) if i % 2 == 0]什么时候用列表? 你需要保持顺序、允许重复元素、随时增删改。比如:待办事项列表、排行榜、购物车。
元组用圆括号表示,有序、不可变。
point = (10, 20)
rgb = (255, 0, 128)
person = ("张三", 25, "北京")
single = (5,) # 单个元素必须加逗号元组和列表的区别:元组创建后不能修改。
point = (10, 20)
# point[0] = 5 # 报错!不能修改为什么需要元组?
location = (39.9, 116.4) # 经纬度,不应该被修改
# 元组作为字典键
cache = {}
cache[(1, 2)] = "value" # 合法
# cache[[1, 2]] = "value" # 报错,列表不能当键元组的解包(拆包)很方便:
point = (10, 20)
x, y = point # x=10, y=20
# 交换变量本质上就是元组解包
a, b = b, a什么时候用元组? 数据不需要修改、想保护数据不被意外修改、需要作为字典键。
字典用花括号表示,键值对存储、可变、无序(Python 3.7之后保持插入顺序)。
person = {
"name": "张三",
"age": 25,
"city": "北京"
}
# 或者用dict()创建
person = dict(name="张三", age=25, city="北京")字典的常见操作:
# 增/改
person["job"] = "工程师" # 新增
person["age"] = 26 # 修改
# 删
del person["city"] # 删除键值对
age = person.pop("age") # 删除并返回值
# 查
print(person["name"]) # 取值(键不存在会报错)
print(person.get("name")) # 取值(键不存在返回None)
print(person.get("email", "无")) # 不存在时返回默认值
# 遍历
for key in person:
print(key, person[key])
for key, value in person.items():
print(key, value)字典的键必须是不可变类型(字符串、整数、浮点数、元组),值可以是任意类型。
# 键不可变
d = {
"name": "张三", # 字符串做键 ✅
1: "一", # 整数做键 ✅
(1, 2): "坐标", # 元组做键 ✅
# [1, 2]: "列表" # 列表做键 ❌
}字典推导式:
squares = {i: i**2 for i in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}什么时候用字典? 需要通过键名来查找数据、键值对结构天然匹配你的数据。比如:用户信息(通过用户名查详情)、配置参数(通过参数名查值)。
集合用花括号表示,无序、元素唯一、可变。
fruits = {"苹果", "香蕉", "橙子"}
numbers = {1, 2, 3, 3, 4} # 自动去重,变成{1, 2, 3, 4}集合的核心操作:
s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}
# 增
s1.add(5)
# 删
s1.remove(1) # 删除(不存在会报错)
s1.discard(10) # 删除(不存在不报错)
# 集合运算
print(s1 | s2) # 并集 {1,2,3,4,5,6}
print(s1 & s2) # 交集 {3,4}
print(s1 - s2) # 差集 {1,2}
print(s1 ^ s2) # 对称差集 {1,2,5,6}判断元素是否存在非常快(哈希查找,O(1)复杂度):
huge_list = list(range(1000000))
huge_set = set(huge_list)
# 集合查找速度快得多
print(999999 in huge_set) # 瞬间完成什么时候用集合? 去重、成员关系判断(某个元素是否存在)、集合运算(交集、并集)。
Python提供了内置函数来转换类型:
# 转整数
int("123") # 123
int("12.5") # 报错,字符串必须是纯数字
# 转浮点数
float("3.14") # 3.14
float(5) # 5.0
# 转字符串
str(123) # "123"
str(3.14) # "3.14"
# 转列表
list("hello") # ['h', 'e', 'l', 'l', 'o']
list((1, 2, 3)) # [1, 2, 3]
# 转元组
tuple([1, 2, 3]) # (1, 2, 3)
# 转字典
dict([("a", 1), ("b", 2)]) # {'a': 1, 'b': 2}
# 转集合
set([1, 2, 2, 3]) # {1, 2, 3} 自动去重类型 | 写法 | 有序 | 可变 | 元素唯一 | 用途 |
|---|---|---|---|---|---|
整数 | 42 | - | - | - | 计数、索引 |
浮点数 | 3.14 | - | - | - | 测量、价格 |
布尔值 | True/False | - | - | - | 条件判断 |
字符串 | "hello" | ✅ | ❌ | - | 文本 |
字节 | b"hello" | ✅ | ❌ | - | 二进制数据 |
None | None | - | - | - | 空值占位 |
列表 | [1,2,3] | ✅ | ✅ | ❌ | 有序可变序列 |
元组 | (1,2,3) | ✅ | ❌ | ❌ | 不可变序列 |
字典 | {"a":1} | ✅(3.7+) | ✅ | 键唯一 | 键值对查找 |
集合 | {1,2,3} | ❌ | ✅ | ✅ | 去重、成员判断 |
下次你写代码时,先想清楚数据是什么"书",需要放在哪种"书架"上。选对了容器,代码自然就顺了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。