# [Tutor] Defining functions

Kent Johnson kent37 at tds.net
Fri Mar 25 00:43:02 CET 2005

John Carmona wrote:
> Hi there,
>
> I have written (well almost as I copied some lines from an existing
> example) this little programme - part of an exercise.

> def print_options():
>        print "------------------------------"
>        print "Options:"
>        print "1. print options"
>        print "2. calculate circle area"
>        print "3. calculate square area"
>        print "4. calculate rectangle area"
>        print "5. quit the programme"
>        print "------------------------------"
>        choice = input("Choose an option: ")
>        if choice == 1:
>            print_options()
>        elif choice == 2:
>            area_circ()
>        elif choice == 3:
>            area_squ()
>        elif choice == 4:
>            area_rect()
>        elif choice == 5:
>            print_options()
>
> If I try to change the 1, 2, 3, 4 or 5 by a letter i.e. a, b, c, d, e
> the programme stop functionning. I get an error message saying that
>
> Traceback (most recent call last):
>  File "C:/Python24/Example/area_cir_squ_regt.py", line 39, in -toplevel-
>    print_options()
>  File "C:/Python24/Example/area_cir_squ_regt.py", line 27, in print_options
>    choice = input("Choose an option: ")
>  File "<string>", line 0, in -toplevel-
> NameError: name 'c' is not defined

The input() function evaluates the input as if it is Python code. So you can type 1+2 to input and
it will return 3, for example:

>>> print input('type a valid expression: ')
type a valid expression: 1+2
3

If you type a bare string, Python expects this to be a variable name:
>>> print input('type a valid expression: ')
type a valid expression: a
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<string>", line 0, in ?
NameError: name 'a' is not defined

This is exactly the same error you would get if you just typed a bare 'a' at the interpreter prompt:
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'a' is not defined

To get a string from input(), you have to type it with quotes:
>>> print input('type a valid expression: ')
type a valid expression: 'abcd'
abcd

raw_input() will return the literal string the user typed. If you input is a string, this is what
you want:
>>> print raw_input('type anything: ')
type anything: 1+2
1+2
>>> print raw_input('type anything: ')
type anything: abcd
abcd

In general, raw_input() is safer than input(), which is vulnerable to abuse. Even if you want an
integer input, you can use raw_input() and int():
>>> print int(raw_input('type a number: '))
type a number: 35
35

Kent

PS you do need to quote the letters in your if / elif also.