Create a generator that gives values ​​from any number of internal generators

I have a generate generator function that gives 5 random numbers one at a time. I need to be able to generate numbers in two ways:

  • One generation, which means one output of the generate function
  • Several generations, which means multiple execution of generate and combining all the results in a single (merged) stream

To do this, I wrote another get_resource function that calls generate either once or using itertools.chain to start the generators one by one, but transparently to the caller.

My goal is to use the get_resource function and output the results in the same format (one list of numbers), regardless of one / several generations.

 import itertools import random def get_resource(values=None): def resource_generator(): if values: # run a generator for every value return itertools.chain(generate(value) for value in values) else: return generate('meh') return resource_generator() def generate(value): for _ in range(5): yield random.randint(1, 101) if __name__ == '__main__': # list() is used for convenience only, # I still need the values one by one print list(get_resource()) print list(get_resource([1, 2, 3])) 

He prints:

 [63, 22, 87, 2, 54] [<generator object generate at 0x1089f7640>, <generator object generate at 0x1089f7690>, <generator object generate at 0x1089f76e0>] 

For now, I need to print:

 [63, 22, 87, 2, 54] [63, 22, 87, 2, 54, 1, 58, 79, 89, 77, 94, 99, 30, 30, 4] 

I am using python2.7

+5
source share
2 answers

you should use itertools.chain.from_iterable

 return itertools.chain.from_iterable(generate(value) for value in values) 
+2
source

You can specify generator delegation with yield from , starting with python-3.3 +.

 def get_resource(values=None): def resource_generator(): if values: for value in values: yield from generate(value) else: yield from generate(None) return resource_generator() 

Now,

 >>> list(get_resource([1, 2, 3])) [46, 99, 97, 1, 42, 79, 69, 9, 45, 25, 77, 56, 54, 7, 41] 
+4
source

Source: https://habr.com/ru/post/1275444/


All Articles