Python函数说明

时间:2013-03-23 16:45:17

标签: python

这部分程序是做什么的(在Nubela's guthub上找到)?

def product(*args, **kwds):
    """
    for py2.6< support (they lack itertools lib)
    - http://docs.python.org/2/library/itertools.html#itertools.permutations
    """
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

后来在节目中:

list(set((product(*[range(2) for _ in range(length)]))))

1 个答案:

答案 0 :(得分:1)

它实现itertools.product以实现向后兼容性。请参阅product的文档:

  

itertools.product(* iterables [,repeat])

     

输入迭代的笛卡尔积。

     

等效于生成器表达式中的嵌套for循环。例如,对于y in,乘积(A,B)返回与A中的((x,y)相同的返回值   B)。

     

嵌套循环像里程表一样循环,最右边的元素在每次迭代时前进。这种模式创造了一个词典   排序,以便输入的iterables排序,产品   元组按排序顺序发出。

     

要计算iterable与其自身的乘积,请使用可选的repeat关键字参数指定重复次数。对于   例如,产品(A,repeat = 4)表示与产品(A,A,A,A)相同。

     

此函数等效于以下代码,但实际实现不会构建中间结果   存储器:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

请注意文档中的代码与您找到的代码相匹配。

我不明白为什么他们在文档中提到itertools.permutations的引用... 代码:

list(set((product(*[range(2) for _ in range(length)]))))

AFAIK相当于:

list(product(*[range(2) for _ in range(length)]))

这只是计算length range(2) iterables的产品。