注册 登录
Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元祖类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python项目实战

首页 > Python基础教程 > 第十章: Python列表类型 > 10.4节:优雅的列表推导式

10.4节:优雅的列表推导式

薯条老师 2020-05-09 16:01:02 205774 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师的线下Python,Java小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Java后端开发。授课详情请点击:http://chipscoco.com/?cate=6

10.4.1 什么是列表推导式?

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

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

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

# __author__ = 薯条编程
# __desc__ = 在for循环中为列表添加新的元素
 
# 定义一个空列表
numbers = []
 
for _ in range(100):
  if _ % 2 != 0:
    # 如果当前元素是奇数,则添加进列表当中
      numbers.append(_)
在上文代码中,我们在循环中判断当前元素是否为奇数,若为奇数,则添加进列表中。为简化列表的生成代码,我们可以使用列表解析式:

# __author__ = 薯条编程
# __desc__ = 使用列表解析式来生成一个新列表
 
# 只需一行代码就可以生成一个包含奇数的列表
numbers = [_ for _ in range(100) if _%2 != 0 ]
与直接使用for循环来添加元素相比,列表解析式更加简洁和优雅。现在开始来详细地讲解Python中的列表推导式。

10.4.2 列表推导式的基本结构

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

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

# __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循环和条件控制结构来对列表推导式的基本结构进行扩展。

10.4.3 列表推导式的复杂结构

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

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

# __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语句对该元素进行逻辑判断,如果元素符合条件,就添加到列表中。同样为便于理解,我们可以将包含条件控制的列表推导式转换为普通的循环结构:

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

# __author__ = 薯条编程
# __desc__ = 包含条件控制的列表推导式
 
# 通过列表推导式生成一个只包含偶数的列表
numbers = [_ for _ in range(100) if _%2 == 0 ]
(3) 同时包含嵌套for循环和条件控制的复杂列表推导式

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

直接看代码实例:

# __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循环代码为:

# __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)
代码实例-计算0到100之间的所有质数:

# __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]

10.4.4 知识要点

(1) 列表推导式,又叫列表解析式。列表解析式,顾名思义,就是由已有的可迭代对象,来解析出一个新的列表。
(2) 列表推导式本质还是一个for循环,在for循环中每迭代一次,就会在列表中插入一个新的元素。
(3) 在列表推导式中可以嵌套for循环,以及进行条件控制,由此组合成比较复杂的列表推导式。

10.4.5 高薪就业班

(1) Python后端工程师高薪就业班,月薪10K-15K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪10K-20K, 免费领取课程大纲
(4) Python大数据工程师就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:



欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录