我使用的是Python 3,我的问题是为什么输出不同?
print([x * x for x in range(2, 5, 2) if x % 4 == 0]) # returns [16]
q = [x * x for x in range(2, 5, 2)]
print(list(filter(lambda x: x % 4 == 0, q))) # returns [4, 16]
答案 0 :(得分:4)
print(([x * x for x in range(2, 5, 2) if x % 4 == 0]))
此处,range
评估为[2,4],只有[4]
才能超过if条件
q = ([x * x for x in range(2, 5, 2)])
print(list(filter(lambda x: x % 4 == 0, q)))
此处,q
包含每个元素的x*x
,因此列表为[2*2, 4*4] = [4, 16]
,两个元素都超过了过滤器选择器
答案 1 :(得分:2)
因为q
包含正方形
In [2]: q
Out[2]: [4, 16]
并且lambda x: x % 4 == 0
将为这两者返回True
:
In [3]: 4 % 4 == 0
Out[3]: True
In [4]: 16 % 4 == 0
Out[4]: True
列表理解在 执行检查后将数字 与<2> 4 2 >):
In [5]: 2 % 4 == 0
Out[5]: False
因此, 2 * 2 = 4 将不会包含在列表中。
简而言之,如果您想获得相同的行为,请在计算余数之前将列表理解修改为平方数:
[x * x for x in range(2, 5, 2) if pow(x, 2, 4) == 0] # [4, 16]
# ↖ equivalent to (x ** 2) % 4
答案 2 :(得分:1)
在前者中,[2,4]
中的每个项目都会针对x % 4 == 0
进行检查。在后者中,filter
将lambda应用于q
中的每个项目,其中不是 [2,4]
,而是[4,16]
。因此,x % 4 == 0
返回true两次。