获取python 3中的素数列表

获取python 3中的素数列表,python,Python,初学者。我正在尝试返回一个包含从0到num的所有素数的列表。有人能帮我找到我的代码有什么问题吗?我总是得到一张空名单。谢谢!(我正在使用python 3.6) def任务(num): num=int(num) lst=[] 如果num3.0的平方根。你打算在这里做什么?lst=lst?@juanpa.arrivillaga他可能是指“什么都不做”的陈述。当然还有更好的方法(continue,pass或最棒的:只是否定条件并完全放弃不做任何事情的情况)不要忘记2也是一个素数:如果num>=2:ls

初学者。我正在尝试返回一个包含从0到num的所有素数的列表。有人能帮我找到我的代码有什么问题吗?我总是得到一张空名单。谢谢!(我正在使用python 3.6)

def任务(num):
num=int(num)
lst=[]
如果num<3:
返回lst
其他:
对于范围内的i(3,num):
如果不是i&1:
lst=lst
其他:
primetest=范围(3,int(i**0.5)+1,2)
对于primetest中的n:
如果我%n!=0:
一、附加(一)
返回lst
任务(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
def任务(num):
num=int(num)
lst=[]
如果num<2:
返回lst
如果num>=2:
一、追加(2)
对于范围内的i(3,num+1):
如果i%2==1:
开关=真
对于范围(3,int(i**0.5)+1,2)内的n:
如果i%n==0:
开关=假
打破
如果开关:
一、附加(一)
返回lst

主要问题在于内部for循环:

每次在
primetest
范围内找到一个不是
i
除数的数字时,您都会在列表中添加
i

您可能希望在此处使用布尔值来存储您找到的除数为
i
的事实,然后仅在没有找到的情况下将其附加到列表中

要回答您的问题,您的列表为空,因为在您的示例中,
primetest
范围始终为空:

int(3**0.5) + 1 = 3  and   int(5**0.5) + 1 = 3
range(3,3,2) = []

数组是空的,因为范围函数不包含上限,并且由于内部循环没有执行代码中预期的操作,因此结果将是一个空列表,直到任务函数的参数优于或等于9为止。您的代码在几个计数上出错,告诉我,如果你明白为什么下面的工作

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
def任务(num):
num=int(num)
lst=[2]
如果num<3:
返回lst
对于范围内的i(3,num+1):
如果i%2==1:
对于范围(3,int(i**0.5)+1,2)内的n:
如果i%n==0:
打破
其他:
一、附加(一)
返回lst
(注意:for else子句在这里是非常自然的,for else子句在循环中搜索某物时使用,在发现某物时中断,如果没有中断,则使用常规的stopIteration退出循环,执行else部分,我在这里说它是自然的,因为在伪代码中,您会说一些类似于“如果我的数字可以除以另一个小于其平方的数字,则它不是素数,否则将其添加到素数列表中”有关详细信息,请参阅)

这绝不是一种快速的方法,但我试图在改进代码美学的同时尽可能接近您的尝试精神

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
印刷品(原件(20))

结果:


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

您试图通过这种代码的和平
int(i**0.5)实现什么
?@YaroslavSurzhikov很可能就是它的作用:取
i
>9**0.5
->
3.0
的平方根。你打算在这里做什么?
lst=lst
?@juanpa.arrivillaga他可能是指“什么都不做”的陈述。当然还有更好的方法(
continue
pass
或最棒的:只是否定条件并完全放弃不做任何事情的情况)不要忘记2也是一个素数:
如果num>=2:lst.append(2)
这也显示了(在我看来)非常有用但“for else”使用不足的情况考虑到python Constructop可能是python初学者,您可能想简单介绍一下
for else
构造是如何运行的,因为这对初学者来说并不明显;只有在循环“自然”完成后,才输入
else
子句,也就是说,在没有遇到
中断的情况下
。@Zinki添加了一个解释,并解释了为什么在我的opinion@VeltzerDoron非常感谢您的评论和帮助。不过有一个简单的问题,当我使用task(20)测试代码时,您的代码返回一个[3,5,7,9,15]列表9,15显然不是素数,17和19也不见了。你介意修正你的代码吗,这样我就可以知道哪里出错了?谢谢。当余数为零时,打破循环,也就是说,如果I%n==0:
。2不见了!
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