# -*- coding:utf-8 -*-"""
实际案例:
实现一个可迭代对象的类,它能迭代出给定范围内的所有素数:
pn = PrimeNumber(1, 30)
for k in pn:
print k
输出结构:
2 3 5 7 11 13 17 19 23 29
解决方案:
将该类的__iter__方法实现成生成器函数,每次yield返回一个素数
"""deff():
print('in f(), 1')
yield1
print('in f(), 2')
yield2
print('in f(), 3')
yield3
g = f()
# 生成器对象和迭代器对象在行为上非常相似,都支持可迭代接口__next__
print(g.__next__())
# 如果想调用生成器函数的语句,需要调用__next__函数,返回的结果就是yield返回的结果# 虽然f函数被yield临时返回,但保留了程序运行的状态.再次调用,会继续沿着上次进行
print(g.__next__())
print(g.__next__())
# print(g.__next__()) # 抛出异常:StopIterationfor x in g: # 可以代替上面几句代码
print(x)
print(g.__iter__() is g) # g对象既实现了迭代器接口__next__,又实现了可迭代接口__iter__# 调用g的可迭代接口,返回的就是g自身classPrimeNumbers(object):def__init__(self, start, end):
self.start = start
self.end = end
defisPrimeNum(self, k):if k < 2:
returnFalsefor i in range(2, k):
if k % i == 0:
returnFalsereturnTruedef__iter__(self):for k in range(self.start, self.end + 1):
if self.isPrimeNum(k):
yield k
for x in PrimeNumbers(1, 100):
print(x)