- 时长: 90 分钟
- 教学目标:
- 学习“元组”的概念:一种有序的、但不可改变的数据集合。
- 掌握创建元组的方法
()
。 - 学会通过位置编号(索引)访问元组中的元素(与列表类似)。
- 理解元组的不可变性(immutable),知道它与列表的主要区别。
- 了解元组的简单应用场景。
- 学习“集合”的概念:一种无序的、包含唯一元素的数据集合。
- 掌握创建集合的方法
{}
或set()
。 - 学会向集合中添加和删除元素。
- 理解集合“元素唯一”的特点,知道它如何自动去除重复项。
- 学会使用
in
运算符高效地检查元素是否在集合中。 - 初步了解集合的简单操作(例如:去重)。
- 能够区分列表、元组、集合的特点和适用场景。
课程内容
1. 复习与引入 (10 分钟)
- 复习: 快速回顾列表(有序、可变、可以有重复)和字典(无序、键值对、通过键查找、键唯一)这两种数据结构的特点和用法。
- 提出问题: 老师提问:“我们用列表可以存一串可以变动的数据,比如待办事项列表。用字典可以存有标签的数据,比如学生的分数。但如果我有一个数据集合,比如一个点的坐标 (x, y),它由两个值组成,并且这个坐标一旦确定就不应该随便变动,用列表或字典总感觉不是最贴切的。有没有一种数据结构,像列表一样有序存放多个数据,但是一旦创建就不能修改呢?” “又比如,我有一堆学生的姓名,里面有很多重复的名字,我只想知道所有不同的姓名有哪些,怎么办?如果把这些名字放到列表里,我怎么快速去掉重复项?”
- 引出新知识: 这就需要用到新的数据结构了:元组 (Tuple) 和 集合 (Set)。元组用来存放有序但不可变的数据,集合用来存放无序且唯一的元素。
2. 有序但不可变的数据集合 – 元组 (Tuple) (20 分钟)
- 概念: 元组是一种有序的集合,和列表非常相似,区别在于元组一旦创建,里面的元素就不能再添加、删除或修改。元组是不可变的 (immutable)。
- 创建语法: 使用圆括号
()
来创建元组,元素之间用逗号,
分隔。# 创建一个元组,存放一个点的坐标 point = (3, 4) print(point) print(type(point)) # 输出 <class 'tuple'> # 创建一个包含不同类型元素的元组 my_tuple = ("apple", 123, 3.14) print(my_tuple) # 创建一个空的元组 empty_tuple = () print(empty_tuple) # 注意:创建只包含一个元素的元组需要在元素后面加逗号 single_element_tuple = (5,) # 必须加逗号! print(single_element_tuple) print(type(single_element_tuple)) # 输出 <class 'tuple'> # 如果不加逗号,只是一个普通的数字外面套了括号 not_a_tuple = (5) print(not_a_tuple) print(type(not_a_tuple)) # 输出 <class 'int'>
- 访问元素: 和列表一样,使用方括号
[]
和索引(从 0 开始)来访问元组中的元素。也支持负数索引和切片。my_tuple = ("apple", 123, 3.14) print(my_tuple[0]) # 访问第一个元素 'apple' print(my_tuple[-1]) # 访问最后一个元素 3.14 print(my_tuple[0:2]) # 切片 ('apple', 123)
- 不可变性 (重点!): 元组一旦创建,里面的元素就不能修改、添加或删除。尝试这样做会报错。
my_tuple = ("apple", 123, 3.14) # my_tuple[1] = 456 # 错误!不能修改元组的元素 # my_tuple.append("banana") # 错误!元组没有 append 方法 # del my_tuple[0] # 错误!不能删除元组的元素
虽然元组本身不可变,但如果元组里的元素是可变对象(比如列表),那么可以修改这个可变元素内部的值,但不能替换掉这个元素本身。
mutable_in_tuple = ([1, 2], "hello") mutable_in_tuple[0].append(3) # 合法!修改了元组里的列表 print(mutable_in_tuple) # 结果是 ([1, 2, 3], "hello") # mutable_in_tuple[0] = [4, 5] # 错误!不能替换元组的元素
- 何时使用元组: 当你需要一个有序的数据集合,并且希望这些数据在程序运行过程中不会被意外修改时,就应该使用元组。例如:函数返回多个值(通常作为元组返回)、点的坐标、固定的配置信息等。
- 动手实践: 学生创建不同内容的元组,尝试访问元素。 尝试修改、添加、删除元组的元素,观察报错。 创建包含一个列表的元组,尝试修改里面的列表元素。
3. 无序且唯一的“去重器” – 集合 (Set) (25 分钟)
- 概念: 集合是一种无序的集合,它里面的元素都是唯一的,不会有重复。集合的主要用途是进行成员关系测试(判断一个元素是否在集合里)和去除重复元素。
- 创建语法: 使用花括号
{}
或者set()
函数来创建集合。# 创建一个集合,重复的元素会被自动去除 my_set = {1, 2, 2, 3, 4, 4, 5} print(my_set) # 输出可能是 {1, 2, 3, 4, 5} (顺序可能不同) print(type(my_set)) # 输出 <class 'set'> # 从列表创建集合 (常用于去重) my_list = [1, 2, 2, 3, 4, 4, 5] set_from_list = set(my_list) print("列表去重后:", set_from_list) # 输出 {1, 2, 3, 4, 5} # 创建一个空的集合 empty_set = set() # 不能用 {},{} 是空字典 print(empty_set) print(type(empty_set)) # 输出 <class 'set'> # 集合的元素必须是不可变的类型(数字、字符串、元组等),不能是列表或字典 # invalid_set = {[1, 2], 3} # 错误!集合元素不能是列表
- 添加元素 –
.add()
: 向集合中添加一个元素。如果元素已存在,集合不会改变。fruits_set = {"apple", "banana"} fruits_set.add("cherry") # 添加新元素 fruits_set.add("apple") # 添加已存在的元素 (不会改变集合) print(fruits_set) # 输出可能是 {'apple', 'banana', 'cherry'}
- 删除元素 –
.remove()
,.discard()
:.remove(元素值)
: 删除集合中指定的元素。如果元素不存在,会报错。.discard(元素值)
: 删除集合中指定的元素。如果元素不存在,不会报错。通常推荐使用discard()
。my_set = {1, 2, 3, 4} my_set.remove(3) # 删除 3 my_set.discard(2) # 删除 2 my_set.discard(5) # 删除 5 (不存在,不报错) # my_set.remove(5) # 报错! print(my_set) # 输出可能是 {1, 4}
- 检查成员关系 –
in
(高效): 使用in
运算符检查一个元素是否在集合中,速度非常快。fruits_set = {"apple", "banana", "cherry"} print("apple" in fruits_set) # True print("orange" in fruits_set) # False
- 遍历集合: 集合是无序的,但可以使用
for
循环遍历集合中的每一个元素。遍历的顺序是不确定的。my_set = {1, 5, 2, 4, 3} print("--- 遍历集合 ---") for element in my_set: print(element) # 每次运行,打印顺序可能不同
- 动手实践: 学生创建包含重复数字的列表,用
set()
将其转换为集合进行去重,并打印结果。 创建一个集合,尝试添加和删除元素(使用remove
和discard
),观察区别。 使用in
检查元素是否在集合中。 遍历集合并打印元素。
4. 列表、元组、集合的区别和选择 (10 分钟)
- 总结对比:
- 列表 (List): 有序,可变,可以有重复元素。用途:需要管理顺序、需要修改元素、需要增删元素的数据集合。
- 元组 (Tuple): 有序,不可变,可以有重复元素。用途:存储固定不变的数据集合,作为字典的键(如果元素本身不可变)、函数返回多个值。
- 集合 (Set): 无序,可变(可以增删元素),元素唯一。用途:去重、成员关系测试(判断元素是否存在)、进行集合运算(交集、并集等 – 简单提及)。
- 何时选择: 根据你存储数据的特点和需求来选择:
- 数据顺序重要吗?会改变吗? → 列表
- 数据顺序重要吗?不会改变吗? → 元组
- 数据顺序不重要?需要快速查找某个元素?需要去掉重复项? → 集合
5. 课堂练习 (15 分钟)
让学生独立完成以下练习:
- 练习 1: 创建一个包含重复数字的列表,例如
numbers = [10, 20, 10, 30, 40, 20, 50]
。使用set()
方法将其转换为集合,实现去重,并打印去重后的结果。numbers = [10, 20, 10, 30, 40, 20, 50] # TODO: 将列表转换为集合 # TODO: 打印集合
- 练习 2: 创建一个元组,存放你的出生年月日,例如
birthday = (2010, 5, 15)
。尝试修改元组中的年份,看看会发生什么。 - 练习 3: 创建两个列表,分别代表两个小组的同学名字(可能有重复)。例如
group1 = ["小明", "小红", "小刚"]
,group2 = ["小刚", "小丽", "小强"]
。使用集合找出所有不同的同学名字。(提示:将两个列表都转换为集合,然后可以使用集合的并集操作|
或set1.union(set2)
)。group1 = ["小明", "小红", "小刚"] group2 = ["小刚", "小丽", "小强"] # TODO: 将 group1 转换为集合 # TODO: 将 group2 转换为集合 # TODO: 计算两个集合的并集 # TODO: 打印所有不同的同学名字
6. 总结与提问 (5 分钟)
- 回顾: 回顾本节课内容:元组 (有序、不可变、
()
),集合 (无序、唯一、{}
或set()
),如何创建、访问/增删元素,以及列表、元组、集合的对比和适用场景。 - 提问:
- 元组和列表最主要的区别是什么?
- 如何创建一个只包含数字 10 的元组?
- 如何创建一个空的集合?
- 集合有什么特点?(至少说出两点)
- 怎么判断一个元素是否在集合里?
- 如果我有很多重复的数据,想快速去掉重复项,用什么数据结构比较方便?
- 答疑: 回答学生问题。
7. 布置课后作业 (5 分钟)
- 作业 1: 创建一个元组,存放一周七天的英文名称。使用索引打印出“Tuesday”(周二)和“Thursday”(周四)。尝试将“Sunday”改为“Weekend”,观察结果。
- 作业 2: 编写一个程序,让用户输入一些数字(用空格分隔),将这些数字存储在一个列表中。然后使用集合找出用户输入的所有不同的数字,并打印出来。
- 作业 3: 编写一个程序,有两个字符串列表,分别代表两个兴趣小组的成员姓名。找出同时参加了这两个兴趣小组的成员姓名(两个列表的交集)。(提示:将列表转换为集合,使用集合的交集操作
&
或set1.intersection(set2)
)。 - 作业 4: (选做) 编写一个函数
check_duplicates(input_list)
,接收一个列表作为参数。判断列表中是否存在重复元素,如果存在,返回True
;如果不存在,返回False
。(提示:可以将列表转换为集合,然后比较列表和集合的长度)。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)