【问题标题】:Primality Test not working in Python素性测试在 Python 中不起作用
【发布时间】:2015-01-07 23:17:40
【问题描述】:

我一直在尝试压缩我的代码以在 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。我做错了什么?

【问题讨论】:

标签: python list-comprehension primes


【解决方案1】:

如你所愿 False 如果 any 较小的数字是一个除数,直接这样编码:

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 不能是素数。列表推导生成所有项目的内存列表,而生成器表达式一次产生一个项目,并且仅在它们被要求“下一个”时(通过for 循环,累加器如作为anyall,或直接通过next 内置)。

【讨论】:

  • python -m timeit 是回答这个问题和类似问题的最佳方式。将不同名称的感兴趣的替代函数放在a.py 中,然后执行python -mtimeit -s'import a' 'a.isPrimeV1(248)' 等等。
  • not any(i for i in range if condition)?那真的有必要吗?为什么不all(n%i for i in range(2, int(n ** 0.5) + 1))
  • @Rawing,这两个表达式等价于德摩根定理(扩展到量词);所以两者都不是“真正必要的”,因为一个人总是可以替代另一个。这就像问两个ints aba + b“真的有必要”和“为什么不b + a”......一个相当没有实际意义的几个问题:-)。
【解决方案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

【讨论】:

    【解决方案3】:

    问题是包含False 的列表计算为布尔值True

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多