On 08/28/2012 07:23 AM, Dharmit Shah wrote:
> Hello,
>
> I am trying to do the following :
>
> 1) Ask user for the length of the word that he'd like to guess (for
> hangman game).
> 2) Pick a random word from /usr/share/dict/words (which I understand
> is not the best choice for hangman).
> 3) Call a function that would pick a random word to proceed further.
>
> Below is the code for the part I described above :
>
> [code]
>
> #!/bin/env python
> import random
>
> def pick_random(l, ln):           # picks a random word from the list
> l of length ln
>     global mystery
>     word = random.choice(l)
>     if word.__len__() != ln:
>         pick_random(l, ln)        # recursion
>     else:
>         print "Should return %s" % word     # prints the chosen random
> word correctly
>         return word                                      # always
> return None, why? :(

There's no return statement here, to cover the case where the if-clause
succeeded.

> if __name__ == "__main__":
>     ln = raw_input("How long word can you guess (number of alphabets) : ")
>     ln = int(ln)
>     l = []
>     with open("/usr/share/dict/words", "r") as f:
>         for i in f.readlines():
>             i = i.split("\n")[0]
>             if i.isalpha():
>                 l.append(i)
>
>     word = pick_random(l, ln)
>     print word
>
> [/code]
>
> Sample output :
>
> $ python hangman.py
> How long word can you guess (number of alphabets) : 6
> Should return inarch
> None
> $
>
> The problem is that the last line "print word" always prints None. I
> know I am doing something wrong in the recursion part of the function
> "pick_random". Can someone please point what I am missing. Thank you!
>
> Cheers,
> Dharmit
>

There are two things wrong, one of which has already been pointed out. 
But the most fundamental thing that's wrong is that once you have called
the recursion, you don't return a value at all, simply falling off the
end of the function.  Python returns a value of None when you omit the
return statement.

So you should add a statement 'return word', which will eliminate the
None.  But of course it'll be the wrong word.  To fix that, you need to
assign the results of the call to pick_random() to the same local
variable, word.

As others have pointed out, this is a poor choice for recursion. 
Recursion can be more readable for some problems, when the problem
statement is naturally recursive.  But even then, it can frequently lead
to stack overruns, and performance problems.  But in this case a simple
loop would make much more sense.  So unless the instructor is requiring
you to use recursion, please redo it as a loop.

While we're at it, please use the len() function, rather than __len__()
method.  And instead doing a split() method for eliminating the
linefeeds, what you really want to do is rstrip().



-- 

DaveA

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to