[Tutor] Fwd: Function works one time then subsequently fails

Jim Mooney Py3.4.3winXP cybervigilante at gmail.com
Wed Apr 29 17:34:17 CEST 2015


On 28 April 2015 at 22:40, Cameron Simpson <cs at zip.com.au> wrote:

>
> As with all things, sometimes that cannot be reasonably achieved, but it
> is usually so.
>
> We can pick over your code as well if you like. Should we?
>
> Cheers,
> Cameron Simpson <cs at zip.com.au>


Sure, but let me include the full working program after fixup. Although I
still have to write another program to feed it random problems to work it
out. It's a bit spacey, but I ran it through the pep8 program and it
suggested that. I think two spaces between such tiny functions is overkill,
though.

"""
Takes the name of a binary math operation and two numbers from input,
repeatedly, and displays the results until done
"""

def add(a, b):
    return a + b


def subtract(a, b):
    return b - a


def minus(a, b):
    return a - b


def multiply(a, b):
    return a * b


def divide(a, b):
    return a / b


operations = {'add': add, '+': add, 'plus': add, 'subtract': subtract,
'subtracted': subtract,
              '-': minus, 'minus': minus, 'multiply': multiply, '*':
multiply, 'multiplied': multiply,
              'times': multiply, 'divide': divide, '/': divide, 'divided':
divide}

def test_number(astring):
    """
    Input: A string that should represent a valid int or float. Output:
    An int or float on success. None on failure.
    """
    for make_type in (int, float):
        try:
            return make_type(astring)
        except ValueError:
            pass
    return None


def parse_string(math_string):
    """Input: A math string with a verbal or mathematical operation
    and two valid numbers to operate on. Extra numbers and operations
    are ignored. Output: A tuple containing a function corresponding
    to the operation and the two numbers. Returns None on failure.
    """
    operation = None
    tokens = math_string.split()
    numbers = []
    for token in tokens:
        if token in operations:
            operation = operations[token]
        elif test_number(token) != None:
            numbers.append(test_number(token))
        if len(numbers) > 1:
            break
    if operation is None or len(numbers) < 2:
        return None
    else:
        return operation, numbers[0], numbers[1]

instructions = '''Enter two numbers and one of the four basid math
operations,
either mathematical or verbal. i.e. 3 + 2, 12 divided by 14, 10 minus 4,
etc.
Enter done to quit.
'''
try:
    user_input = input(instructions)
    while True:
        if user_input == 'done':
            break
        result = parse_string(user_input)
        if result == None:
            print("Not a valid math operation.")
        else:
            func, num1, num2 = result
            print(func(num1, num2))
        user_input = input()
except KeyboardInterrupt:
    print("Program terminated by user")


-- 
Jim

If you only had one hour left to live, would you spend it on Facebook,
Twitter, or Google Plus?


More information about the Tutor mailing list