素数打印机停在251,为什么?

我今天开始学习Python,并想出了创build一个打印所有素数从0到10000的程序的想法。我设法让我的程序打印出所有素数,直到251,在这一点上,它停止打印数字。 为什么这样做?

这里是代码:

for numberToCheck in range(2,10000): divider = 2 while numberToCheck > divider: if numberToCheck % divider is 0: break else: divider += 1 if numberToCheck is divider: print(numberToCheck, "is a prime number.") 

问题是你正在使用is而不是==is运算符执行对象标识比较,由于实现细节,对于256以下的所有数字,“正常工作”。 251是256以下的最大素数( 在这里检查,下一个素数是257),之后返回False

 >>> 254 + 1 is 255 True >>> 255 + 1 is 256 True >>> 256 + 1 is 257 False 

等号运算符是==

 >>> 254 + 1 == 255 True >>> 255 + 1 == 256 True >>> 256 + 1 == 257 True 

使用==来检查数字的相等性:

 for numberToCheck in range(2,10000): divider = 2 while numberToCheck > divider: if numberToCheck % divider is 0: break else: divider += 1 if numberToCheck == divider: print(numberToCheck, "is a prime number.") 

运算符是用来检查两个对象的id ,而==运算符检查它们的值。

Python为-5256之间的值实现一个整数数组,当您在此范围内创build一个int对象时,您将获得对现有数组实现的引用。 这就是为什么在这个范围内的所有整数对象的id是相同的,但是这个范围之外的整数对象是不同的,如下所示:

 >>> a = -6 >>> b = -6 >>> a is b # a and b has different id False >>> a = -5 >>> b = -5 >>> a is b # a and b has same id True >>> a = 256 >>> b = 256 >>> a is b # a and b has same id True >>> a = 257 >>> b = 257 >>> a is b # a and b has different id False 

这就是原因,你的程序打印素数到251但不是下一个素数257 ,然后你的程序运行到numberToCheck达到9999

此外,你可能会考虑一个更快的algorithm来产生素数,比如Eratosthenes的Sieve 。

基本上,你应该检查numberToCheck整除之间的所有素数 2和(以前发现numberToCheck主要或平方根,以较less者为准)。

错误是在最后if 。 从它改变

 if numberToCheck is divider: 

 if numberToCheck == divider: 

说明: istesting如果refences是相等的,而==检查值的相等(更具体地说,它调用__eq__方法在您的元素)

你有第一个素数打印到251的原因是因为pythoncaching所有的小整数。

例如:

 >>> 100 == 10**2 True >>> 100 is 10**2 True >>> 1000 == 10**3 True >>> 1000 is 10**3 False 

(从这里取得的例子)你应该使用is只是检查引用(对象不仅应该是相等的,但相同的实例)或比较None

不要把整数与is进行比较。 总是使用==

==应该用来比较数字。

这里是固定的代码:

 for numberToCheck in range(2,10000): divider = 2 while numberToCheck > divider: if numberToCheck % divider == 0: break else: divider += 1 if numberToCheck == divider: print(numberToCheck, "is a prime number.") 

问题是你使用的isis不检查是否相等,它检查一个对象的身份(内存地址); 对象是否与对象b相同?

请参考以下问题:

Python中的==和`is`是否有区别?

“是”运算符的意外行为与整数

为什么(0-6)是-6 =假?


为了解决你的问题:

 def prime(numberToCheck): divider = 2 while numberToCheck > divider: if numberToCheck % divider == 0: break else: divider += 1 if numberToCheck == divider: print(numberToCheck, "is a prime number.") 

这里有一点小小的注释,但在更大的应用程序中可能是至关重要的:我创build了一个名为prime的函数来最大化代码重用 。 现在你可以通过primefunction,无论你喜欢什么数字来检查它是否是质数,比对你想testing的数字进行硬编码更好。

你不能把数字和is进行比较。 一直使用==进行平等testing。

你正在使用的是,而不是==。 无论如何,明智的代码是浪费资源检查像这样的素数。 你只应该从2到sqrt(n)检查,你应该保持素数,只检查他们,直到你到达他们,例如你检查是否数字41是素数,检查质数2 3 5,然后你知道它不是一个素数(因为素数和sqrt之间的所有其他数字不是素数,所以你已经检查了它们)创build一个素数列表。

试试这个代码:

 import math primes = [2] for n in range(3,100): for i in primes: if n in primes: break if n%i == 0: break if i> math.sqrt(n): primes.append(n) break 

这个链接将帮助你为什么不使用是

 In [5]: a = 254+1 In [6]: b = 255 In [7]: a is b # both are same objects Out[7]: True In [8]: id(a) Out[8]: 37644344 # id of a In [9]: id(b) Out[9]: 37644344 # same id as a 

为> 256

 In [10]: a = 256+1 In [11]: b = 257 In [12]: a is b # both are different objects but values are same Out[12]: False In [13]: id(a) Out[13]: 39721992 # id of a In [14]: id(b) Out[14]: 39722592 # new id created not same as a 

总是比较对象而不是数值

为什么只能达到256?

从Python文档

当前的实现为-5到256之间的所有整数保留一个整数对象数组,当你在那个范围内创build一个int时,你实际上只是返回一个对现有对象的引用。

当你指定a=255只是你添加a引用excite 255.当a=257新的inttypes的对象将被创build