Python 我的iPrime';s范围不起作用,它只给出第一个数字

Python 我的iPrime';s范围不起作用,它只给出第一个数字,python,range,Python,Range,它给我的结果是: #!/usr/local/bin/python3.6 def isPrime(n): if n == 1: print("1 is a special") return False for x in range(2, n): if n % x == 0: print("{} is equal to {} * {}".format(n, x, n // x)) return False else:

它给我的结果是:

#!/usr/local/bin/python3.6

def isPrime(n):


if n == 1:
    print("1 is a special")
    return False


for x in range(2, n):
    if n % x == 0:
        print("{} is equal to {} * {}".format(n, x, n // x))
        return False
    else:
        print(n, " is a prime number")
        return True


for n in range(1, 21):
    isPrime(n)

isPrime(2)
isPrime(21)
isPrime(25)
没有(2)的结果, 这也是“奇偶”数的结果,而不是“isPrime”,因为在范围(2,n)内的代码“中,它只使用数字2计算x


我的代码有什么问题?

不要在第一次迭代中返回
True
。不可被2整除并不能使其成为素数:

1 is a special
3  is a prime number
4 is equal to 2 * 2
5  is a prime number
6 is equal to 2 * 3
7  is a prime number
8 is equal to 2 * 4
9  is a prime number
10 is equal to 2 * 5
11  is a prime number
12 is equal to 2 * 6
13  is a prime number
14 is equal to 2 * 7
15  is a prime number
16 is equal to 2 * 8
17  is a prime number
18 is equal to 2 * 9
19  is a prime number
20 is equal to 2 * 10

21  is a prime number
25  is a prime number
这样做:

for x in range(2, n):  # it would be enough to loop to sqrt(n)
    if n % x == 0:
        # you know it is NOT prime after first divisor found
        return False 
# you only know it IS prime after you tried all possible divisors
return True

注意缩进:else现在与for(而不是if)对齐,它应该可以解决您的问题。否则意味着x在n上迭代,因此n%x永远不是0=>你得到了一个素数

请修正你的缩进。很难按原样阅读。返回真或假;将导致您中断该函数。1.)在
范围(2,n)
中,对于n=2,将为您提供
[]
空列表。2.)对于x的第一个值,即对于2,您使用的是
返回True
。如果您的数字可被2整除,则返回False,对于奇数返回True。对于范围内的x(2,n/2)或范围内的x(2,math.sqrt(n))的偶数也应为enoughyes,确切地说。。。你的解释很详细,我明白我的错。。。谢谢,你的解释很好,我完全理解
def isPrime(n):
    if n == 1: 
        print("1 is a special")
        return False
    for x in range(2, n):
        if n % x == 0:
            print("{} is equal to {} * {}".format(n, x, n // x))
            return False
    print(n, " is a prime number")
    return True

for n in range(1, 21):
    isPrime(n)
for x in range(2, n):
    if n % x == 0:
        print("{} is equal to {} * {}".format(n, x, n // x))
        return False
else:
    print(n, " is a prime number")
    return True