素数测试在 Python 中不起作用

Primality Test not working in Python

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

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。我做错了什么?

您可以使用 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

如你所愿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 终止整个操作一旦它找到任何合适的 i 除数并因此知道 n 不可能是质数。列表推导生成一个包含所有项的内存列表,而生成器表达式一次生成一个项,并且只要它们被要求 "the next one"(通过 for 循环,一个累加器如anyall,或直接由next内置。

问题是包含 False 的列表求值为布尔值 True:

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