Python 素数迭代器
我写了一段代码来打印n个素数:Python 素数迭代器,python,iterator,Python,Iterator,我写了一段代码来打印n个素数: class PrimeGen: def __init__(self): self.current = 2 def genPrime(self, num): for i in range(num): while 1: for j in range(2, self.current/2 + 1): if self.current
class PrimeGen:
def __init__(self):
self.current = 2
def genPrime(self, num):
for i in range(num):
while 1:
for j in range(2, self.current/2 + 1):
if self.current % j == 0:
self.current = self.current + 1
break
else:
break
print self.current,
self.current = self.current + 1
if __name__ == '__main__':
p = PrimeGen()
p.genPrime(5)
代码运行良好。我得到2 3 5 7 11作为输出。我试着让这门课变得轻松愉快。代码如下。但是输出是01 2 3 4。我不太明白我错在哪里。感谢您的帮助。谢谢
class PrimeIter:
def __init__(self):
self.current = 1
def next(self):
self.current = self.current + 1
while 1:
for i in range(2, self.current/2 + 1):
if self.current % i == 0:
self.current = self.current + 1
break # Break current for loop
else:
break # Break the while loop and return
return self.current
def __iter__(self):
return self
if __name__ == '__main__':
p = PrimeIter()
for p in range (5):
print p,
您的问题是在测试代码中重用变量p:
if __name__ == '__main__':
p = PrimeIter() # first declaration of p
for p in range (5): # second declaration of p
print p, # uses second declaration of p
我建议使用itertools.islice获取迭代器的前5个元素:
if __name__ == '__main__':
p = PrimeIter()
for x in itertools.islice(p, 5):
print x,
您的问题是在测试代码中重用变量p:
if __name__ == '__main__':
p = PrimeIter() # first declaration of p
for p in range (5): # second declaration of p
print p, # uses second declaration of p
我建议使用itertools.islice获取迭代器的前5个元素:
if __name__ == '__main__':
p = PrimeIter()
for x in itertools.islice(p, 5):
print x,
您正在使用此代码打印值:
for p in range (5):
print p,
如果你看这个,它会打印范围的值。您可能希望打印来自主迭代器的内容。具有一些可能有帮助的功能:
for prime in itertools.islice(p, 5):
print prime,
另外,您可能需要考虑使用生成器:
def primes():
current = 1
while True:
current += 1
while True:
for i in xrange(2, current // 2 + 1):
if current % i == 0:
current += 1
break
else:
break
yield current
您正在使用此代码打印值:
for p in range (5):
print p,
如果你看这个,它会打印范围的值。您可能希望打印来自主迭代器的内容。具有一些可能有帮助的功能:
for prime in itertools.islice(p, 5):
print prime,
另外,您可能需要考虑使用生成器:
def primes():
current = 1
while True:
current += 1
while True:
for i in xrange(2, current // 2 + 1):
if current % i == 0:
current += 1
break
else:
break
yield current
生成最大值为m的素数的迭代器:
class PrimeIter:
def ___init__(self, m):
self.max = m
def __iter__(self):
self.n = 1
return self
def __next__(self):
if self.n < self.max:
self.n += 1
i = 2
while i < (self.n//2+1):
if self.n % i == 0:
self.n = self.n+1
if self.n > self.max:
raise StopIteration
i = 1
i += 1
else:
return self.n
else:
raise StopIteration
p = PrimeIter (100)
for i in p:
print(i, end=' ')
生成最大值为m的素数的迭代器:
class PrimeIter:
def ___init__(self, m):
self.max = m
def __iter__(self):
self.n = 1
return self
def __next__(self):
if self.n < self.max:
self.n += 1
i = 2
while i < (self.n//2+1):
if self.n % i == 0:
self.n = self.n+1
if self.n > self.max:
raise StopIteration
i = 1
i += 1
else:
return self.n
else:
raise StopIteration
p = PrimeIter (100)
for i in p:
print(i, end=' ')
nextmethod已被弃用,您甚至没有使用您创建的类。只需使用Range,非常感谢您的回答!愚蠢的疏忽。。。我已经调试了一段时间了!!这是一种生成素数的非常慢的方法。如果你的素数有一个上限,那么Erastothenes筛的性能会更好。@misha:谢谢。我只是尝试一些例子来学习迭代器!生成素数不是我的意图下一种方法已被弃用,您甚至没有使用您创建的类。只需使用Range,非常感谢您的回答!愚蠢的疏忽。。。我已经调试了一段时间了!!这是一种生成素数的非常慢的方法。如果你的素数有一个上限,那么Erastothenes筛的性能会更好。@misha:谢谢。我只是尝试一些例子来学习迭代器!生成素数并不是我的意图,这正是我要建议的+1您的X范围格式不正确,部分内容当前显示为注释。我想自己编辑,但出于某种原因,编辑必须是6个字符或更多。@Symmetric:Python注释以开头。//在Python中是显式整数除法。语法highlighter不能将其识别为Python.Aha,这是有道理的。我不知道“/”操作符。谢谢。正是我要建议的+1您的X范围格式不正确,部分内容当前显示为注释。我想自己编辑,但出于某种原因,编辑必须是6个字符或更多。@Symmetric:Python注释以开头。//在Python中是显式整数除法。语法highlighter不能将其识别为Python.Aha,这是有道理的。我不知道“/”操作符。谢谢