import itertools def product(*iters): inf_iters = tuple(itertools.cycle(enumerate(it)) for it in iters) num_iters = len(inf_iters) cur_val = [None for _ in xrange(num_iters)] first_v = True while True: i, p = 0, num_iters while p and not i: p -= 1 i, cur_val[p] = inf_iters[p].next() if not p and not i: if first_v: first_v = False else: break yield tuple(cur_val)