• 时长: 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() 将其转换为集合进行去重,并打印结果。 创建一个集合,尝试添加和删除元素(使用 removediscard),观察区别。 使用 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。(提示:可以将列表转换为集合,然后比较列表和集合的长度)。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。