问题 函数is_prime - 错误


这是来自codeacademy.com的问题,我正在学习Python。 所以我想要的是定义一个检查数字是否为素数的函数。 如果是,则返回True。 如果不是,则返回False。

这是我的代码:

def is_prime(x):
    lst = []       # empty list to put strings 'False' and 'True'

    for i in range(2,x): # starting at 2 and not including x (number 1 is a divisor of all numbers

        if x <= 2:           # [1] see bellow the explanation
            lst.append('False')
            break

        elif x % i == 0: # if x is divisible by i(number between 2 and not including x)
            lst.append('False')
            break        # break, because we already know x is not prime

        elif x % i > 0:
            lst.append('True') # x is not divisible by i

    if 'False' in lst:
        return False     #  x is not prime - return False

    else:
        return True  # 'True' is in lst, so x is prime - return True

print is_prime(-2) # [2] I get an error here. See below

[1] - 我做了这个条件,因为在codeacademy中它说:     “暗示     请记住:所有小于2的数字都不是素数!“

[2] - 当我跑步时,例如'print is_prime(11)'或'is_prime(6)'它运作正常。所以我提交了答案,但是codeacademy不接受它。它说: “你的函数在is_prime(-2)上失败。当它返回False时返回True。”


5194
2017-12-22 10:10


起源

嗨,欢迎来到StackOverflow。实际上,这是一个非常好的问题,并且您提供了重现问题所需的所有信息 - 这对于StackOverflow第一张海报来说非常罕见。所以祝贺你(以及你的英语)。很高兴有你在这里! - Tim Pietzcker
我强烈推荐 pythontutor.com 用于可视化执行:如果你去那里,并将你的代码粘贴到执行窗口,你就会明白为什么会得到 True 对于 is_prime(-2)。 - Mark Dickinson
除此之外,您无需检查之间的所有数字 2 和 x 如果你想找到素数 - int(math.sqrt(x)) 是一个足够高的上边界。 - Tim Pietzcker
就像@TimPietzcker所说的那样,问题就是+1 ...如果SO上的每个人都可以这样,那么在你这个年纪...... :) - Maxime Lorant
谢谢大家!你真的激励我继续这个令人敬畏的编程世界...... - vicaashow


答案:


让我们看看你进入后会发生什么 -2

  • range(2,-2) 是空的,所以 for 循环从不运行。
  • 因此, lst 还是 [] 循环之后。
  • 因此, 'False' in lst 是 False
  • 因此, return True 被执行。

11
2017-12-22 10:13



非常感谢你!我没有意识到这一点!这个社区非常有帮助(: - vicaashow


什么时候 x 是 -2range(2, x) 将产生一个空列表。

print range(2, -2) # will print []

因此,循环内的循环和if条件将不会被执行。将检查最后一个if条件而不是 'False' 在里面 lst。所以,它返回 True

您可以像这样编写相同的程序

def is_prime(x):
    if x < 2:
        return False
    prime_flag = True
    for i in range(2,x):
        if x % i == 0:
            prime_flag = False
            break
    return prime_flag

print is_prime(-2)

4
2017-12-22 10:13



非常感谢你!我没有意识到这一点!这个社区非常有帮助(: - vicaashow
不用谢 :) - thefourtheye


def is_prime(x):  
    if x < 2:  
        return False  
    for n in range(2, (x)-1):  
        if x % n == 0:  
            return False  
    return True

0
2018-05-22 18:58



请考虑稍微解释一下您的代码,而不是仅仅向公众公开。 - philnate