> 文章列表 > Python入门教程+项目实战-10.4节: 优雅的列表推导式

Python入门教程+项目实战-10.4节: 优雅的列表推导式

Python入门教程+项目实战-10.4节: 优雅的列表推导式

目录

10.4.1 什么是列表推导式?

10.4.2 列表推导式的基本结构

10.4.3 列表推导式的复杂结构

10.4.4 知识要点

10.4.5 系统学习python


10.4.1 什么是列表推导式?

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

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

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

代码实例:

Python

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

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

Python

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

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

10.4.2 列表推导式的基本结构

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

Python

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

10.4.3 列表推导式的复杂结构

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

语法结构如下:

Python

[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) 包含条件控制的列表推导式

语法结构如下:

Python

[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:continuenumbers.append(x+y)

代码实例-计算0到100之间的所有质数:

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]

10.4.4 知识要点

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

(2) 列表推导式本质还是一个for循环,在for循环中每迭代一次,就会在列表中插入一个新的元素。

(3) 在列表推导式中可以嵌套for循环,以及进行条件控制,由此组合成比较复杂的列表推导式。

10.4.5 系统学习python

薯条老师简介:资深技术专家,技术作家,著有《Python零基础入门指南》,《Java零基础入门指南》等技术教程。薯条老师的博客:http://www.chipscoco.com, 系统学习后端,爬虫,数据分析,机器学习、量化投资。