python推导式(comprehensions)
推导式(comprehensions:推导式,也有人翻译为解析式)用来快速完成一些常见功能,从而减轻了 Python程序员的负担。( 推导式的常用句法元素,见: https://docs.python.org/zh-cn/3/reference/expressions.html?highlight=comprehension#displays-for-lists-sets-and-dictionaries )
常见的推导式有:
列表推导式:可迭代对象为list
集体推导式:可迭代对象为set
字典推导式:可迭代对象为dict
先看列表推导式:
squares = [x * x for x in range(10)]
这个推导式生成一个列表,包含从 0到 9的所有整数的平方,参见下图:
如果想用纯 for 循环构建相同的列表,可能会这么写:
squares = []
for x in range(10):
squares.append(x * x)
归纳之,会得到如下的模板:
values = [expression for item in collection]
上面的列表推导式“模板”等价于下面的 for 循环:
values = []
for item in collection:
values.append(expression)
这里首先设置一个新的列表实例来接受输出值,然后遍历容器(collection)中的所有元素,用任意表达式处理每个元素,接着将各个结果添加到输出列表中。
现在再为这个模板添加一个更有用的功能,即使用条件来过滤元素。
squares = [x * x for x in range(10)
if x % 2 == 0]
这个列表推导式将得到从 0到 9所有偶数整数的平方组成的列表。它使用取模(%)运算符返回两数相除后的余数,在这个例子中用来测试一个数是否是偶数,产生的结果如下:
[0, 4, 16, 36, 64]
这个新的列表推导式的等价的 for 循环是:
squares = []
for x in range(10):
if x % 2 == 0:
even_squares.append(x * x)
下面是集合推导式:
{ x * x for x in range(-9, 10) }
产生的结果如下:
{64, 1, 0, 36, 4, 9, 16, 81, 49, 25}
列表会保留元素的顺序,但 Python集合是无序类型。所以在将元素加到 set 容器时顺序是随机的。
又如:
squared = {x**2 for x in [1, 1, 2]}
print(squared) #输出: {1, 4}
下面是字典推导式:
{ x: x * x for x in range(5) }
产生的结果如下:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}