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能力来查找不存在的除数。这会将算法从
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) |
如果未达到
但是,生成大量素数列表的最佳方法不是在循环中使用素数测试,而是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 |