如何调用产生的函数(python 2.7)

时间:2017-01-13 10:02:52

标签: python yield

我有两个函数func1和func2,它们是func0的特定实现,YIELDS的结果是:

def func0(parameter, **kwargs):
    #do sth with kwargs and parameter
    yield result # result is html

我应该如何在"特定"中引用func0?使他们产生结果的功能?回来好吗?

def func1(**kwargs):
    return func0(parameter=1, **kwargs)

def func2(**kwargs):
    return func0(parameter=2, **kwargs)

4 个答案:

答案 0 :(得分:3)

在Python 3.3+中,通常的方法是使用yield from。来自https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#X_and_Y

  

PEP 380从表达式中添加了yield,允许生成器将其部分操作委托给另一个生成器。这允许将包含yield的一段代码分解出来并放在另一个生成器中。此外,允许子生成器返回一个值,该值可供委派生成器使用。

然而,对于Python 2.7来说,这是不可能的。这是一个替代方案:

def base_squared_generator(parameter):
    yield parameter ** 2


def two_squared_generator():
    yield next(base_squared_generator(parameter=2))


def three_squared_generator():
    yield next(base_squared_generator(parameter=3))


print(next(two_squared_generator()))
print(next(three_squared_generator()))

<强>输出

4
9

答案 1 :(得分:1)

我会这样做:

def func0(a):
    yield a**2

from functools import partial

func1 = partial(func0, a=1)
func2 = partial(func0, a=10)
print(next(func1()))  # prints 1
print(next(func2()))  # prints 100

您可以在那里查看partial。正如我在评论中所说,它基本上克隆了你的函数,其中已经设置了一些必需的参数。

因此,如果func0 产生,那么它的部分func1func2也是如此。

答案 2 :(得分:1)

如果您使用return,则func1将返回func0的生成器。或者,如果您使用yield from,则包装函数将成为生成器本身,从func0生成单个项目。在两种情况下,产生的元素都是相同的。

def func1(**kwargs):
    return func0(parameter=1, **kwargs)

def func2(**kwargs):
    yield from func0(parameter=1, **kwargs)

请注意func1如何返回func0 - 生成器,而func2返回func2 - 生成器。

>>> func1()
<generator object func0 at 0x7fe038147ea0>
>>> func2()
<generator object func2 at 0x7fe038147ee8>
>>> list(func1()) == list(func2())
True

请注意,在Python 3中引入了yield from。在Python 2中,您可以通过循环产生来实现samy。

def func2(**kwargs):
    for x in func0(parameter=1, **kwargs):
        yield x

答案 3 :(得分:0)

您正在从函数返回生成器。 你需要阅读有关发电机的信息,它不长,无论如何这是一种使用它的方法:

gen = func1(args...)
res = gen.next()  # python 2

或     res = next(gen)#python 2和3