Digamos que tengo una función de generador de la siguiente manera:¿Puede una función de Python tomar un generador y devolver generadores a subconjuntos de su salida generada?
import random
def big_gen():
i = 0
group = 'a'
while group != 'd':
i += 1
yield (group, i)
if random.random() < 0.20:
group = chr(ord(group) + 1)
Ejemplo de salida podría ser: ('a', 1), ('a', 2), ('a', 3), ('a', 4), ('a', 5), ('a', 6), ('a', 7), ('a', 8), ('b', 9), ('c ', 10), (' c ', 11), (' c ', 12), (' c ', 13)
Me gustaría dividir esto en tres grupos: Grupo A, Grupo B y Grupo C. Y me gustaría un generador para cada grupo. Luego pasaría el generador y la carta grupal a una subfunción. Un ejemplo de la subfunción:
def printer(group_letter, generator):
print "These numbers are in group %s:" % group_letter
for num in generator:
print "\t%s" % num
la salida deseada sería:
These numbers are in group a:
1
2
3
4
5
6
7
8
These numbers are in group b:
9
These numbers are in group c:
10
11
12
13
Cómo puedo hacer esto sin cambiar big_gen() o una impresora(), y evitar el almacenamiento de todo el grupo en la memoria en ¿una vez? (En la vida real, los grupos son enorme)
En la vida real, ¿está bien caminar el gran generador varias veces? ¿O los datos se consumen de forma irrevocable? Si entiendo correctamente su ejemplo, el estado de la llamada al azar() no se almacena en ningún lugar, por lo que no puede volver a caminar ese generador. – Nelson