获取python 3

时间:2018-05-14 06:56:08

标签: python

初​​学者。我试图返回一个包含从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

3 个答案:

答案 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]