Python推导式
Python推导式是一种可以从一个数据序列构建另一个新的数据序列的结构体。
除了列表推导式 (list comprehension) 以外,还有字典(dict)、集合(set)推导式。它们的语法格式如下:
# 列表:使用方括号
[expression for item in iterable if condition]
# 字典:使用花括号 `{}` 和提供键值对
{ key_expr: value_expr for value in collection if condition }
#集合:使用花括号 `{}`,但只包含单个表达式
{ expression for item in Sequence if conditional }
示例如下:
squares = [x**2 for x in range(10) if x % 2 == 0]
print(squares)
# 结果: [0, 4, 16, 36, 64]
squares_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(squares_dict)
# 结果: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
squares_set = {x**2 for x in range(10) if x % 2 == 0}
print(squares_set)
# 结果: {0, 64, 4, 36, 16}
生成器表达式
生成器表达式(generator expression) 与列表推导式类似,但它会返回一个生成器对象。生成器对象是惰性求值的,只有在迭代时才会计算出每一个值,节省内存。
语法为:
(expression for item in iterable if condition)
注意:生成器表达式使用的是圆括号。
由于语法结构类似,有些地方会把生成器表达式称为“元组推导式”,或者把两者混为一谈。通常,所谓的“元组推导式”实际上是指生成器表达式。
如果按照Python推导式的定义,”元组推导式“应该返回一个元组,但实际输出结果是一个生成器对象。
示例:
squares_gen = (x**2 for x in range(10) if x % 2 == 0)
print(squares_gen)
# 结果: <generator object <genexpr> at 0x7d1915779770>
在上述示例中,生成器表达式返回一个生成器对象,而不是元组。
元组构造器:
如果想要生成元组,而不是生成器对象,可以结合生成器表达式和tuple()
构造函数:
squares_tuple = tuple(x**2 for x in range(10) if x % 2 == 0)
# 结果: (0, 4, 16, 36, 64)
总结来说,生成器表达式用于惰性求值和节省内存,而“元组推导式”并不存在,生成元组需结合生成器表达式与tuple()
函数
小结
# 列表推导式
list_comprehension = [expression for item in iterable if condition]
# 字典推导式
dict_comprehension = {key_expr: value_expr for item in iterable if condition}
# 集合推导式
set_comprehension = {expression for item in iterable if condition}
# 生成器表达式
generator_expression = (expression for item in iterable if condition)
# 生成元组
tuple_from_generator = tuple(expression for item in iterable if condition)