我刚刚学习了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
代码有什么问题?
答案 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]
<强>解释强>
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