class Primes:
@staticmethod
def __isprime(x):
for i in range(2, x): # 判断是否为素数,
if x % i == 0: # 除了 1和他本身外不能被其他自然数整除
return False
return True
def __init__(self, b, n):
self.begin = b
self.count = n
def __iter__(self):
self.cur_pos = self.begin # 设置迭代的起始值
self.cur_count = 0
return self
def __next__(self):
# 已完成生成,不需要再生成,我停止迭代
if self.cur_count >= self.count:
raise StopIteration
self.cur_count += 1 # 计数加1
while True:
if self.__isprime(self.cur_pos):
v = self.cur_pos
self.cur_pos += 1
return v
self.cur_pos += 1 # 为下一次循环做准备
for x in Primes(10, 4):
print(x) # 11 13 17 19
"=600 #l两个 self.cur_pos += 1
作用一样,都是为下一次判断做准备(当前数加一)。写成下面等效形式会更好理解一些:如果当前不是素数,+1继续在当前次迭代内判断(还没退出while循环);如果当前是素数,则返回当前值(退出while),同时也要+1以便 下一次迭代 继续找新的素数。
while True:
if self.__isprime(self.cur_pos):
v = self.cur_pos
self.cur_pos += 1
return v
else:
self.cur_pos += 1 # 为下一次循环做准备