我正在学习一些python并遇到这个代码,找到所有素数到N个数。
N = 20
nums = xrange(2, N)
for i in xrange(2,8):
nums = filter(lambda x: x == i or x % i, nums)
print nums # [2, 3, 5, 7, 11, 13, 17, 19]
算法工作正常,只有x == i or
部分让我感到困惑。
如果我只是为nums = filter(lambda x: x % i, nums)
输出为[11, 13, 17, 19]
但是,or
语句意味着对于数字[2,3,4,5,6,7]
,代码行将被评估为:
filter(lambda x: x == i, nums)
并且我不知道如何单独产生[2, 3, 5, 7]
这是最终输出的一部分而且是真的。任何人都可以详细说明这一点,因为我已经开始使用这段代码一段时间了,无法理解它。
答案 0 :(得分:2)
这是一个简单的素数筛的实现。如果lambda x: x == i or x % i
或True
,x == i
表达式的评估结果为x % i
。 %
中的x % i
是模数运算符,因此如果x
可被i
整除,则x % i
为零,其结果为False
表达的背景。
答案 1 :(得分:1)
我认为如果您评估并检查此代码的输出,您将更好地了解该程序的确切内容:
N = 20
nums = range(2, N)
for i in xrange(2, 8):
print "NUMS:", nums
new_nums = []
for x in nums:
print "CONDITION: x ({x}) == i ({i}) or x ({x}) % i({i}) == 0 ({x_mod_i})".format(x=x, i=i, x_mod_i=x % i)
if x == i or x % i:
print " => APPEND", x
new_nums.append(x)
nums = new_nums
print "***********"
print nums # [2, 3, 5, 7, 11, 13, 17, 19]