这段代码(Python 2.7)发生了什么?

时间:2016-11-30 06:33:42

标签: python

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

我收到了一项任务,我必须找到所有素数的总和,最多200万,我写的代码原来花了太长时间才能运行所以老师给了我这个算法来检查数字是否为素数。但是,我似乎并没有得到返回所有声明中的内容以及与素数有什么关系

1 个答案:

答案 0 :(得分:2)

因为我对你不好。让我加倍努力并向你解释。

首先阅读: http://wiki.planetmath.org/howtofindwhetheragivennumberisprimeornot

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

让我们看看这里发生了什么。

Step1。 if n % 2 == 0 and n > 2
检查数字是否可以被2整除,也可以大于2.如果这些条件失败则数字不是素数。不要继续进行并返回false。

Step2a。 int(math.sqrt(n)) + 1
计算数字的平方根(它可能是浮点数,所以我们将它转​​换为int)然后加1。

Step2b。 range(3, int(math.sqrt(n)) + 1, 2)
创建一个从3开始到步骤2a中计算的值的列表,步长为2.所以基本上它将获得从3到step2a值的所有奇数。为何奇怪?因为evens不是素数!

Step2c。 (n % i for i in range(3, int(math.sqrt(n)) + 1, 2)
在这一步中,我们迭代在2b中创建的列表并将n除以所有这些数字(在这里除以我的意思是取模数),我们将结果存储在迭代器对象中。

Step2d。 all()
如果n可以被2b中任意数量的列表整除,那么0将存储在n % i上。而且我们知道素数不能被除1以外的任何数字整除。如果我们得到0那么我们就完成了,它不是素数 只有当所有值都不为零时,all()才会返回true 例如。
print all([1,2,3,4,5])-->True
print all([0,1,2,3,4])-->False

我希望,现在你很清楚。