2013-03-23 88 views
0

这部分程序做什么(在Nubela's guthub上找到)?Python函数说明

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

它实现itertools.product的向后兼容性。看到的文档product

itertools.product(* iterables [,重复])

输入iterables的笛卡儿积。

等同于生成器表达式中的嵌套for循环。例如,产品(A,B)返回的结果与((x,y))相同,对于y中的x,在 B中为y)。

嵌套循环像一个里程表一样循环,最右边的元素在每次迭代中前进。此模式创建一个词典 排序,以便如果输入的可迭代序列被排序,产品 元组将按排序顺序发出。

要计算迭代本身的乘积,请使用可选的repeat关键字参数指定重复次数。例如,对于 示例,产品(A,重复= 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) 

注意如何在文档中的代码相匹配,你发现了什么。

我不明白他们为什么在doc把参考itertools.permutations ... 代码:

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

AFAIK它相当于:

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

简单地计算产品lengthrange(2) iterables。

+0

是的,完全是为了计算排列。毕竟这是一个非图解求解器。 – petajamaja 2013-03-23 16:51:47