美文网首页
如何使用生成器函数实现可迭代对象?

如何使用生成器函数实现可迭代对象?

作者: Diolog | 来源:发表于2019-02-09 18:16 被阅读0次

实际案例:

  • 实现一个可迭代对象的类,它能迭代出给定范围内所有素数:
    pn = PrimeNumbers(1,30)
    for k in pn:
    print(k)
    输出结果:2,3,5,7,11,13...

首先熟悉生成函数的特点:

def f():
  print('in f() ,1')
  yield 1
  print('in f() ,2')
  yield 2
  print('in f() ,3')
  yield 3

生成器函数实现了迭代器的next方法

测试用例1:
g = f()
g.__next__()
g.__next__()
g.__next__()
g.__next__()

输出结果1:
in f() ,1
in f() ,2
in f() ,3
Traceback (most recent call last):
  File "testBuilderDef.py", line 13, in <module>
    g.__next__()
StopIteration

测试用例2:
for i in g:
  print(i)

输出结果2:
in f() ,1
1
in f() ,2
2
in f() ,3
3

解决方案:

  • 将该类的iter方法实现成生成器函数,每次yield返回一个素数.
class PrimeNumbers:
    def __init__(self,start,end):
        self.start = start
        self.end = end

    def isPrimeNum(self,k):
        if k < 2:
            return False
        for i in range(2,k):
            if k%i == 0:
                return False
        return True

    def __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)

相关文章

网友评论

      本文标题:如何使用生成器函数实现可迭代对象?

      本文链接:https://www.haomeiwen.com/subject/vygasqtx.html