在做一些列表理解练习时,我不小心做了下面的代码。这最终会为列表中的所有 16 个条目打印 True/False。
threes_and_fives =[x % 3 == 0 or x % 5 == 0 for x in range(16)]
print threes_and_fives
在我使用它之后,我能够得到我想要的结果,它打印了该列表中可被 3 或 5 整除的数字。
threes_and_fives =[x for x in range(16) if x % 3 == 0 or x % 5 == 0]
print threes_and_fives
我的问题是为什么第一个代码评估为真或假而另一个没有?我正在尝试掌握 python,所以解释越多越好 :) 谢谢!
请您参考如下方法:
您可能忽略了 Python 中的关系运算符并没有什么特别之处,它们和其他运算符一样都是表达式,只是碰巧产生 bool 值。举几个例子:
>>> 1 + 1 == 2
True
>>> 2 + 2 == 5
False
>>> [1 + 1 == 2, 2 + 2 == 5]
[True, False]
列表理解只是将涉及可迭代序列元素的表达式收集到列表中:
>>> [x for x in xrange(5)] # numbers 0 through 4
[0, 1, 2, 3, 4]
>>> [x**2 for x in xrange(5)] # squares of 0 through 4
[0, 1, 4, 9, 16]
您的第一个表达式就像那样工作,但是表达式会生成 bool 值:它告诉 Python 组装一个 bool 值列表,这些值对应于匹配的序数是否可以被 3 或 5 整除。
您真正想要的是一个按指定条件过滤的数字列表。 Python 列表理解通过可选的 if 子句支持这一点,该子句采用表达式并将结果列表限制为 bool 表达式返回真值的那些项目。这就是为什么您的第二个表达式可以正常工作的原因。
