Day 08:【99天精通Python】列表推导式与元组 - 进阶技巧与不可变序列

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%2==0:evens.append(x**2)# 列表推导式evens=[x**2forxinrange(1,11)ifx%2==0]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%2==0else-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会自动打包)t4=1,2,3print(type(t4))# <class 'tuple'># 创建空元组empty=()# 【重要】创建只有一个元素的元组(必须加逗号)single_wrong=(1)# 这是整数 1single_right=(1,)# 这是元组 (1,)print(type(single_wrong))# <class 'int'>print(type(single_right))# <class 'tuple'>

2.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]="X"print(t_mutable)# (1, 2, ['X', 'b']) -> 元组本身没变(引用的地址没变),但引用的列表内容变了

三、元组的黑科技:打包与解包

3.1 序列解包(Unpacking)

我们可以将元组(或列表)中的元素一次性赋值给多个变量。

coordinates=(10,20)# 解包x,y=coordinatesprint(x)# 10print(y)# 20# 变量交换(利用解包原理)a=1b=2a,b=b,aprint(a,b)# 2 1

3.2 使用*处理剩余元素

如果变量数量少于元素数量,可以使用*收集剩余元素(结果为列表)。

numbers=(1,2,3,4,5)# 获取首尾,中间打包head,*middle,tail=numbersprint(head)# 1print(middle)# [2, 3, 4]print(tail)# 5# 只获取前两个a,b,*rest=numbersprint(a,b)# 1 2print(rest)# [3, 4, 5]

四、列表 vs 元组

特性列表 (List)元组 (Tuple)
可变性可变 (Mutable)不可变 (Immutable)
符号[]()
速度稍慢稍快(内存占用更小)
用途数据需要频繁修改时数据固定不变、作为字典键值、函数返回多个值
方法丰富 (append, remove…)很少 (count, index)

什么时候用元组?

  1. 数据保护:如果你传递一组数据给函数,且不希望函数修改它,用元组。
  2. 作为字典的键:列表不能做字典的键(因为可变),但元组可以。
  3. 函数返回值:函数返回多个值时,本质上是返回一个元组。

五、实战练习

练习1:列表推导式练手

使用列表推导式完成以下任务:

  1. 生成一个包含 1 到 20 之间所有能被 3 整除的数的列表。
  2. 有一个名字列表names = ["Alice", "Bob", "Charlie", "David"],生成一个新列表,包含每个名字的长度。
# 1. 被3整除nums=[xforxinrange(1,21)ifx%3==0]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,scoreinstudentsifscore>=60]print(passed_names)# ['小明', '小刚']

练习3:找出两个列表的共同元素

使用列表推导式找出两个列表中都存在的元素。

list1=[1,2,3,4,5]list2=[4,5,6,7,8]common=[xforxinlist1ifxinlist2]print(common)# [4, 5]

六、常见问题

Q1:元组只有一个元素时为什么要加逗号?

Python中的小括号()既用于元组,也用于数学运算优先级(如(1+2)*3)。如果不加逗号,Python会默认将其解析为数学运算括号或普通对象,而不是元组。

Q2:列表推导式一定会比for循环快吗?

在大多数情况下,列表推导式比等效的for循环要快,因为它是底层的C语言实现的优化。但是,如果逻辑极其复杂,推导式可能会牺牲可读性。可读性优先是Python的哲学。


七、小结

Day 08 进阶技巧

列表推导式

元组 Tuple

[x for x in data if cond]

简洁、高效

不可变序列

打包与解包

作为字典键

关键要点

  1. 列表推导式是用一行代码生成列表的利器。
  2. 元组是不可变的列表,创建单元素元组记得加逗号(1,)
  3. 解包允许我们将序列快速赋值给多个变量,*可以收集剩余元素。
  4. 在数据不需要修改的场景下,优先选择元组。

八、课后作业

  1. 筛选单词:给定一个句子字符串,将其转换为单词列表,然后使用列表推导式筛选出长度大于3的单词。
    • 输入:“Python is an amazing language”
    • 输出:[‘Python’, ‘amazing’, ‘language’]
  2. 元组统计:创建一个包含20个随机整数(1-10)的元组,统计数字 5 出现了多少次,并找出它第一次出现的索引。
  3. 坐标转换:有一个包含多个坐标元组的列表points = [(1, 2), (3, 4), (5, 6)],请使用列表推导式生成一个新的列表,其中每个坐标的 x 和 y 互换位置(即变为[(2, 1), (4, 3), (6, 5)])。

下节预告

Day 09:字典(Dictionary)- Python中最强大的键值对存储结构,我们将解锁数据查询的新姿势!


系列导航

  • 上一篇:Day 07 - 列表基础
  • 下一篇:Day 09 - 字典与集合(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1141541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Proteus8.9下载安装教程:新手快速理解安装要点

请提供您需要润色优化的博文内容&#xff0c;我将根据上述详尽的编辑准则对其进行深度重构与提升。

CCS使用小白指南:常见安装问题解决方案

CCS使用实战指南&#xff1a;从零搭建稳定开发环境 你是不是也经历过这样的场景&#xff1f; 刚下载好TI的Code Composer Studio&#xff08;CCS&#xff09;&#xff0c;满怀期待地点开安装包&#xff0c;结果弹出一堆错误提示——驱动装不上、Java报错、许可证激活失败………

STM32上手ModbusTCP:新手教程从零开始

从零开始在 STM32 上实现 ModbusTCP 通信&#xff1a;手把手实战指南 你是不是也遇到过这样的场景&#xff1f;项目需要让一个嵌入式设备和上位机、HMI 或 PLC 打通数据&#xff0c;但各家协议五花八门&#xff0c;开发起来头疼。这时候&#xff0c; ModbusTCP 就成了那个“万…

Redis集群:原理与实战经验分享(面试必看!)

文章目录是否使用过 Redis 集群&#xff1f;集群的原理是什么&#xff1f;**1. 是否使用过 Redis 集群&#xff1f;****Redis 集群是什么&#xff1f;****为什么需要 Redis 集群&#xff1f;****2. Redis 集群的原理是什么&#xff1f;****2.1 数据分片&#xff08;Sharding&am…

基于Java+SpringBoot+SSM物流管理系统(源码+LW+调试文档+讲解等)/物流管理软件/物流信息管理系统/供应链物流管理系统/企业物流管理系统/物流仓储管理系统/智能物流管理系统

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

工业传感器采集系统Keil5环境搭建手把手教程

手把手教你搭建工业传感器采集系统的Keil5开发环境 在工厂的自动化产线上&#xff0c;你是否见过那些默默工作的“电子耳目”&#xff1f;温度探头实时监测炉温&#xff0c;振动传感器预警设备故障&#xff0c;压力变送器确保管道安全——这些数据的第一站&#xff0c;往往不是…

计算机毕设 java 基于 JAVA 的网上订餐系统的设计与实现 智能餐饮订餐平台 线上菜品订购管理系统

计算机毕设 java 基于 JAVA 的网上订餐系统的设计与实现 sa1209&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着生活节奏的加快和线上服务的普及&#xff0c;用户对便捷、高效的订餐渠道需…

Keil4下载及安装系统学习:支持多芯片平台搭建

Keil4搭建多芯片开发平台&#xff1a;从安装到实战的完整指南 你有没有遇到过这样的场景&#xff1f;手头要同时维护一个老旧的C51项目&#xff0c;又要开发新的STM32产品线&#xff0c;结果发现IDE换来换去——Keil C51、IAR、Keil5来回切换&#xff0c;工程文件格式不兼容&a…

Keil5汉化注意事项:常见错误及解决方案

Keil5汉化实战避坑指南&#xff1a;从乱码到崩溃的根源解析与可靠方案你是不是也曾在打开Keil时&#xff0c;对着满屏英文菜单发愁&#xff1f;“Project”、“Target”、“Options for Target”……这些术语对新手来说就像天书。于是&#xff0c;搜索“Keil5汉化”成了很多人的…

计算机毕设 java 基于 vue 与 spring 的药品销售管理系统设计与实现 智能药品销售管控平台 医药流通信息化系统

计算机毕设 java 基于 vue 与 spring 的药品销售管理系统设计与实现 03miq9&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着医药行业的发展和信息化需求的提升&#xff0c;传统药品销售管理…

Java21虚拟线程池模型在电商秒杀系统中的应用与性能比较

利用 Java 21 虚拟线程重构电商秒杀系统&#xff1a;高并发下的性能革新 在当今数字化商业的浪潮中&#xff0c;电商秒杀活动已成为各大电商平台吸引用户、提升销量的重要手段。然而&#xff0c;秒杀活动瞬间产生的超高并发请求&#xff0c;对系统的性能和稳定性构成了极大的挑…

小天才USB驱动下载安装指南:手把手教程(从零实现)

小天才USB驱动安装实战指南&#xff1a;从“无法识别设备”到稳定通信 你有没有遇到过这样的情况&#xff1f;把小天才手表插上电脑&#xff0c;结果系统毫无反应&#xff0c;设备管理器里只看到一个带黄色感叹号的“未知设备”。孩子急着同步作业&#xff0c;家长却卡在第一步…

掌握 Xcode,实现移动开发的快速迭代

掌握 Xcode,实现移动开发的快速迭代 关键词:Xcode、移动开发、快速迭代、CI/CD、模块化开发、单元测试、性能优化 摘要:本文系统解析如何通过 Xcode 实现 iOS 移动开发的快速迭代。从 Xcode 核心架构与关键功能出发,详细阐述模块化开发、自动化构建、持续集成、测试驱动开发…

计算机毕业设计springboot新能源汽车产业链分析系统 基于Spring Boot的新能源汽车产业链数据分析平台设计与实现 Spring Boot框架下新能源汽车产业链综合管理系统开发

计算机毕业设计springboot新能源汽车产业链分析系统q997c9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着全球对环境保护和可持续发展的关注不断增加&#xff0c;新能源汽车…

Windows下STLink驱动下载(STM32)图文说明

STM32开发第一步&#xff1a;彻底搞懂ST-LINK驱动安装与调试链路构建 你有没有遇到过这样的场景&#xff1f;手里的Nucleo板子插上电脑&#xff0c;设备管理器却只显示“未知USB设备”&#xff1b;打开STM32CubeProgrammer&#xff0c;点击连接却提示“无法识别ST-LINK”&…

计算机毕设 java 基于 Java 的大学生创新成果信息管理系统的设计与实现 高校学生创新成果管理平台 学生创新项目信息备案系统

计算机毕设 java 基于 Java 的大学生创新成果信息管理系统的设计与实现 7l18q9&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着信息化时代的深入推进&#xff0c;高校对大学生创新成果的规…

Keil MDK下STM32中断向量表配置一文说清

Keil MDK下STM32中断向量表配置&#xff1a;从启动到重定位的完整解析 在嵌入式开发中&#xff0c;我们常常听到一句话&#xff1a;“系统是从 main() 函数开始运行的。” 但如果你真这么认为&#xff0c;那当你的Bootloader跳转后突然进入HardFault、中断无法响应时&#x…

计算机毕设 java 基于 Android 的医疗预约系统的设计与实现 移动医疗预约服务平台 医患对接信息化系统

计算机毕设 java 基于 Android 的医疗预约系统的设计与实现 53m069&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享 随着医疗需求的增长和移动互联网的普及&#xff0c;传统医疗预约存在流程繁…

计算机毕设 java 基于 Android 的自闭症康复训练 APP 设计与实现 自闭症康复辅助训练平台 特殊教育移动应用系统

计算机毕设 java 基于 Android 的自闭症康复训练 APP 设计与实现 2wl4u9&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着自闭症康复需求的增长和移动应用的普及&#xff0c;传统康复训练存…

基于Java+SpringBoot+SSM物联网仓储管理系统(源码+LW+调试文档+讲解等)/物联网仓储解决方案/仓储物联网技术/物联网仓库管理系统/智能仓储物联网系统/物联网仓储管理平台

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…