我一直在尝试在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。我做错了什么?
答案 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
循环,累加器,例如for
或any
,或直接由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