Calling a generator multiple times

Steven Majewski sdm7g at Virginia.EDU
Thu Dec 6 16:02:20 EST 2001


On Thu, 6 Dec 2001, Bruce Eckel wrote:

> I'm trying to create a clever way to call a generator multiple
> times, but the only thing I've been able to come up with is:
>
> import random
> rgen = random.Random()
> def itemGenerator(dummy):
>   return rgen.choice(['one', 'two', 'three', 'four'])
>
> print map(itemGenerator, [None]* 25)
>
> This works, but it requires the 'dummy' argument which seems
> inelegant. I'll bet someone has a better idea...

Somebody already mentioned list comprehensions.

For clarity, I'ld probably define the function without the dummy
variable, and then use a lambda expression to add a dummy back again:

def itemGenerator(): ...

 map( lambda dummy: itemGenerator(), [None]*25 )


Another thing is just use random.Random().choice on copies of the
items:

  map( random.Random().choice,  [ item-list ]*25 )

or if you need to keep the random generator around for more:

  rgen = random.Random()
  map( rgen.choice, [ item-list ]*25 )


or if you're doing this alot, maybe just define your function to
take a collection and an optional number:

def itemGenerator( collection, n=1 ):
	if n == 1:
		return rgen.choice(collection)
	else:
		return map( rgen.choice, [collection]*n )

>>> itemGenerator(['one','two','three','four'])
 'four'
>>> itemGenerator(['one','two','three','four'], 10 )
['two', 'two', 'four', 'one', 'two', 'four', 'one', 'four', 'four', 'two']



-- Steve Majewski






More information about the Python-list mailing list