[Python基础] 列表生成式和生成器表达式

Posted by Chase Shen on 2022-01-28
Estimated Reading Time 6 Minutes
Words 1.5k In Total
Viewed Times

1. 列表生成式

列表生成式是一种 Python 中用来快速创建列表的语法结构。它能够以简洁的方式基于现有的可迭代对象生成新的列表。

列表生成式的基本语法如下:

1
[expression for item in iterable]

其中:

  • expression 是对每个元素进行计算或处理的表达式,可以是变量、函数调用、数学运算等。
  • item 是可迭代对象中的每个元素。
  • iterable 是一个可迭代对象,如列表、元组、集合等。

除了基本的语法结构外,列表生成式还支持在末尾添加条件表达式,用于对元素进行过滤,语法如下:

1
[expression for item in iterable if condition]

其中 if condition 是一个可选的条件,只有满足条件的元素才会包含在最终的列表中。

下面是一些示例来说明列表生成式的使用:

1. 基本示例

1
2
3
# 创建一个包含 1 到 5 的平方的列表
squares = [x**2 for x in range(1, 6)]
# 输出结果:[1, 4, 9, 16, 25]

2. 使用条件过滤

1
2
3
# 创建一个包含 1 到 10 的奇数的列表
odd_numbers = [x for x in range(1, 11) if x % 2 != 0]
# 输出结果:[1, 3, 5, 7, 9]

3. 对元素进行变换

1
2
3
4
# 创建一个包含字符串列表中每个字符串的长度的列表
strings = ['apple', 'banana', 'cherry']
lengths = [len(s) for s in strings]
# 输出结果:[5, 6, 6]

4. 嵌套列表生成式

1
2
3
4
5
6
7
# 创建一个包含两个列表中对应元素的和的列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
result = [x + y for x in list1 for y in list2]
# 输出结果:[5, 6, 7, 6, 7, 8, 7, 8, 9]
result2 = [x + y for x in 'ABCDE' for y in '1234567']
# 输出结果:['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7']

通过列表生成式,可以以简洁的方式快速创建列表,使代码更加清晰和易读。但用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间。

2. 生成器表达式

生成器是一种特殊的迭代器,它可以用来逐个生成值而不是一次性生成所有值。在 Python 中,生成器可以使用生成器表达式或者通过定义一个函数来创建。
生成器表达式与列表生成式非常相似,但使用圆括号而不是方括号。生成器表达式创建的不是一个列表而是一个生成器对象,它们允许你逐个生成元素,而不是一次性生成所有元素,从而在处理大型数据集时节省内存。

生成器对象

  • 生成器对象是迭代器的一种特殊形式,它可以逐个生成值。
  • 生成器对象可以使用 next() 函数逐个获取值,也可以使用 for 循环逐个迭代值。

下面是一个简单的示例,结合列表生成式和生成器表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 列表生成式
squares_list = [x**2 for x in range(1, 6)]
# 生成器表达式
squares_generator = (x**2 for x in range(1, 6))

print("列表生成式生成的列表:", squares_list)
print("生成器表达式生成的生成器对象:", squares_generator)

# 遍历列表生成式生成的列表
for square in squares_list:
print(square, end=' ')
print()

# 遍历生成器表达式生成的生成器对象
for square in squares_generator:
print(square, end=' ')
print()

输出结果:

1
2
3
4
列表生成式生成的列表: [1, 4, 9, 16, 25]
生成器表达式生成的生成器对象: <generator object <genexpr> at 0x7f785e6bf6d0>
1 4 9 16 25
1 4 9 16 25

从输出结果可以看出,列表生成式生成了一个包含所有平方数的列表,而生成器表达式生成了一个生成器对象。生成器对象可以使用 next() 函数逐个获取值,也可以使用 for 循环逐个迭代值。

生成器在处理大型数据集时非常有用,因为它们可以节省内存,并且在需要时逐个生成值。与列表生成式相比,生成器表达式具有更好的性能和更低的内存消耗,每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)。

3. 生成器函数

生成器函数是一种特殊的函数,它能够暂停执行并返回一个中间结果,然后在需要时继续执行,以逐个生成值。

  • 使用 yield 关键字定义的函数被称为生成器函数。
  • 当调用生成器函数时,它返回一个生成器对象,而不是立即执行函数体中的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def my_generator():
yield 1
yield 2
yield 3

# 调用生成器函数,获取生成器对象
gen = my_generator()

# 使用 next() 函数逐个获取值
print(next(gen)) # 输出:1
print(next(gen)) # 输出:2
print(next(gen)) # 输出:3

# 使用 for 循环逐个迭代值
for value in my_generator():
print(value)
# 输出:
# 1
# 2
# 3

工作原理:

  • 当生成器函数被调用时,函数体内的代码并不会立即执行,而是返回一个生成器对象。
  • 当使用 next() 函数获取值时,函数体内的代码会执行到第一个 yield 语句处,然后暂停并返回该值。
  • 下一次调用 next() 函数时,函数会从上次暂停的位置继续执行,直到遇到下一个 yield 语句,然后再次返回值并暂停。
  • 这个过程会一直持续,直到函数执行完毕或者遇到 return 语句。

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !