hello, its me again :-)

D-Man dsh8290 at rit.edu
Tue May 22 23:07:27 EDT 2001


On Wed, May 23, 2001 at 01:11:53AM +0000, the_2nd_coming wrote:
| thanks to all who have helped me with this simple little program.
| 
| I have finally gotten rid of all the errors, however, now I am getting a 
| value of none returned.
| 
| the source is :
| ---------------------------------------------------------
| 
| def evaluate(list):
|         num1 = int(list[0])
|         num2 = int(list[2])
|         operator = list[1]
|         
|         if operator == '+':
|                 answer = num1 + num2
|         elif operator == '-':
|                 answer = num1 - num2
|         elif operator == 'X':
|                 answer = num1 * num2
|         elif operator == 'x':
|                 answer = num1 * num2
|         elif operator == '*':
|                 answer = num1 * num2
|         elif operator == '/':
|                 answer = num1 / num2
|         else:
|                 print 'invalid operator'
|         
...
|         print evaluate(list)
...
| now what have I missed?!!

A 'return' statement.  If a function simply ends without returning
anything (no return statement) then it implicitly returns 'None'.  I
think you mean to have

    return answer

At the end of the function.  Also I would change the 'else' clause to
throw an exception instead.


If I may, I will suggest an alternate and more compact implementation :

import operator
ops = {
    '+' : operator.add ,
    '-' : operator.sub ,
    '*' : operator.mul ,
    'X' : operator.mul ,
    'x' : operator.mul ,
    '/' : operator.div ,
}

def evaluate( lst ) :
    if len( lst ) != 3 :
        raise Exception(
            "The list of operands/operators must have length of 3" )

    operand1 = lst[0]
    oper = lst[1]
    operand2 = lst[2]

    if not ops.has_key( oper ) :
        raise Exception( "Invalid operator" )

    return ops[ oper ]( operand1 , operand2 )


The 'operator' module defines functions that behave in the same manner
as the operators.  I put together a dictionary using the string
representation of the operator as the key and the associated operator
function as the value.  In the evaluate function I simply check to see
that the given operator is known (a key in the dictionary).  Then all
I need to do is grab the proper function from the dictionary and call
it.  I really don't care what the operator was -- the dictionary
lookup gave me an object that provides the necessary polymorphism.

In Python functions are firt-class objects so this is possible.  Other
languages (like Java) make this nearly impossible and in languages
like C it is possible (function pointers) but not pretty.

I also recommend changing the signature of the evaluate function -- I
think it would be clearer to have 3 separate arguments for the
operands and operator rather than using a list, but that is just my
opinion.

-D





More information about the Python-list mailing list