素数测试在 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
循环,一个累加器如any
或all
,或直接由next
内置。
问题是包含 False
的列表求值为布尔值 True
:
>>> isPrime(4)
[False]
>>> bool([False])
True
我一直在尝试压缩我的代码以在 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
循环,一个累加器如any
或all
,或直接由next
内置。
问题是包含 False
的列表求值为布尔值 True
:
>>> isPrime(4)
[False]
>>> bool([False])
True