可以通过多态来使用生成器

时间:2018-06-05 13:42:39

标签: python generator

我甚至不知道它是否是正确的方式,但我最近在尝试使用对象中的方法时遇到了麻烦,无论是作为映射引擎(映射闭包到迭代器的元素)还是发电机的发电机。

通过代码示例解释这一点可能要简单得多:

class maybe_generator():
    def __init__(self, doer):
        self.doer = doer

    def give(self):
        for i in [1,2,3]:
            self.doer(i)


def printer(x):
    print('This is {}'.format(x))
def gener(x):
    yield(x)

p = maybe_generator(printer)
p.give()

g = maybe_generator(gener)

print('Type of result is {}'.format(g.give()))

输出

This is 1
This is 2
This is 3
Type of result is None

我原本期望g对象不是类型生成器而不是NoneType。然后我想知道如何实现一个可能生成生成器的函数,或者直接对iterable执行一些边界效果。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了我想要的东西。有一个既可以作为映射引擎也可以作为生成器的函数可能有一些黑客/技巧,但我在用例中想要的本质上是获得一个递归生成器。

使用关键字

可以轻松完成此操作
  

来自

代码现在看起来像这样:

class maybe_generator():
    def __init__(self, doer):
        self.doer = doer

    def give(self):
        for i in [1,2,3]:
            yield from self.doer(i)

def gener(x):
    yield(x)

g = maybe_generator(gener)
gen = g.give()
print('Type of result is {}'.format(gen))

for k in gen:
    print('value is {}'.format(k))

实际上也值得一看这个关于生成器和协同程序的高级系列课程:http://dabeaz.com/coroutines/