清除素数算法

时间:2013-10-10 12:53:23

标签: python filter lambda

我正在学习一些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]这是最终输出的一部分而且是真的。任何人都可以详细说明这一点,因为我已经开始使用这段代码一段时间了,无法理解它。

2 个答案:

答案 0 :(得分:2)

这是一个简单的素数筛的实现。如果lambda x: x == i or x % iTruex == 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]