1

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

4

2 回答 2

2

这是一个简单的素数筛的实现。该lambda x: x == i or x % i表达式的计算结果为Trueifx == i或 if x % i%inx % i是模运算符,因此 if可x被 整除ix % i为零,它False在表达式的上下文中计算为。

于 2013-10-10T13:02:22.477 回答
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]
于 2013-10-10T13:07:06.600 回答