你可以用(n + 1)**2 == n**2 + (2*n + 1)
以下是如何使用生成器函数来完成此操作:
^{pr2}$
输出[4, 9, 16]
[9, 16, 25, 36, 49]
[25, 36, 49, 64, 81]
这是一个等价的迭代器类。我给了它一个__repr__方法,因此如果打印这个类的一个实例,它看起来很不错。在import math
class Squares(object):
def __init__(self, start, stop):
self.start = start
self.stop = stop
root = int(math.ceil(start ** 0.5))
self.num = root ** 2
self.delta = 2 * root + 1
def __repr__(self):
return 'Squares(%d, %d)' % (self.start, self.stop)
def __iter__(self):
return self
def next(self):
num = self.num
if num > self.stop:
raise StopIteration
self.num += self.delta
self.delta += 2
return num
sq = Squares(4, 16)
print sq
for i in sq:
print i
print list(Squares(5, 50))
print list(Squares(20, 90))
输出Squares(4, 16)
4
9
16
[9, 16, 25, 36, 49]
[25, 36, 49, 64, 81]
对于python3,将next方法名替换为__next__。在
Python通常的惯例是在达到上限之前停止。要使此代码符合该约定,请在squares()生成器中进行更改while num <= hi:
到while num < hi:
在Squares()类中,更改if num > self.stop:
到if num >= self.stop: