目录
[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/ 对本节教程有任何不懂的同学,亦可在评论区中进行评论。薯条老师会详细解答你们提出的每一个问题。