2026/4/17 22:08:37
网站建设
项目流程
vue做电商网站,开发一个网页具体流程,平台公司组织架构,网易企业邮箱超大附件Day 08#xff1a;【99天精通Python】列表推导式与元组 - 进阶技巧与不可变序列
前言
欢迎来到第8天#xff01;
在昨天的课程中#xff0c;我们掌握了Python中最常用的数据结构——列表#xff08;List#xff09;的基础用法。你可能已经发现#xff0c;用for循环来处理…Day 08【99天精通Python】列表推导式与元组 - 进阶技巧与不可变序列前言欢迎来到第8天在昨天的课程中我们掌握了Python中最常用的数据结构——列表List的基础用法。你可能已经发现用for循环来处理列表虽然直观但有时代码会显得比较拖沓。Python以优雅和简洁著称今天我们将学习列表推导式这是一种能让你用一行代码搞定复杂列表操作的魔法。此外我们还将介绍列表的孪生兄弟——元组Tuple看看为什么我们需要一个不可变的列表。本节内容列表推导式List Comprehensions元组的创建与操作元组的解包Unpacking列表 vs 元组如何选择实战练习一、列表推导式Pythonic的代码风格1.1 什么是列表推导式列表推导式List Comprehension是Python提供的一种简洁的创建列表的方法。它可以将多行循环代码压缩成一行不仅代码更少而且执行效率往往更高。场景对比我们要创建一个包含1到10平方的列表。# 普通写法3行代码squares[]forxinrange(1,11):squares.append(x**2)print(squares)# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 列表推导式写法1行代码squares[x**2forxinrange(1,11)]print(squares)1.2 基本语法[expressionforiteminiterable]expression对每个元素执行的操作生成的元素。item从序列中取出的元素。iterable可迭代对象如列表、range等。1.3 带条件的列表推导式我们可以在后面加上if语句进行过滤。语法[expressionforiteminiterableifcondition]示例筛选出1到10之间的偶数并计算它们的平方。# 普通写法evens[]forxinrange(1,11):ifx%20:evens.append(x**2)# 列表推导式evens[x**2forxinrange(1,11)ifx%20]print(evens)# [4, 16, 36, 64, 100]1.4 带if-else的列表推导式注意当需要else时if语句必须放在for之前。示例将列表中的偶数保留奇数变为负数。numbers[1,2,3,4,5]# [结果1 if 条件 else 结果2 for 变量 in 列表]new_nums[xifx%20else-xforxinnumbers]print(new_nums)# [-1, 2, -3, 4, -5]1.5 嵌套列表推导式推导式也可以嵌套用于处理二维列表。示例将一个 3x3 的矩阵展平为一维列表。matrix[[1,2,3],[4,5,6],[7,8,9]]# 普通写法flattened[]forrowinmatrix:fornuminrow:flattened.append(num)# 推导式写法flattened[numforrowinmatrixfornuminrow]print(flattened)# [1, 2, 3, 4, 5, 6, 7, 8, 9]注意虽然列表推导式很强大但如果逻辑过分复杂超过两层循环或复杂判断为了代码的可读性建议还是使用普通的for循环。二、元组Tuple不可变的列表2.1 什么是元组元组与列表非常相似它们都是有序的元素集合。最大的区别在于元组是不可变的Immutable。一旦创建就不能修改不能增、删、改元素。元组使用小括号()表示。列表 List可变 Mutable使用方括号 []元组 Tuple不可变 Immutable使用小括号 ()2.2 创建元组# 创建多个元素的元组t1(1,2,3)t2(a,b,c)t3(1,hello,3.14)# 混合类型# 省略括号Python会自动打包t41,2,3print(type(t4))# class tuple# 创建空元组empty()# 【重要】创建只有一个元素的元组必须加逗号single_wrong(1)# 这是整数 1single_right(1,)# 这是元组 (1,)print(type(single_wrong))# class intprint(type(single_right))# class tuple2.3 访问元组访问方式与列表完全一致索引和切片。fruits(苹果,香蕉,橙子,葡萄)print(fruits[0])# 苹果print(fruits[-1])# 葡萄print(fruits[1:3])# (香蕉, 橙子)2.4 元组的不可变性t(1,2,3)# 尝试修改会报错# t[0] 10 # TypeError: tuple object does not support item assignment# 尝试添加/删除也会报错# t.append(4) # AttributeError# del t[0] # TypeError特例如果元组中包含可变对象如列表那么这个列表的内容是可以修改的。t_mutable(1,2,[a,b])t_mutable[2][0]Xprint(t_mutable)# (1, 2, [X, b]) - 元组本身没变引用的地址没变但引用的列表内容变了三、元组的黑科技打包与解包3.1 序列解包Unpacking我们可以将元组或列表中的元素一次性赋值给多个变量。coordinates(10,20)# 解包x,ycoordinatesprint(x)# 10print(y)# 20# 变量交换利用解包原理a1b2a,bb,aprint(a,b)# 2 13.2 使用*处理剩余元素如果变量数量少于元素数量可以使用*收集剩余元素结果为列表。numbers(1,2,3,4,5)# 获取首尾中间打包head,*middle,tailnumbersprint(head)# 1print(middle)# [2, 3, 4]print(tail)# 5# 只获取前两个a,b,*restnumbersprint(a,b)# 1 2print(rest)# [3, 4, 5]四、列表 vs 元组特性列表 (List)元组 (Tuple)可变性可变 (Mutable)不可变 (Immutable)符号[]()速度稍慢稍快内存占用更小用途数据需要频繁修改时数据固定不变、作为字典键值、函数返回多个值方法丰富 (append, remove…)很少 (count, index)什么时候用元组数据保护如果你传递一组数据给函数且不希望函数修改它用元组。作为字典的键列表不能做字典的键因为可变但元组可以。函数返回值函数返回多个值时本质上是返回一个元组。五、实战练习练习1列表推导式练手使用列表推导式完成以下任务生成一个包含 1 到 20 之间所有能被 3 整除的数的列表。有一个名字列表names [Alice, Bob, Charlie, David]生成一个新列表包含每个名字的长度。# 1. 被3整除nums[xforxinrange(1,21)ifx%30]print(nums)# [3, 6, 9, 12, 15, 18]# 2. 名字长度names[Alice,Bob,Charlie,David]name_lengths[len(name)fornameinnames]print(name_lengths)# [5, 3, 7, 5]练习2成绩分析元组应用学生成绩以元组形式存储(姓名, 分数)。请筛选出及格60的学生姓名。students[(小明,85),(小红,59),(小刚,90),(小强,55)]# 使用列表推导式 解包passed_names[nameforname,scoreinstudentsifscore60]print(passed_names)# [小明, 小刚]练习3找出两个列表的共同元素使用列表推导式找出两个列表中都存在的元素。list1[1,2,3,4,5]list2[4,5,6,7,8]common[xforxinlist1ifxinlist2]print(common)# [4, 5]六、常见问题Q1元组只有一个元素时为什么要加逗号Python中的小括号()既用于元组也用于数学运算优先级如(12)*3。如果不加逗号Python会默认将其解析为数学运算括号或普通对象而不是元组。Q2列表推导式一定会比for循环快吗在大多数情况下列表推导式比等效的for循环要快因为它是底层的C语言实现的优化。但是如果逻辑极其复杂推导式可能会牺牲可读性。可读性优先是Python的哲学。七、小结Day 08 进阶技巧列表推导式元组 Tuple[x for x in data if cond]简洁、高效不可变序列打包与解包作为字典键关键要点列表推导式是用一行代码生成列表的利器。元组是不可变的列表创建单元素元组记得加逗号(1,)。解包允许我们将序列快速赋值给多个变量*可以收集剩余元素。在数据不需要修改的场景下优先选择元组。八、课后作业筛选单词给定一个句子字符串将其转换为单词列表然后使用列表推导式筛选出长度大于3的单词。输入“Python is an amazing language”输出[‘Python’, ‘amazing’, ‘language’]元组统计创建一个包含20个随机整数1-10的元组统计数字 5 出现了多少次并找出它第一次出现的索引。坐标转换有一个包含多个坐标元组的列表points [(1, 2), (3, 4), (5, 6)]请使用列表推导式生成一个新的列表其中每个坐标的 x 和 y 互换位置即变为[(2, 1), (4, 3), (6, 5)]。下节预告Day 09字典Dictionary- Python中最强大的键值对存储结构我们将解锁数据查询的新姿势系列导航上一篇Day 07 - 列表基础下一篇Day 09 - 字典与集合待更新