素数打印机停在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为-5
到256
之间的值实现一个整数数组,当您在此范围内创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:
说明: is
testing如果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.")
问题是你使用的is
。 is
不检查是否相等,它检查一个对象的身份(内存地址); 对象是否与对象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
的函数来最大化代码重用 。 现在你可以通过prime
function,无论你喜欢什么数字来检查它是否是质数,比对你想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