Primality Test不适用于Python

时间:2015-01-07 23:17:40

标签: python list-comprehension primes

我一直在尝试在python中压缩我的代码进行素性测试,以便它使用列表推导,但由于某种原因它没有返回正确的结果:

def isPrime(n):
    if n > 1:
        for i in range(2, int(n ** 0.5) + 1):
            if n % i == 0:
                return False
        return True

这是我当前素性测试的代码,但我想简要介绍一下:

def isPrime(n):
if n > 1:
    return [False for i in range(2, int(n ** 0.5) + 1) if n % i == 0]
    return True

我尝试了上述内容,但它输出的所有非素数整数最多为n。我做错了什么?

3 个答案:

答案 0 :(得分:3)

如果你想要False 任何较小的数字是除数,请直接对其进行编码:

def isPrime(n):
    return n<=1 or not any(i for i in range(2, int(n ** 0.5) + 1) if n % i == 0)

请注意,这使用的是 genexp ,而不是 listcomp ,因为这允许any在找到任何合适的{{}时立即终止整个操作1}}除数因而知道i不能是素数。列表推导生成所有项目的内存列表,而生成器表达式一次生成一个项目,并且只要它们被要求“下一个”(通过n循环,累加器,例如forany,或直接由all内置的。)

答案 1 :(得分:2)

您可以使用all

>>> def prime_check(n):
...     if n > 1:
...         return all(False for i in range(2, int(n ** 0.5) + 1) if n % i == 0)
... 
>>> prime_check(6)
False
>>> prime_check(23)
True
>>> prime_check(108)
False
>>> prime_check(111)
False
>>> prime_check(101)
True

答案 2 :(得分:2)

问题是包含False的列表评估为布尔值True

>>> isPrime(4)
[False]
>>> bool([False])
True