simonh a écrit :
Thanks for the extra tips Ivan and Bruno. Here is how the program
looks now. Any problems?



import sys

def get_name():
    name = input('Please enter your name: ')
    print('Hello', name)

This one would be better spelled "get_and_display_name" !-)

def get_age():
        try:
            return int(input('Please enter your age: '))
        except ValueError:
            print('That was not a valid number. Please try again.')
            return get_age()

Warning : there's a recursion limit in Python. While there are very few chances you hit it in this case, it may bite you one day if you start using recursion instead of iteration.


def check_age(age,min=18,max=31):
    if age < min:
        print('Sorry, too young.')
    elif age >= max:
        print('Sorry, too old.')
    else:
        print('Come on in!')

def again():
    response = input('Try again? Y or N: ')
    while response != "Y":

You probably mean 'if response != "Y"' ?

        if response == 'N':
            print('Program finished.')
            input('Press any key to exit.')
            sys.exit()
        else:
            return response

This return value is never used in the calling code. And if the user types anything else than "Y" or "N", the program will exit without even a goodbye message.

    run()


def run():
    get_name()
    a = get_age()
    check_age(a)
    again()


As far as I'm concerned, I'd write it that way:

def read_string(question, error=''):
    if not error:
        error = "That was not a valid string. Please try again."
    while True:
        result = input(question).strip()
        if result:
            return result
        else:
           print error

def read_int(question, error=''):
   if not error:
       error = "That was not a valid number. Please try again."
    while True:
        try:
            return int(input(question).strip())
        except ValueError:
            print(error)


def check_in_range(obj, mini, maxi, if_ok=0, if_lesser=-1, if_greater=1)
      if obj < mini:
          return if_lesser
      elif age >= max:
          return if_greater
      else:
          return if_ok


def again(question="Try again ?", yes="Y", no="N"):
     # XXX : see appropriate string formatting for Python 3
     # in 2.x, I'd write it as:
     # prompt = "%s (%s or %s): " % (question, yes, no)
     prompt = question + " " + yes" + " or " + no + ": "
     while True:
         response = input(prompt)
         if response in (yes, no):
             return response == yes

def run():
   name = read_string("Please enter your name: ")
   print("Hello, ", name)
   age = read_int("Please enter your age: ")
   messages = {
        0: "Come on in!",
        -1: "Sorry, too young",
        1: "Sorry, too old",
        }
   message_key = check_in_range(age, 18, 31)
   print(messages[message_key])

def main():
    while True:
        run()
        if not again():
            print('Program finished.')
            input('Press any key to exit.')
            return


if __name__ == "__main__":
    main()


NB : the 'if __name__ == "__main__"' will allow you to use your code as both a script (ie : calling it as 'main' program) or as a module (importing it from within another script or module so you can reuse the functions), by only calling 'main()' if the file is used as a script.

HTH
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to