[Tutor] random.choice()

Tim Golden mail at timgolden.me.uk
Tue Jul 1 15:13:40 CEST 2008


Dick Moores wrote:
> At 05:43 AM 7/1/2008, Tim Golden wrote:
>> Dick Moores wrote:
>>> So I want to randomly choose between them. I thought that I might be 
>>> able to use choice() to do that. So,
>>>      (bunch of functions here)
>>> if __name__ == '__main__':
>>>     choice([use_for_float_demo(), use_for_integer_demo()])
>>> I find that what's gets run each time is BOTH of these functions, 
>>> first use_for_float_demo(), and then use_for_integer_demo()!  What's 
>>> going on?
>>
>> What you *want* to do is choose one of two functions, and call
>> whichever is chosen:
>>
>> fn = choice ([a, b])
>> result = fn ()
>>
>> What you're *actually* doing is calling two functions, and returning
>> one result or the other:
>>
>> result = choice ([a (), b ()])
> 
> I'm not sure I understand the distinction. It seems you're saying in 
> either case I get one result or the other. In fact, each time I run the 
> program, I get BOTH results.


Let's talk through what the Python interpreter's doing in each case:

a) fn = choice ([a, b]); print fn ()

Here, the interpreter is saying: ok, let's build a list which contains
two functions. Now, let's pick one of those functions. Whichever one
we picked, let's call it and print out the result.

b) print choice ([a (), b ()]

In this case, the interpreter is saying: build a list containing *the result*
of calling each of these functions, so both functions are called when the
list is built, and the list contains [<result of calling a>, <result of calling b>].
Now pick one of those results and display it.

Is that any clearer? If not, I'm obviously not too good at explaining this
kind of thing; maybe someone else can have a go.

TJG


More information about the Tutor mailing list