关于python:使用for循环返回最多n个素数的列表

Return list of primes up to n using for loop

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

我已经创建了函数,但是代码似乎无法正常工作。 我已经找到了针对该问题的更高效(且更复杂)方法(例如使用列表理解来查找质数的方法)的解决方案,但这并不能真正帮助我发现错误。

1
2
3
4
5
6
7
8
9
10
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

代码有什么问题?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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跳过数字。
  • 在内部for循环上应用else语句,而不是将其作为if / else子句的一部分。


jpp答案解决了该问题,但可以通过使内部循环仅到达候选对象的平方根(为完美平方加上一个)来改善此问题。

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

1
2
3
4
5
6
7
8
9
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)

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

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


这是您的代码的更正版本(虽然未测试,但应该可以使用):

1
2
3
4
5
6
7
8
9
10
11
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