元组和切片——我终于搞懂了什么是“不可变的列表”
一、元组是什么元组和列表非常像都是可以存放多个数据的容器。唯一的区别是元组一旦创建就不能修改。在 Python 里元组用圆括号 () 表示列表用方括号fruits_list [“苹果”, “香蕉”, “橙子”]元组用圆括号fruits_tuple (“苹果”, “香蕉”, “橙子”)元组可以像列表一样通过下标获取数据days (“周一”, “周二”, “周三”, “周四”, “周五”, “周六”, “周日”)print(days[0]) # 周一print(days[-1]) # 周日但你不能修改它days (“周一”, “周二”, “周三”)days[0] “星期日” # 报错元组不支持修改二、一个我踩过的坑单元素元组这个是新手很容易犯的错误。我想创建一个只有一个元素的元组t (“hello”)print(type(t)) # class ‘str’ 竟然是字符串你可能会想我明明写了圆括号为什么是字符串因为括号本身不是元组的标志逗号 , 才是。 (“hello”) 只是把字符串括起来了所以类型还是字符串。加上逗号 (“hello”,) 后Python 才知道这是一个元组,举个例子t (“hello”,) # 注意这个逗号print(type(t)) # class ‘tuple’记住单元素元组必须加逗号。这个坑我一开始也踩过后来记住了一条只要想创建元组就在末尾加个逗号习惯之后就不会出错了。三、元组的不可变性元组的不可变体现在不能增加、不能删除、不能修改元素。但需要注意的是如果元组里存的是列表这种可变对象列表本身还是可以被修改的t (“苹果”, [“香蕉”, “橙子”])t[1].append(“葡萄”) # 可以修改列表print(t) # (‘苹果’, [‘香蕉’, ‘橙子’, ‘葡萄’])列表可以改、元组不能改:days (“周一”, “周二”, “周三”)days[0] “星期日” # 报错‘tuple’ object does not support item assignment这有点绕但记住一句话就行元组不可变指的是元组本身的结构不变不能增删改元素但不限制元素内部的变化。四、什么时候用元组场景 推荐用 原因一周七天、一年十二个月 元组 固定不变用元组更安全函数返回多个值 元组 Python函数返回多个值时默认就是元组字典的键 元组 列表不能作为字典的键元组可以需要频繁增删改的数据 列表 元组不能修改五、切片截取序列的一部分切片可以让你从一个序列字符串、列表、元组中截取一部分。基本语法序列[起始下标:结束下标:步长]注意切片是左闭右开的——包含起始下标不包含结束下标。1.基本切片fruits [“苹果”, “香蕉”, “橙子”, “葡萄”, “西瓜”]从下标0取到下标3不包含3print(fruits[0:3]) # [‘苹果’, ‘香蕉’, ‘橙子’]从下标1取到下标4不包含4print(fruits[1:4]) # [‘香蕉’, ‘橙子’, ‘葡萄’]从开头取到下标3不包含3print(fruits[:3]) # [‘苹果’, ‘香蕉’, ‘橙子’]从下标2取到末尾print(fruits[2:]) # [‘橙子’, ‘葡萄’, ‘西瓜’]注意在元组上切片的写法完全一样days (“周一”, “周二”, “周三”, “周四”, “周五”)print(days[1:4]) # (‘周二’, ‘周三’, ‘周四’)2.步长numbers [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]从0到9步长为2隔一个取一个print(numbers[0:10:2]) # [0, 2, 4, 6, 8]从1到9步长为2print(numbers[1:10:2]) # [1, 3, 5, 7, 9]3.负步长反转序列numbers [0, 1, 2, 3, 4, 5]步长为负数从右往左取print(numbers[::-1]) # [5, 4, 3, 2, 1, 0]print(numbers[4:1:-1]) # [4, 3, 2][::-1]是一个非常常用的写法用来快速反转一个序列。六、字符串切片字符串也可以切片因为字符串本质上也是序列举个例子text “Hello World”print(text[0:5]) # Helloprint(text[6:]) # Worldprint(text[::-1]) # dlroW olleH反转字符串七、一个我踩过的坑切片下标越界不报错列表下标越界会报错但切片不会fruits [“苹果”, “香蕉”, “橙子”]print(fruits[0:100]) # [‘苹果’, ‘香蕉’, ‘橙子’]不报错切片会自动忽略超出范围的索引不会报错。这个特性有时候很方便但如果你的切片结果为空却没有报错可能会让调试变得困难。用切片的时候心里有数就行——如果你发现切片结果比预期短可以检查一下是不是下标写超了。八、综合示例学生成绩分析把今天学的东西串起来用元组存学生姓名固定名单不能修改students (“张三”, “李四”, “王五”, “赵六”, “孙七”)用列表存成绩可以增删改scores [85, 92, 78, 96, 88]print(“ 学生成绩表 ”)for i in range(len(students)):print(f{students[i]}{scores[i]}分)用切片取出前三名top_three scores[:3]print(f\n前三名成绩{top_three})用切片反转查看倒数排名scores_reversed scores[::-1]print(f倒序排名成绩{scores_reversed})字符串切片提取信息student_info “2024001-张三-85”student_id student_info[0:7] # 2024001name student_info[8:10] # 张三score student_info[11:] # 85print(f\n学号{student_id}姓名{name}成绩{score}分)运行结果 学生成绩表 张三85分李四92分王五78分赵六96分孙七88分前三名成绩[85, 92, 78]倒序排名成绩[88, 96, 78, 92, 85]学号2024001姓名张三成绩85分小结今天学的东西整理成一张速查表知识点 说明 示例定义元组 用 () 包裹数据 t (“苹果”, “香蕉”)单元素元组 必须加逗号 t (“hello”,)元组不可变 不能增删改 t[0] “a” → 报错列表 vs 元组 可变 vs 不可变 列表可修改元组不可切片 截取序列的一部分 fruits[0:3][::-1] 反转序列 numbers[::-1]字符串切片 字符串也是序列 text[0:5]什么时候用元组什么时候用列表·数据固定不变如一周七天→ 元组·数据需要增删 → 列表·作为字典的键 → 元组列表不行