这似乎可行,但仍然很懒:
def conjoin(gs): return [()] if not gs else ( (val,) + suffix for val in gs[0]() for suffix in conjoin(gs[1:]) )def range3(): return range(3)print list(conjoin([range3, range3]))
输出:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
显示可变状态的示例用法:
x = ""def mutablerange(): global x x += "x" return [x + str(i) for i in range(3)]print list(conjoin([range3, mutablerange]))
输出:(观看不断增加的“ x”数)
[(0, 'x0'), (0, 'x1'), (0, 'x2'), (1, 'xx0'), (1, 'xx1'), (1, 'xx2'), (2, 'xxx0'), (2, 'xxx1'), (2, 'xxx2')]
如果我们使用
itertools.product:
x = ""print list(itertools.product(range3(), mutablerange()))
结果如下:
[(0, 'x0'), (0, 'x1'), (0, 'x2'), (1, 'x0'), (1, 'x1'), (1, 'x2'), (2, 'x0'), (2, 'x1'), (2, 'x2')]
因此,可以清楚地看到,它
itertools.product缓存了迭代器返回的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)