【问题标题】:Can generator be used through polymorphism可以通过多态使用生成器吗
【发布时间】:2018-06-05 13:42:38
【问题描述】:

我什至不知道这是否是正确的放置方式,但我最近在尝试使用对象中的方法时遇到了麻烦,既作为映射引擎(映射闭包到迭代器的元素),又作为生成器的生成器。

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

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。然后我想知道如何实现一个可以潜在生成生成器的函数,或者直接对迭代执行一些边框效果。

提前感谢您的帮助

【问题讨论】:

  • 这是因为你的函数give 没有返回任何东西。 self.doer(i) 确实创建了一个可以产生单个元素的生成器,但它只是将其丢弃。很抱歉,但目前尚不清楚您要完成什么。你想做什么?您可能只想使用map

标签: python generator


【解决方案1】:

好的,我终于找到了我要找的东西。通过一些技巧/窍门,可以拥有一个既作为映射引擎又作为生成器工作的函数,但我在我的用例中想要的本质上是一个递归生成器。

这可以通过关键字轻松完成

收益来自

代码现在看起来像这样:

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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多