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

Kushal Kumaran kushal.kumaran at gmail.com
Sat Sep 4 21:25:16 CEST 2010


----- Original message -----
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100905/8754d443/attachment.html>


More information about the Tutor mailing list