Re: Dispatching functions from a dictionary

2008-03-30 Thread tkpmep
Paul, George,

Thanks a mill - the help is greatly appreciated.

Thomas Philips

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Dispatching functions from a dictionary

2008-03-30 Thread George Sakkis
On Mar 30, 5:06 pm, Paul Rubin  wrote:
> [EMAIL PROTECTED] writes:
> > RVDict= {'1': random.betavariate(1,1), '2': random.expovariate(1), ...}
>
> This actually calls the functions random.betavariate, etc.  when
> initializing RVDict.  If you print out the contents of RVDict you'll see
> that each value in it is just a floating point number, not a callable.
>
> You want something like:
>
>   RVDict = {'1': lambda: random.betavariate(1,1),
> '2': lambda: random.expovariate(1), etc.

In Python 2.5, you can also write this as:

from functools import partial

RVDict = {'1': partial(random.betavariate,1,1),
  '2': partial(random.expovariate,1),
etc.


George
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Dispatching functions from a dictionary

2008-03-30 Thread Paul Rubin
[EMAIL PROTECTED] writes:
> RVDict= {'1': random.betavariate(1,1), '2': random.expovariate(1), ...}

This actually calls the functions random.betavariate, etc.  when
initializing RVDict.  If you print out the contents of RVDict you'll see
that each value in it is just a floating point number, not a callable.

You want something like:

  RVDict = {'1': lambda: random.betavariate(1,1),
'2': lambda: random.expovariate(1), etc.

The "lambda" keyword creates a function that when called evaluates the
expression that you gave it.  For example, lambda x: x*x   is a function
that squares its argument, so saying
 
y = (lambda x: x*x) (3)

is similar to saying:

def square(x): return x*x
y = square(3)

Both of them set y to 9.  In the case of lambda: random.expovariate(1)
you have made a function with no args, so you'd call it like this:

> rvfunc = RVDict[str(RVType)]
> for i in range(N):
> x.append(rvfunc())
> y.append(rvfunc())

rvfunc (the retrieved dictionary item) is now a callable function
instead of just a number.  It takes no args, so you call it by saying
rvfunc().
-- 
http://mail.python.org/mailman/listinfo/python-list


Dispatching functions from a dictionary

2008-03-30 Thread tkpmep
To keep a simulation tidy, I created a dispatcher that generates
random variables drawn from various distributions as follows:

import random

RVType = 1  #Type of random variable - pulled from RVDict

RVDict= {'1': random.betavariate(1,1), '2': random.expovariate(1),
 '3': random.gammavariate(1,1),  '4': random.gauss(0,1),
 '5': random.lognormvariate(1,1), '6':
random.paretovariate(1),
 '7': random.uniform( -1,1), '8':
random.weibullvariate(1,2) }

x = []
y=[]

rv = RVDict[str(RVType)]
for i in range(N):
x.append(rv)
y.append(rv)


Oddly, x and y get filled with a single value repeated N times. I
expected to get a different random number appear each time I called
rv ,but this does not happen. Instead, my first call to rv generates a
random number from the appropriate distribution, while subsequent
calls simply repeat the random number generated in the first call.
Where am I going wrong?

Thanks in advance for your help.

Sincerely


Thomas Philips

-- 
http://mail.python.org/mailman/listinfo/python-list