我有两个函数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)
答案 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
产生,那么它的部分func1
和func2
也是如此。
答案 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