Python递归生成器

Python递归生成器,python,recursion,generator,yield,Python,Recursion,Generator,Yield,我试图创建一个递归生成器,但我显然遗漏了一些东西。基本上,对于直方图的特定维度,我有一个正负值列表,并且希望得到正负值的每个组合。 例: 我需要的结果是(虽然我想把它作为一个生成器而不是一个列表,但你明白了): 我已经成功地完成了,但只是通过在递归中向一个全局列表添加项,但我真的希望我可以用一个生成器来完成这项工作,并迭代我的函数,因为这样会使它更干净 以下是我现在拥有的: def combs(idx,array,current=[]): for item in array[idx]:

我试图创建一个递归生成器,但我显然遗漏了一些东西。基本上,对于直方图的特定维度,我有一个正负值列表,并且希望得到正负值的每个组合。 例:

我需要的结果是(虽然我想把它作为一个生成器而不是一个列表,但你明白了):

我已经成功地完成了,但只是通过在递归中向一个全局列表添加项,但我真的希望我可以用一个生成器来完成这项工作,并迭代我的函数,因为这样会使它更干净

以下是我现在拥有的:

def combs(idx,array,current=[]):
    for item in array[idx]:
        current_copy = current[:]
        current_copy.append(item)
        if idx + 1 < len(array):
            combs(idx+1,array,current_copy)
        else:
            print current_copy
            # yield current_copy

如果您使用的是Python 3.3或更高版本,则需要
yield from
语句:

def combs(idx,array,current=[]):
    for item in array[idx]:
        current_copy = current[:]
        current_copy.append(item)
        if idx + 1 < len(array):
            yield from combs(idx+1,array,current_copy)
        else:
            yield current_copy

如果您使用的是Python 3.3或更高版本,则需要
yield from
语句:

def combs(idx,array,current=[]):
    for item in array[idx]:
        current_copy = current[:]
        current_copy.append(item)
        if idx + 1 < len(array):
            yield from combs(idx+1,array,current_copy)
        else:
            yield current_copy

此任务的另一个选项是
itertools.product
功能:

>>> from itertools import product
>>> input = [[-1,2],[-3,4],[-5,6]]
>>> list(product(*input))
[(-1, -3, -5), (-1, -3, 6), (-1, 4, -5), (-1, 4, 6), (2, -3, -5), (2, -3, 6), (2, 4, -5), (2, 4, 6)]

此任务的另一个选项是
itertools.product
功能:

>>> from itertools import product
>>> input = [[-1,2],[-3,4],[-5,6]]
>>> list(product(*input))
[(-1, -3, -5), (-1, -3, 6), (-1, 4, -5), (-1, 4, 6), (2, -3, -5), (2, -3, 6), (2, 4, -5), (2, 4, 6)]


我使用的是2.7,是否有类似的替代方案?您应该能够循环递归
combs
调用,并生成单个值我已经尝试了与上面所述完全相同的操作,除了将打印当前副本切换为生成当前副本,但我没有得到任何输出。因此,我发现它可以工作,但是我不明白为什么我需要循环递归函数调用,你能解释一下吗?调用
combs
只会给你一个生成器对象,你必须循环它才能得到它的值。这与调用返回值的常规函数不同
yield from
只是一种语法糖,用于消费一个iterable(如生成器)并生成值。我使用的是2.7,有类似的替代方案吗?您应该能够循环递归
combs
调用,并生成单个值我已经尝试了我上面提到的方法,除了将print current\u copy切换为yield current\u copy,我没有得到任何输出。所以我知道它是有效的,但我不明白为什么需要循环递归函数调用,你能解释一下吗?调用
combs
只会给你一个生成器对象,你必须循环它才能从中得到值。这与调用返回值的常规函数不同
yield from
只是使用iterable(如生成器)并生成值的语法糖。这非常好,解决了手头的总体问题!我仍然很好奇为什么我试图做的事情不起作用:(如果他想让生成器做
myGenerator=product(*myInput)
@Mr.E Correct,我使用了
list()
来演示结果。这很好,解决了手头的整个问题!我仍然很好奇为什么我尝试做的事情不起作用:(如果他想让生成器执行
myGenerator=product(*myInput)
@Mr.E Correct,我使用了
list()
以演示结果。请避免使用函数名调用变量(
input
在本例中)这会让您头痛请避免使用函数名调用变量(
input
在本例中)这会让您头痛
def combs(idx,array,current=[]):
    for item in array[idx]:
        current_copy = current[:]
        current_copy.append(item)
        if idx + 1 < len(array):
            for i in combs(idx+1,array,current_copy):
                yield i
        else:
            yield current_copy
>>> from itertools import product
>>> input = [[-1,2],[-3,4],[-5,6]]
>>> list(product(*input))
[(-1, -3, -5), (-1, -3, 6), (-1, 4, -5), (-1, 4, 6), (2, -3, -5), (2, -3, 6), (2, 4, -5), (2, 4, 6)]