使用for循环返回最多为n的素数列表

时间:2018-03-31 17:48:05

标签: python algorithm list primes

我刚刚学习了learing python,我正在尝试创建一个接受整数的简单函数,并返回从2到该整数的所有素数的列表。

我已创建了该功能,但代码似乎无法正常工作。我找到的解决方案只针对这个问题更有效(和复杂)的方法(比如这个Finding prime numbers using list comprehention),这个问题并没有真正帮助我找到错误。

def list_of_primes(n):
    primes = []
    for y in range (2, n):
        for z in range(2, y):
            if y % x == 0:
                continue
            else:
                primes.append(y)
        primes.sort()
        return primes

代码有什么问题?

3 个答案:

答案 0 :(得分:6)

您的代码中存在多个错误。以下是算法的有效实现。

def list_of_primes(n):
    primes = []
    for y in range (2, n):
        for z in range(2, y):
            if y % z == 0:
                break
        else:
            primes.append(y)
    primes.sort()
    return primes

list_of_primes(20)

# [2, 3, 5, 7, 11, 13, 17, 19]

<强>解释

  • 缩进在Python中是至关重要的
  • 您需要测试y是否可以被z整除,而不是通过尚未定义的变量x进行测试。
  • 对列表进行排序并在最后返回,外部for循环。
  • 当发现非素数时,请使用break跳过一个数字。
  • 在内部else循环中应用for语句,而不是if / else子句的一部分。

答案 1 :(得分:3)

jpp回答修复了这个问题,但是可以通过使内循环只去候选的平方根(加上一个完美的正方形)来改进它。

这是一个常见的错误,它浪费了大量的CPU能力,试图找到不存在的除数。这会将算法从O(n**2)转换为O(n**1.5)

def list_of_primes(n):
    primes = []
    for y in range (2, n) :
        for z in range(2, int(y**0.5)+1):
            if y % z == 0:
                break
        else:
            primes.append(y)
    return sorted(primes)

如果else未达到技巧,仍在for循环中使用break,最后返回sorted(primes)而不是执行排序然后返回

但是生成素数大列表的最佳方法是在循环中使用素数测试,但它是Sieve of Erathosthenes算法。

答案 2 :(得分:1)

以下是您的代码的更正版本(没有测试,但应该有效):

def list_of_primes(upper_bound):
    primes = []
    for candidate in range(2, upper_bound):
        is_prime = True
        for divisor in range(2, candidate):
            if candidate % divisor == 0:
                is_prime = False
                break  # no need to test any further
        if is_prime:
            primes.append(candidate)
    return primes