[Tutor] Giving a name to a function and calling it, rather than calling the function directly

lists lists at justuber.com
Sat Sep 4 23:49:44 CEST 2010


>> On 9/4/10, lists <lists at justuber.com> wrote:
>> > Hi folks,
>> >
>> > I'm new to Python, I'm working my way through some intro books, and I
>> > have a question that I wonder if someone could help me with please?
>> >
>> > This is my attempt at solving an exercise where the program is
>> > supposed to flip a coin 100 times and then tell you the number of
>> > heads and tails.
>> >
>> > ATTEMPT 1 returns:
>> >
>> > The coin landed on tails 100 times
>> >
>> > The coin landed on heads 0 times
>> >
>> > ATTEMPT 2 returns:
>> >
>> > The coin landed on tails 75 times
>> >
>> > The coin landed on heads 25 times
>> >
>> > I expected to see the result in attempt 2. I don't fully understand
>> > why the results are different however. Is it because Python only runs
>> > the randint function once when I call it by the name I assigned to it
>> > in attempt 1, but it runs the function fully on each iteration of the
>> > loop in attempt 2? Why are these two things different?
>> Exactly. Essentially when you say
>> x=random.randint(1,2)
>> you are putting the value returned by randint into x, and this happens
>> only once. Had you moved that assignment into the while loop it would
>> keep replacing x, or toss in your case, with a random integer, but
>> because you just call it once it is only assigned once. Python, or any
>> language, would have no way of knowing that you want to reassign toss
>> each time. Loops are used to repeat actions, but you left the
>> assignment of your random int outside of the loop in attempt1 and so
>> there is no way for Python to know that you actually want toss updated
>> 100 times. I hope I explained this okay.
>> >
>> > Thanks in advance,
>> >
>> > Chris
>> > ------------------------------------------------------------------
>> > ATTEMPT 1
>> > ------------------------------------------------------------------
>> > import random
>> >
>> > heads = 0
>> > tails = 0
>> > tossNo = 0
>> > toss = random.randint(1,2)
>> >
>> > while tossNo <= 99:
>> > if toss == 1:
>> > heads += 1
>> > tossNo += 1
>> > elif toss == 2:
>> > tails += 1
>> > tossNo += 1
>> >
>> > print "The coin landed on tails " + str(tails) + " times \n"
>> > print "The coin landed on heads " + str(heads) + " times \n"
>> >
>> > ------------------------------------------------------------------
>> > ATTEMPT 2
>> > ------------------------------------------------------------------
>> > import random
>> >
>> > heads = 0
>> > tails = 0
>> > tossNo = 0
>> >
>> > while tossNo <= 99:
>> > if random.randint(1,2) == 1:
>> > heads += 1
>> > tossNo += 1
>> > elif random.randint(1,2) == 2:
>> > tails += 1
>> > tossNo += 1
>> >
>> > print "The coin landed on tails " + str(tails) + " times \n"
>> > print "The coin landed on heads " + str(heads) + " times \n"
>
> Alex has already answered the question you've asked. I would just like to
> point out a subtle bug in your ATTEMPT 2 code. What your code does is this:
>
> - generate a random number 1 or 2
> - test if it is 1
> - if it isn't, generate a *new* random number
> - test if this new random number is 2
>
> That the number of 1s and 2s add up to 100 is an accident of the way you are
> counting them.
>
> You should modify the code to generate a single random number each time
> through the loop and test whether it is 1 or 2.
>
> --
> sent from my Nokia N900
>

Thanks so much for your fast and friendly response guys, I'm bowled
over! As you can tell, I'm just starting out and it helps so much to
be able to get a helping hand like this.

I've taken on board what you have said and edited the code.

Kushal, it didn't occur to me that what I was doing in essence was
flipping a coin and attempting to get one result, then only flipping a
coin if I didn't get that first result. Now that I've edited the code
it gives much 'saner' results. I guess I'll have to be much more
careful in the future in the design stage!!

Here's what I have now:

--------------------------------------------
import random

heads = 0
tails = 0
tossNo = 0

while tossNo <= 99:
    coinToss = random.randint
    if coinToss(1,2) == 1:
        heads += 1
        tossNo += 1
    else:
        tails += 1
        tossNo += 1

print "The coin landed on tails " + str(tails) + " times \n"
print "The coin landed on heads " + str(heads) + " times \n"


More information about the Tutor mailing list