Python元组完整学习指南¶
1. 什么是元组?想象一下...¶
想象你有一个特殊的珠宝盒!这个盒子有些特别: - 一旦把珠宝放进去,就不能更换或移动了(不可变) - 所有珠宝都按顺序排列,永远不会乱 - 可以随时查看任何位置的珠宝 - 非常安全,因为内容不会被意外修改
在Python中,我们把这个特殊的珠宝盒叫做"元组"(Tuple)!
2. 创建你的第一个元组¶
就像整理珠宝一样简单:
# 创建一个装颜色的元组
colors = ("红色", "蓝色", "绿色")
# 创建一个装数字的元组
numbers = (1, 2, 3, 4, 5)
# 创建只有一个宝石的元组(记得加逗号!)
single_gem = ("钻石",)
# 从其他序列创建元组
list_to_tuple = tuple(["苹果", "香蕉", "橙子"])
3. 如何使用元组?¶
3.1. 看看元组里有什么(访问元素)¶
colors = ("红色", "蓝色", "绿色")
# 看看第一个颜色(记住:计数从0开始!)
first_color = colors[0] # 得到"红色"
last_color = colors[-1] # 得到"绿色"(倒着数第一个)
print(f"第一个颜色是{first_color}!")
3.2. 数一数有多少宝石¶
# 计算元组中的元素个数
number_of_colors = len(colors) # 得到3
print(f"我的珠宝盒里有{number_of_colors}种颜色!")
# 统计某个元素出现的次数
count_red = colors.count("红色") # 统计"红色"出现的次数
3.3. 找找看有没有某个颜色¶
# 检查是否有红色
if "红色" in colors:
print("找到红色啦!")
else:
print("没有红色呢...")
# 查找元素位置
try:
position = colors.index("蓝色") # 得到1
print(f"蓝色在第{position+1}个位置")
except ValueError:
print("找不到这个颜色")
4. 有趣的元组操作¶
4.1. 元组解包(像分配珠宝一样)¶
# 基本解包
first, second, third = colors
print(f"第一个是{first},第二个是{second},第三个是{third}")
# 使用*解包剩余元素
first, *rest = colors
print(f"第一个是{first},其他的是{rest}")
# 交换变量值
a, b = 1, 2
a, b = b, a # 现在a是2,b是1
4.2. 切片(像展示部分珠宝)¶
colors = ("红色", "蓝色", "绿色", "黄色", "紫色")
# 展示前三个颜色
first_three = colors[0:3] # 得到("红色", "蓝色", "绿色")
# 隔一个取一个
alternate = colors[::2] # 得到("红色", "绿色", "紫色")
# 反转元组
reversed_colors = colors[::-1] # 从后往前取所有颜色
4.3. 合并元组(像合并珠宝盒)¶
# 合并两个元组
box1 = ("红色", "蓝色")
box2 = ("绿色", "黄色")
all_colors = box1 + box2 # 得到("红色", "蓝色", "绿色", "黄色")
# 重复元组
doubled = box1 * 2 # 得到("红色", "蓝色", "红色", "蓝色")
5. 常用方法¶
方法 | 说明 | 示例 |
---|---|---|
count() | 统计元素出现的次数 | tuple.count(x) |
index() | 查找元素首次出现的位置 | tuple.index(x) |
len() | 获取元组长度 | len(tuple) |
sorted() | 返回排序后的新列表 | sorted(tuple) |
sum() | 对数字元组求和 | sum(tuple) |
max() | 找出最大元素 | max(tuple) |
min() | 找出最小元素 | min(tuple) |
6. 实战小例子¶
6.1. 坐标系统¶
# 创建一些坐标点
points = (
(0, 0), # 原点
(3, 4), # 点A
(-1, 2) # 点B
)
# 计算两点之间的距离
def distance(p1, p2):
x1, y1 = p1
x2, y2 = p2
return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
# 计算点A到原点的距离
dist = distance(points[0], points[1])
print(f"点A到原点的距离是:{dist}")
6.2. 学生成绩系统¶
# 创建学生成绩元组(姓名,数学,语文,英语)
students = (
("小明", 95, 92, 88),
("小红", 88, 95, 93),
("小华", 90, 85, 91)
)
# 计算每个学生的平均分
for student in students:
name, *scores = student
average = sum(scores) / len(scores)
print(f"{name}的平均分是:{average:.1f}")
7. 注意事项¶
- 元组的不可变性: ```python colors = ("红", "蓝", "绿") # colors[0] = "黄" # 错误!不能修改元组
# 但如果元组中包含可变对象,那个对象的内容是可以改变的 stuff = (1, [2, 3], 4) stuff[1].append(5) # 这是允许的 ```
-
单元素元组需要逗号:
python single = ("hello",) # 这是元组 not_tuple = ("hello") # 这不是元组,这是字符串
-
元组比列表更节省内存:
python import sys list_size = sys.getsizeof([1, 2, 3]) tuple_size = sys.getsizeof((1, 2, 3)) print(f"列表大小:{list_size}字节") print(f"元组大小:{tuple_size}字节")
-
元组可以作为字典的键:
python # 元组可以作为字典的键,因为它是不可变的 locations = {(0, 0): "原点", (1, 1): "点A"}
8. 使用场景¶
- 返回多个值: ```python def get_user_info(): name = "小明" age = 12 city = "北京" return name, age, city # 自动打包成元组
# 解包获取返回值 user_name, user_age, user_city = get_user_info() ```
- 不可变的数据集合: ```python # 常量集合 WEEKDAYS = ( "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" )
# 坐标或维度 dimensions = (1920, 1080) ```
- 数据分组: ```python # 数据记录 records = [ ("小明", "2010-01-01", "北京"), ("小红", "2010-02-02", "上海"), ("小华", "2010-03-03", "广州") ]
# 批量处理 for name, birthday, city in records: print(f"{name}出生于{birthday},来自{city}") ```