列表解析
列表解析(List comprehension)是一种Python语法,可以用简洁的方式创建一个新的列表。
列表解析的语法如下:
[expression for item in iterable if condition]
其中,
- expression 是用来生成列表元素的表达式;
- item 代表 iterable(如列表、字符串等)中的每个元素;
- condition 是一个可选的条件,只有满足条件的元素才会被包含在新列表中。
示例:
# 1到5的平方
squares = [x**2 for x in range(1, 6)]
print(squares) # 输出:[1, 4, 9, 16, 25]
# 过滤出偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers) # 输出:[2, 4, 6, 8, 10]
# 只保留长度大于等于5的字符串
words = ["apple", "banana", "pear", "orange"]
long_words = [word for word in words if len(word) >= 5]
print(long_words) # 输出:['apple', 'banana', 'orange']
列表解析与使用 for 循环和条件语句来创建列表的效果是一样的,但列表解析通常更简洁且易读。
列表解析可以嵌套,可以使用多个 for 循环和多个条件来生成更复杂的列表。
# 1到4的乘积
products = [x * y for x in range(1, 3) for y in range(3, 5)]
print(products) # 输出:[3, 4, 6, 8]
使用列表解析的好处是可以提高代码的可读性,减少代码量,并且在某些情况下可以提高运行速度。
生成器表达式
生成器表达式(Generator expression)是一种类似于列表解析的语法,可以用于创建一个生成器(Generator)对象。
生成器表达式的语法与列表解析相似,只是将方括号 “[]” 替换为圆括号 "()”。
示例:
# 1到5的平方的生成器
squares = (x**2 for x in range(1, 6))
print(squares) # 输出:<generator object <genexpr> at 0x000001>
# 遍历生成器并输出结果
for square in squares:
print(square) # 依次输出:1, 4, 9, 16, 25
与列表解析不同,生成器表达式返回的是一个生成器对象,而不是一个列表对象。生成器是一个能够惰性地生成值的对象,只有在需要时才会计算和产生值,从而节省内存空间。这在处理大量数据时非常有用。
生成器表达式也可以用于过滤和转换数据,与列表解析类似。
# 过滤出偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = (x for x in numbers if x % 2 == 0)
print(even_numbers) # 输出:<generator object <genexpr> at 0x000002>
# 遍历生成器并输出结果
for number in even_numbers:
print(number) # 依次输出:2, 4, 6, 8, 10
与列表解析相比,生成器表达式的好处是可以节省内存空间,并且适用于处理大型数据集。但在需要多次遍历结果或需要索引访问元素时,列表解析可能更适合。