How do I improve my code for Think Python, Exercise 7.4 eval and loop

Question:

The task:

Write a function called eval_loop that iteratively prompts the user, takes the resulting input and evaluates it using eval(), and prints the result.

It should continue until the user enters 'done', and then return the value of the last expression it evaluated.

My code:

import math

def eval_loop(m,n,i):
    n = raw_input('I am the calculator and please type: ')
    m = raw_input('enter done if you would like to quit! ')
    i = 0   
    while (m!='done' and i>=0):
        print eval(n)
        eval_loop(m,n,i)
        i += 1
        break;

eval_loop('','1+2',0)

My code cannot return the value of the last expression it evaluated!

Asked By: green_claws

||

Answers:

Three comments:

  1. Using recursion for this means that you will eventually hit the system recursion limit, iteration is probably a better approach (and the one you were asked to take!);
  2. If you want to return the result of eval, you will need to assign it; and
  3. I have no idea what i is for in your code, but it doesn’t seem to be helping anything.

With those in mind, a brief outline:

def eval_loop():
    result = None
    while True:
        ui = raw_input("Enter a command (or 'done' to quit): ")
        if ui.lower() == "done":
            break
        result = eval(ui)
        print result
    return result

For a more robust function, consider wrapping eval in a try and dealing with any errors stemming from it sensibly.

Answered By: jonrsharpe
import math
def eval_loop():
    while True:
        x=input('Enter the expression to evaluate: ')
        if x=='done':
            break
        else:
            y=eval(x)
            print(y)
    print(y)

eval_loop()
Answered By: Joseph Jefries

This is the code I came up with. As a start wrote it using the If,else conditionals to understand the flow of code. Then wrote it using the while loop

    import math
    #using the eval function
    """eval("") takes a string as a variable and evaluates it
    Using (If,else) Conditionals"""

    def eval_(n):
        m=int(n)
        print("nInput n = ",m)
        x=eval('nmath.pow(m,2)')
        print("nEvaluated value is = ", x)
    def run():
        n= input("nEnter the value of n = ") 
        if n=='done' or n=='Done':
            print("nexiting program")
            return
        else:
             eval_(n)
        run() # recalling the function to create a loop
    run()

Now Performing the same using a While Loop

    "using eval("") function using while loop"

    def eval_1():
        while True:
            n=input("nenter the value of n = ") #takes a str as input
            if n=="done" or n=="Done": #using string to break the loop
                break
            m=int(n) # Since we're using eval to peform a math function.
            print("nnInput n = ",m) 
            x=eval('nmath.pow(m,2)') #Using m to perform the math
            print("nEvaluated value is " ,x)        
    eval_1()
Answered By: Chidhvilas

This method will run the eval on what a user input first, then adds that input to a new variable called b.
When the word "done" is input by the user, then it will print the newly created variable b – exactly as requested by the exercise.

def eval_loop():
    while True:
        a = input("enter a:n")
        if a == "done":
            print(eval(b)) # if "done" is entered, this line will print variable "b" (see comment below)
            break
        print(eval(a))
        b = a # this adds the last evaluated to a new variable "b"
eval_loop()
Answered By: brownspecs
import math

b = []
def eval_loop():
    a = input('Enter something to eval:')
    if a != 'done':
        print(eval(a))
        b.append(eval(a))
        eval_loop()        
    elif a == 'done':
        print(*b)
eval_loop()
Answered By: Ihor Kukharchuk
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.