Python multi-loop falló cuando con generador e iterador

Necesito un bucle 2D en el que el primer bucle use un iterador y el segundo use un generador, pero esta simple función no funcionó, ¿alguien puede ayudar a verificar?

def alphabet(begin, end): for number in xrange(ord(begin), ord(end)+1): yield chr(number) def test(a, b): for i in a: for j in b: print i, j test(xrange(8, 10), alphabet('A', 'C')) The result shows: >>> 8 A >>> 8 B >>> 8 c 

no se por que Gracias de antemano si alguien puede ayudar.

Ya que has pedido una aclaración, voy a decir un poco más; pero en realidad la respuesta de Ignacio lo resume bastante bien: solo se puede iterar una vez sobre un generador. El código en su ejemplo intenta iterar sobre él tres veces, una para cada valor en a .

Para ver lo que quiero decir, considere este ejemplo simplista:

 >>> def mygen(x): ... i = 0 ... while i < x: ... yield i ... i += 1 ... >>> mg = mygen(4) >>> list(mg) [0, 1, 2, 3] >>> list(mg) [] 

Cuando se llama mygen , crea un objeto que puede repetirse una vez exactamente. Cuando intentas repetirlo nuevamente, obtienes un iterable vacío.

Esto significa que tienes que llamar a mygen nuevo, cada vez que quieras iterar sobre ello`. Así que en otras palabras (usando un estilo bastante detallado) …

 >>> def make_n_lists(gen, gen_args, n): ... list_of_lists = [] ... for _ in range(n): ... list_of_lists.append(list(gen(*gen_args))) ... return list_of_lists ... >>> make_n_lists(mygen, (3,), 3) [[0, 1, 2], [0, 1, 2], [0, 1, 2]] 

Si quisiera vincular sus argumentos a su generador y pasarlo como una función sin argumentos, podría hacer esto (utilizando un estilo más conciso):

 >>> def make_n_lists(gen_func, n): ... return [list(gen_func()) for _ in range(n)] ... >>> make_n_lists(lambda: mygen(3), 3) [[0, 1, 2], [0, 1, 2], [0, 1, 2]] 

La lambda simplemente define una función anónima; Lo anterior es idéntico a esto:

 >>> def call_mygen_with_3(): ... return mygen(3) ... >>> make_n_lists(call_mygen_with_3, 3) [[0, 1, 2], [0, 1, 2], [0, 1, 2]] 

La primera iteración sobre b consume el generador.