Disons que j'ai une fonction de générateur comme ceci:Une fonction Python peut-elle prendre un générateur et renvoyer des générateurs à des sous-ensembles de sa sortie générée?
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)
Exemple de sortie pourrait être: ('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)
Je voudrais diviser cela en trois groupes: Groupe A, Groupe B et Groupe C. Et je voudrais un générateur pour chaque groupe. Ensuite, je passerais le générateur et la lettre de groupe dans une sous-fonction. Un exemple de la sous-fonction:
def printer(group_letter, generator):
print "These numbers are in group %s:" % group_letter
for num in generator:
print "\t%s" % num
La sortie souhaitée serait:
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
Comment puis-je faire cela sans changer big_gen() ou une imprimante() et éviter de stocker l'ensemble du groupe en mémoire à une fois que? (Dans la vraie vie, les groupes sont énorme)
Dans la vraie vie, est-il possible de marcher plusieurs fois sur le gros générateur? Ou les données sont-elles consommées de manière irrévocable? Si je comprends bien votre exemple, l'état de l'appel à random() n'est stocké nulle part, donc vous ne pouvez plus marcher sur ce générateur. – Nelson