[Tutor] Help with "Guess the number" script
spir
denis.spir at gmail.com
Mon Mar 3 11:27:35 CET 2014
On 03/03/2014 05:03 AM, Scott W Dunning wrote:
Ben Finney makes numerous fine comments already. I'll add a few, some on the
same points but but expressed a bit differently (case it helps).
> This is what Im having trouble with now. Here are the directions I’m stuck on and what I have so far, I’ll bold the part that’s dealing with the instructions if anyone could help me figure out where I’m going wrong.
>
> Thanks!
>
> from random import randrange
> randrange(1, 101)
> from random import seed
> seed(129)
>
> def print_description():
> print """Welcome to Guess the Number.
> I have seleted a secret number in the range 1 ... 100.
> You must guess the number within 10 tries.
> I will tell you if you ar high or low, and
> I will tell you if you are hot or cold.\n"""
>
> def get_guess(guess_number):
> promt = "(" + str(guess_number) +") Please enter a guess:"
> user_guess = raw_input(promt)
> user_guess = int(user_guess)
> return user_guess
Very good choice of variable name for 'promt'. (Apart from ortography, but since
you are consistent with the error... ;-)
There are 2 user guesses here, and only 1 variable, thus 1 name. The name should
say what (idea) the variable represents in the program; this should be said by
the name's *meaning*. It is one of the greatest difficulties in programming. How
would you define what these variables represent, using everyday language? My own
definitions would lead me to choose the following variable names:
guess_text = raw_input(promt)
guess_number = int(user_guess)
return guess_number
Note: it is especially obviuos that these are 2 separate numbers, since they do
not even are of the same type (a piece of text, or "string", vs a number, here
an "int").
Good naming is very, very hard; differences of naming can make some piece of
program nearly trivial or instead nearly impossible to understand; often bad
naming is worse than hypothetical randomly chosen names, because bad naming
*misleads* your thinking.
Changing the value of a local variable is always, or nearly, a sign that there
are here 2 ideas which should be represented by 2 variables with 2 names.
Example of 2 programming styles (note the difference in ease of understanding,
even if you don't know the python features used here):
def get_data (data):
data = File(data) # (a file)
data = data.read() # (a piece of text)
data = data.split("") # (a list of words)
return data
...
data = get_data("data.text")
def data_words (file_name):
data_file = File(file_name) # (a file)
text = data_file.read() # (a piece of text)
words = text.split(" ") # (a list of words)
return words
...
words = data_words("data.text")
(A special case is loop variables, but even then you only write the assignment
once, the value chages across multiple passes on the same code. The only real
exception is accumulators, like for computing a sum, which need to be first
initialised to a start value, often 0.)
> def print_hints(secrets, guess):
> secret_number = secret
> guess = guess
> if guess < 0 or user_guess> 101:
> print "Out of range!"
Parameters are input variables. Once they are given execution values by a call like
print_hints(input_value1, input_value2)
these variables exist _inside_ the function body (each with a name and a value).
As if functions were defined like:
def print_hints: # note: no param
secret = input_value1
guess = input_value2
... use these variables ...
This is more or less what the language does for you. This is the whole point of
defining parameters, in fact. So, _you_ do not need to _rebind_ parameters to
local variables; they already are local variables.
In addition, you are not consistent with variable _names_, evendently, so your
programs have no chance to work. This is an annoying, but necessary part of
programming. But the language will always tell about such errors, at once, *if
and only if* the wrong name does *not* otherwise exist. --> pay attention!
> def main():
> print_description()
> secret = randrange(1,101)
> current_guess = get_guess(1)
> if current_guess != secret:
> print_hints(secret_number, guess)
> current_guess = get_guess(2)
* 'secret_number' appears from nowhere: pay attention!
* To be more coherent checking if the guess is right or wrong (or too high or
too low) should be done in function print_hints as well. This function
_evaluates_ the guess (maybe it should be renamed).
> if secret == current_guess:
> print "Congratulations, you win!"
> else:
> print "Please play again"
> print "The secret number was", secret
These are (also) hints to the player, actually, aren't they?
> main()
d
More information about the Tutor
mailing list