Python从入门到高手7.4节-优雅的列表推导式

目录

[7.4.1 什么是列表推导式?](#7.4.1 什么是列表推导式?)

[7.4.2 列表推导式的基本结构](#7.4.2 列表推导式的基本结构)

[7.4.3 列表推导式的复杂结构](#7.4.3 列表推导式的复杂结构)

[7.4.4 高山下的情歌](#7.4.4 高山下的情歌)


7.4.1 什么是列表推导式?

列表推导式,又叫列表解析式。所谓解析式,顾名思义,就是由已有的可迭代对象,来解析出一个新的列表。

迄今学过的可迭代类型有字符串,列表。可迭代对象可以在循环中进行迭代。在对可迭代对象中的元素进行迭代的过程中,我们可以对元素进行一定的处理,以生成一个新的列表。

在讲解列表推导式的基本结构之前,同学们先看一段代码,在for循环中为列表添加新的元素:

代码实例:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 在for循环中为列表添加新的元素
 
# 定义一个空列表
numbers = []
 
for n in range(100):
  if n % 2 != 0:
    # 如果当前元素是奇数,则添加进列表当中
      numbers.append(n)

我们在循环中判断当前元素是否为奇数,若为奇数,则添加进列表中。为简化列表的生成代码,我们可以使用列表解析式:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 使用列表解析式来生成一个新列表
 
# 只需一行代码就可以生成一个包含奇数的列表
numbers = [_ for _ in range(100) if _ % 2 != 0 ]

与直接使用for循环来添加元素相比,列表解析式更加简洁和优雅。现在开始来详细地讲解Python中的列表推导式。

7.4.2 列表推导式的基本结构

列表推导式的基本结构如下:

[element for element in iterable]

element表示从可迭代对象iterable中迭代出的元素,从其基本结构可看出,列表推导式本质还是一个for循环,在for循环中每迭代一次,就会在列表中插入一个新的元素。

迄今学过的可迭代对象有字符串、列表,我们现在根据这两种可迭代对象来创建新的列表。

代码实例:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 在列表推导式中根据字符串,列表等可迭代对象创建新的列表
 
# 1.根据字符串对象来创建一个新列表
characters = [_ for _ in "ABC"]
print(characters)
# 输出为:['A', 'B', 'C']
 
# 2.根据列表对象来创建一个新列表
characters = [_ for _ in [1,2,3,4,5]]
print(characters)
# 输出为:[1, 2, 3, 4, 5]

列表推导式的基本结构很简单,现在通过嵌套的for循环和条件控制结构来对列表推导式的基本结构进行扩展。

7.4.3 列表推导式的复杂结构

(1) 包含嵌套for循环的列表推导式

语法结构如下:

[element for x in iterable for y in iterable]

element表示由元素x和元素y所生成的一个新的元素。iterable表示可迭代对象。为便于理解,我们可以将嵌套了for循环的列表推导式转换为普通的循环结构:

python 复制代码
for x in iterable:
  for y in iterable:
       # 对元素x和y进行处理,生成一个新的元素
       # 例如对x和y进行相加
       element = x+y

代码实例:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 在嵌套了for循环的列表推导式中生成一个新的列表
 
# 同学们在理解列表推导式式,可以将它们转换为普通的循环结构
numbers = [x+y for x in [1,2,3] for y in [1,2,3]]
print(numbers)
 
# numbers的输出为:[2, 3, 4, 3, 4, 5, 4, 5, 6]

(2) 包含条件控制的列表推导式

语法结构如下:

[element for element in iterable if element...]

element是从可迭代对象iterable中迭代出的元素,然后通过if语句对该元素进行条件判断,如果元素符合条件,就添加到列表中。为便于理解,我们可以将包含条件控制的列表推导式转换为普通的循环结构:

python 复制代码
for element in iterable:
  # 通过if来对元素进行条件控制
  # 例如当前的数字为奇数就添加进列表
  if element % 2 != 0:
    pass

代码实例:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 包含条件控制的列表推导式
 
# 通过列表推导式生成一个只包含偶数的列表
numbers = [_ for _ in range(100) if _ % 2 == 0 ]

(3) 同时包含嵌套for循环和条件控制的复杂列表推导式

我们可以在列表推导式中同时使用嵌套for循环和条件控制,来组合成比较复杂的列表推导式。

直接看代码实例:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 在列表推导式中同时使用嵌套for循环和条件控制
 
numbers = [x+y for x in [1,2,3] if x % 2 == 0 for y in [1,2,3] if y % 2 !=0]
"""
(1) 在外层的for循环中加了一个条件控制:if x % 2 == 0,表示筛选出偶数
(2) 在内存的for循环中加了一个条件控制:if x % 2 != 0,表示筛选出奇数
"""
print(numbers)
 
# numbers的输出为:[3,5]

同学们在理解列表推导式时,可将其转换成普通的循环结构进行理解。以上文中的复杂列表推导式为例,其所对应的普通for循环代码为:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 将复杂的列表推导式转换成普通个循环结构
 
numbers = []
 
# 外层的for循环
for x in [1,2,3]:
  if x % 2 !=0:
       continue
 
  # 内层的for循环
  for y in [1,2,3]:
       if y % 2 == 0:
          continue
       numbers.append(x+y)

代码实例-用列表推导式输出所有质数:

python 复制代码
# __author__ = 薯条老师
# __desc__ = 通过列表推导式计算0到100之间的所有质数
 
numbers = [x for x in range(2, 100) if 0 not in [x % y for y in range(2,x)]]
 
"""
(1)质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
(2)外层for循环用来遍历从2到100之间的所有自然数
(3)如果当前自然数不是质数,那么其与当前自然数范围内的数相余:[x%y for y in range(2,x)],则列表中一定存在一个元素为0的数
(4)在外层for循环再判断该列表是否包含0即可,如果包含0,说明不是质数
"""
 
print(numbers)
 
# numbers的输出为:[2,3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

7.4.4 高山下的情歌

跟薯条老师学后端开发,高级爬虫(JS逆向+安卓逆向),数据分析,大数据开发,量化交易,以及机器学习+深度学习算法。坚定自己的学习目标,保持学习的热情,那你成为高手只是时间问题。

薯条老师的学生在南方电网,林氏家居,京东,阿里等大厂。想系统学习Python和Java的同学,可以移步薯条老师的个人技术博客:薯条老师的个人技术博客http://www.chipscoco.com/ 对本节教程有任何不懂的同学,亦可在评论区中进行评论。薯条老师会详细解答你们提出的每一个问题。

相关推荐
泰迪智能科技011 小时前
高校深度学习视觉应用平台产品介绍
人工智能·深度学习
算法小白(真小白)2 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭2 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0072 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Chinese Red Guest2 小时前
python
开发语言·python·pygame
骑个小蜗牛3 小时前
Python 标准库:string——字符串操作
python
Jeremy_lf3 小时前
【生成模型之三】ControlNet & Latent Diffusion Models论文详解
人工智能·深度学习·stable diffusion·aigc·扩散模型
冰蓝蓝5 小时前
深度学习中的注意力机制:解锁智能模型的新视角
人工智能·深度学习
黄公子学安全5 小时前
Java的基础概念(一)
java·开发语言·python