练习最大的收获就是先进行模仿,在发现问题,解决问题,最后掌握!

上一篇文章题目:Python基础(8):变量数据类型---神秘的“容器”集合和字典(set/dict)—详解

链接:https://blog.csdn.net/2501_94250394/article/details/156313559?spm=1001.2014.3001.5502


前言:

之前给小伙伴们加了点强度,和大家一起学习了一下四种容器及相关操作方法,内容有点多。今天给大家拓展一下相关的常用的知识点,相对来说,内容少一点。但是列表推导式用起来挺有效率的。当然了,拆包可不是叫大家去小道打对抗,A点、B点拆C4呐,而是我们容器的一种操作方法。

下面是后续用到的代码,给大家提前看一眼

一、容器拆包

容器拆包就是把列表、元组这类 “装着多个数据的容器” 里的元素,按顺序一次性取出来,分给对应的变量。它不用我们手动通过索引去挨个取值,能让代码更简洁易懂,比如把 `(10,20)` 里的数值快速分给 `num1` 和 `num2`。

简单来说就是把一个元组、列表中的数据一个一个拆解出来的过程,就称之为拆包操作。拆解出来的元素,我们就可以赋值给其他变量。

基本语法:

tuple1 = (10, 20)
# 拆包
num1, num2 = tuple1

以上代码可以简写为
num1, num2 = (10, 20)

还可以进一步简写
num1, num2 = 10, 20

典型案例:

看一下案例,大家应该能明白一点

案例一:实现两个变量值的交换:

我们引入第三方变量实现数值交换(原始代码

c1 = '可乐'
c2 = '牛奶'

# 经过一系列Python操作,把c1和c2中的值进行交换
temp = c1
c1 = c2
c2 = temp

print(c1)  # 牛奶
print(c2)  # 可乐

使用元组拆包实现两个变量值交换(进行拆包操作),大家可以发现,写起来简单很多,效率也高。

c1 = '可乐'
c2 = '牛奶'

c1, c2 = (c2, c1)

print(c1)  # 牛奶
print(c2)  # 可乐

案例二:将student里面的元素进行拆包,分别赋值给name,age两个变量

# 1. 先定义一个装着数据的元组(容器)
student = ("小明", 18)

# 2. 拆包操作:把容器里的元素按顺序分给两个变量
name, age = student

# 3. 打印结果,验证拆包效果
print("姓名:", name)
print("年龄:", age)

二、推导式介绍

2.1 1 什么是推导式

推导式(又称解析式):是 Python 独有语法特性,通过简洁紧凑的结构,依据筛选条件或元素转换规则,从已有数据序列快速构建出新的列表、集合或字典,相比传统循环更高效简洁。

简单来说:就是 “快速造数据的工具”,给它一堆原始数据,定好筛选规则(留哪些数据)和转换规则(改造成什么样),它能一行代码造出你需要的列表、集合或字典,不用写繁琐的循环代码。

2.2  为什么需要推导式

我们可以将多行代码程序简化为一行代码搞定这个程序,使代码更简洁紧凑,执行效率更高,我们来用一个案例来理解一下。

案例:

传统循环写法:

# 1. 创建空列表
even_list = []
# 2. 遍历1到10
for num in range(1, 11):
    # 3. 筛选偶数,后面会学习取余的操作
    if num % 2 == 0:
        # 4. 添加到列表
        even_list.append(num)
# 打印结果
print("传统循环结果:", even_list)

列表推导式写法:

# 一行代码完成:遍历+筛选+创建列表
even_list = [num for num in range(1, 11) if num % 2 == 0]
# 打印结果
print("推导式结果:", even_list)

三、 列表推导式

3.1 列表推导式

大家可以从刚才的案例里面看出列表推导式的简洁高效,下面我们就来和小伙伴们一起学习一下具体操作。

基本语法:

注意:表达式是编程语言中能被计算并最终返回一个具体值的代码片段,它由数据(如数字、变量)和操作符(如加减乘除)、函数调用等组成,核心作用是产生一个确定的结果。

简单来说:表达式就是 “能算出答案” 的代码,就像数学里的算式,输入进去能得到一个具体的结果。

变量名 = [表达式 for 变量 in 列表]
变量名 = [表达式 for 变量 in 列表 if 条件]
变量名 = [表达式 for 变量 in 列表 for 变量 in 列表]

案例:定义0-9之间的列表

原代码:

list1 = []
for i in range(10):
    list1.append(i)
print(list1)

列表推导式:

list1 = [i for i in range(10)]
print(list1)

简单解释:列表推导式会先跑一遍for循环遍历元素,把每个遍历到的i直接塞进新列表里(遍历出来的值i就相当于表达式),遍历完直接生成最终的列表,省掉了 “创建空列表 + 手动 append” 的步骤。

具体执行原理:[i for i in range(10)]

列表推导式先运行表达式右边的内容:

当第一次遍历时:i = 0,其得到变量i的结果后,会放入最左侧的变量i中,这个时候列表中就是[0]
当第二次遍历时:i = 1,其得到变量i的结果后,会追加最左侧的变量i中,这个时候列表中就是[0, 1]
...
当最后一次遍历时:i = 9,其得到变量i的结果后,会追加最左侧的变量i中,这个时候列表中就是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

3.2 列表推导式 + if条件判断

不知道小伙伴们理解了没有,再给大家加点难度,我们来看看稍微高深一点的方法

在使用列表推导式时,我们除了可以使用for循环,其实我们还可以在其遍历的过程中,引入if条件判断。

基本语法:

变量 = [表达式 for 临时变量 in 序列 if 条件判断]

等价于

for 临时变量 in 序列:
    if 条件判断

案例:

list1 = [i for i in range(10) if i % 2 == 0]
print(list1)

3.3 for循环嵌套列表推导式

基本语法:(注意执行逻辑)

变量 = [表达式 for 临时变量 in 序列 for 临时变量 in 序列]

相当于传统写法(理解传统写法的执行逻辑在去对比for循环嵌套列表推导式):

for 临时变量 in range(n):
    for 临时变量 in range(n):

案例:

原生代码:for循环嵌套

# 1. 初始化一个空列表list1,用于存放后续生成的元组数据
list1 = []

# 外层循环:遍历range(1,3),i依次取到1和2(range左闭右开,所以只包含1、2)
for i in range(1, 3):
    # 内层循环:遍历range(0,3),j依次取到0、1、2
    for j in range(0, 3):
        # 2. 用当前外层循环的i和内层循环的j,创建一个元组tuple1
        tuple1 = (i, j)
        # 3. 将创建好的元组tuple1,添加到空列表list1中
        list1.append(tuple1)

# 4. 打印最终组装完成的列表list1,查看所有生成的元组
print(list1)

列表推导式:

list1 = [(i, j) for i in range(1, 3) for j in range(0, 3)]
print(list1)

大家记得先看一遍原代码在看推导式进行理解。

四、案例

案例一:使用列表推导式生成平方数集合

案例二:生成 1~10 整数的平方数列表

案例三:筛选 1~20 中的所有偶数

案例四:将字符串列表转为大写

把列表["apple", "banana", "orange"]里的每个单词转成大写,组成新列表

案例五:生成两个数的组合元组

生成 “1、2” 和 “3、4” 的所有两两组合(如 (1,3)、(1,4) 等),组成元组列表

五、总结

今天的内容相对来说真的简单很多,但是具体操作还需要好好理解一下,大家可以先学习一下容器拆包和列表推导式的使用,今天有点忙,等明天我给大家补充一下字典和元组的列表推导式,到时候大家可以对比一下,列表、元组、字典推导式的各自特点和区别。


上述内容会根据大家的评论和实际情况进行实时更新和改进。

麻烦小伙伴们动一动发财的小手,给小弟点个赞和收藏,如果能获得小伙伴的关注将是我无上的荣耀和前进的动力。

小伙伴们,我是AI大佬的小弟,希望大家喜欢!!!

晚安,兄弟们。

更多推荐