初学者。我试图返回一个包含从0到num的所有素数的列表。有人可以帮我找一下我的代码有什么问题吗?我总是得到一个空列表。非常感谢! (我使用的是python 3.6)
def task(num):
num = int(num)
lst = []
if num < 3:
return lst
else:
for i in range(3,num):
if not i & 1:
lst = lst
else:
primetest = range(3, int(i ** 0.5) + 1, 2)
for n in primetest:
if i % n != 0:
lst.append(i)
return lst
task(5)
更新
谢谢大家的所有评论!真有帮助。
这是我修改过的代码的样子。
def task(num):
num = int(num)
lst = []
if num < 2:
return lst
if num >= 2:
lst.append(2)
for i in range(3, num + 1):
if i % 2 == 1:
switch = True
for n in range(3, int(i ** 0.5) + 1, 2):
if i % n == 0:
switch = False
break
if switch:
lst.append(i)
return lst
答案 0 :(得分:2)
主要问题在于你的内部for循环:
使用您的代码,每当您在i
范围内找到不是primetest
的除数的数字时,您都会在i
后附加列表。
你可能想在这里使用一个布尔值来存储你找到i
的除数这一事实,然后如果你没有将它附加到列表中。
要回答您的问题,您的列表为空,因为示例中的primetest
范围始终为空:
int(3**0.5) + 1 = 3 and int(5**0.5) + 1 = 3
range(3,3,2) = []
数组是空的,因为范围函数不包含上限,并且因为内部循环没有按照预期在代码中执行的操作,结果将是一个空列表,直到任务的参数函数优于或等于9
答案 1 :(得分:1)
你的代码在几个方面都搞错了,告诉我你是否理解为什么以下有效?
def task(num):
num = int(num)
lst = [2]
if num < 3:
return lst
for i in range(3, num + 1):
if i % 2 == 1:
for n in range(3, int(i ** 0.5) + 1, 2):
if i % n == 0:
break
else:
lst.append(i)
return lst
(注意: for else 子句非常自然这里,当你在循环中搜索某些内容时,会使用 for else 子句,当你发现某些东西时你会中断,如果没有遇到中断,并且常规的stopIteration用于退出循环,则执行else部分,我说这很自然,因为在伪代码中你会说像“这样的话,如果我的话数字可以除以小于其平方的另一个数字,而不是素数,否则将其添加到素数列表“请参阅http://book.pythontips.com/en/latest/for_-_else.html以获取更多详细信息”
它绝不是一种快速的方法,但我试图保持尽可能接近你的尝试精神,同时改善代码的美学
答案 2 :(得分:-1)
def prim(z):
lst = []
for i in range(2, z+1):
for j in range(2,i):
if i % j == 0:
break
else:
lst = lst + [i]
return lst
打印(prim(20))
结果:
[2, 3, 5, 7, 11, 13, 17, 19]