Implementing a history of user action for a calculator












1














I decided to make a calculator as a project. Implementing basic addition, subtraction, division, and multiplication was fairly easy.



I wanted to add more functionality so I decided to implement a list of results the user view. However, I had a difficult time keeping track of the results numerically. I wrote a maze of if statements that are functional but seem to be overwrought with code. I am sure there is a better way to handle this. Any advice?



def add(x, y):
return x + y


def sub(x, y):
return x - y


def mul(x, y):
return x * y


def div(x, y):
value = None
while True:
try:
value = x / y
break
except ZeroDivisionError:
print('Value is not dividable by 0, try again')
break
return value


def num_input(prompt='Enter a number: '):
while True:
try:
print(prompt, end='')
x = int(input())
break
except ValueError:
print('You must input a number. Try again.')
return x


def get_two_val():
x, y = num_input(), num_input()
return x, y


print("Welcome to Simple Calc")

# declaration of variables
num_of_calc_counter = 0
index_of_calc = 1
calculations =

while True:

print("Choose from the following options:")
print(" 1. Add")
print(" 2. Subtract")
print(" 3. Multiply")
print(" 4. Divide")
print(" 5. Sales Tax Calculator")
print(" 6. Recent Calculations")
print(" 0. Quit")

usrChoice = num_input('Enter your choice: ')

'''
Menu workflow
options 1-4 take in two numbers and perform the specified calculation and
then add the result to a master list that the user can reference later.
lastly, the workflow increments the num_of_calc variable by 1 for recent
calc logic

option 5 is a simple tax calculator that needs work or option to enter
or find tax rate

option 6 returns a list of all the calculations perform by the user
'''
if usrChoice is 1:
numbers = get_two_val()
result = add(*numbers)
print(numbers[0], "plus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 2:
numbers = get_two_val()
result = sub(*numbers)
print(numbers[0], "minus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 3:
numbers = get_two_val()
result = mul(*numbers)
print(numbers[0], "times", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 4:
numbers = get_two_val()
result = div(*numbers)
print(numbers[0], "divided by", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 5:
tax_rate = .0875
price = float(input("What is the price?: "))
total_tax = tax_rate * price
final_amount = total_tax + price
print('Tax rate: ', tax_rate, '%')
print('Sales tax: $', total_tax)
print('_____________________________')
print('Final amount: $', final_amount)
#
elif usrChoice is 6:
if len(calculations) is 0:
print('There are no calculations')
elif num_of_calc_counter == 0:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif index_of_calc == num_of_calc_counter:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif num_of_calc_counter > index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter -= 1
elif num_of_calc_counter < index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1

elif usrChoice is 0:
break









share|improve this question









New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • Sales tax calculations are excluded from the history? Why?
    – 200_success
    6 hours ago






  • 1




    I disagree with that close vote - this seems on-topic to me. The OP describes it as being functional.
    – Reinderien
    6 hours ago
















1














I decided to make a calculator as a project. Implementing basic addition, subtraction, division, and multiplication was fairly easy.



I wanted to add more functionality so I decided to implement a list of results the user view. However, I had a difficult time keeping track of the results numerically. I wrote a maze of if statements that are functional but seem to be overwrought with code. I am sure there is a better way to handle this. Any advice?



def add(x, y):
return x + y


def sub(x, y):
return x - y


def mul(x, y):
return x * y


def div(x, y):
value = None
while True:
try:
value = x / y
break
except ZeroDivisionError:
print('Value is not dividable by 0, try again')
break
return value


def num_input(prompt='Enter a number: '):
while True:
try:
print(prompt, end='')
x = int(input())
break
except ValueError:
print('You must input a number. Try again.')
return x


def get_two_val():
x, y = num_input(), num_input()
return x, y


print("Welcome to Simple Calc")

# declaration of variables
num_of_calc_counter = 0
index_of_calc = 1
calculations =

while True:

print("Choose from the following options:")
print(" 1. Add")
print(" 2. Subtract")
print(" 3. Multiply")
print(" 4. Divide")
print(" 5. Sales Tax Calculator")
print(" 6. Recent Calculations")
print(" 0. Quit")

usrChoice = num_input('Enter your choice: ')

'''
Menu workflow
options 1-4 take in two numbers and perform the specified calculation and
then add the result to a master list that the user can reference later.
lastly, the workflow increments the num_of_calc variable by 1 for recent
calc logic

option 5 is a simple tax calculator that needs work or option to enter
or find tax rate

option 6 returns a list of all the calculations perform by the user
'''
if usrChoice is 1:
numbers = get_two_val()
result = add(*numbers)
print(numbers[0], "plus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 2:
numbers = get_two_val()
result = sub(*numbers)
print(numbers[0], "minus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 3:
numbers = get_two_val()
result = mul(*numbers)
print(numbers[0], "times", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 4:
numbers = get_two_val()
result = div(*numbers)
print(numbers[0], "divided by", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 5:
tax_rate = .0875
price = float(input("What is the price?: "))
total_tax = tax_rate * price
final_amount = total_tax + price
print('Tax rate: ', tax_rate, '%')
print('Sales tax: $', total_tax)
print('_____________________________')
print('Final amount: $', final_amount)
#
elif usrChoice is 6:
if len(calculations) is 0:
print('There are no calculations')
elif num_of_calc_counter == 0:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif index_of_calc == num_of_calc_counter:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif num_of_calc_counter > index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter -= 1
elif num_of_calc_counter < index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1

elif usrChoice is 0:
break









share|improve this question









New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • Sales tax calculations are excluded from the history? Why?
    – 200_success
    6 hours ago






  • 1




    I disagree with that close vote - this seems on-topic to me. The OP describes it as being functional.
    – Reinderien
    6 hours ago














1












1








1







I decided to make a calculator as a project. Implementing basic addition, subtraction, division, and multiplication was fairly easy.



I wanted to add more functionality so I decided to implement a list of results the user view. However, I had a difficult time keeping track of the results numerically. I wrote a maze of if statements that are functional but seem to be overwrought with code. I am sure there is a better way to handle this. Any advice?



def add(x, y):
return x + y


def sub(x, y):
return x - y


def mul(x, y):
return x * y


def div(x, y):
value = None
while True:
try:
value = x / y
break
except ZeroDivisionError:
print('Value is not dividable by 0, try again')
break
return value


def num_input(prompt='Enter a number: '):
while True:
try:
print(prompt, end='')
x = int(input())
break
except ValueError:
print('You must input a number. Try again.')
return x


def get_two_val():
x, y = num_input(), num_input()
return x, y


print("Welcome to Simple Calc")

# declaration of variables
num_of_calc_counter = 0
index_of_calc = 1
calculations =

while True:

print("Choose from the following options:")
print(" 1. Add")
print(" 2. Subtract")
print(" 3. Multiply")
print(" 4. Divide")
print(" 5. Sales Tax Calculator")
print(" 6. Recent Calculations")
print(" 0. Quit")

usrChoice = num_input('Enter your choice: ')

'''
Menu workflow
options 1-4 take in two numbers and perform the specified calculation and
then add the result to a master list that the user can reference later.
lastly, the workflow increments the num_of_calc variable by 1 for recent
calc logic

option 5 is a simple tax calculator that needs work or option to enter
or find tax rate

option 6 returns a list of all the calculations perform by the user
'''
if usrChoice is 1:
numbers = get_two_val()
result = add(*numbers)
print(numbers[0], "plus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 2:
numbers = get_two_val()
result = sub(*numbers)
print(numbers[0], "minus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 3:
numbers = get_two_val()
result = mul(*numbers)
print(numbers[0], "times", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 4:
numbers = get_two_val()
result = div(*numbers)
print(numbers[0], "divided by", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 5:
tax_rate = .0875
price = float(input("What is the price?: "))
total_tax = tax_rate * price
final_amount = total_tax + price
print('Tax rate: ', tax_rate, '%')
print('Sales tax: $', total_tax)
print('_____________________________')
print('Final amount: $', final_amount)
#
elif usrChoice is 6:
if len(calculations) is 0:
print('There are no calculations')
elif num_of_calc_counter == 0:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif index_of_calc == num_of_calc_counter:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif num_of_calc_counter > index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter -= 1
elif num_of_calc_counter < index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1

elif usrChoice is 0:
break









share|improve this question









New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











I decided to make a calculator as a project. Implementing basic addition, subtraction, division, and multiplication was fairly easy.



I wanted to add more functionality so I decided to implement a list of results the user view. However, I had a difficult time keeping track of the results numerically. I wrote a maze of if statements that are functional but seem to be overwrought with code. I am sure there is a better way to handle this. Any advice?



def add(x, y):
return x + y


def sub(x, y):
return x - y


def mul(x, y):
return x * y


def div(x, y):
value = None
while True:
try:
value = x / y
break
except ZeroDivisionError:
print('Value is not dividable by 0, try again')
break
return value


def num_input(prompt='Enter a number: '):
while True:
try:
print(prompt, end='')
x = int(input())
break
except ValueError:
print('You must input a number. Try again.')
return x


def get_two_val():
x, y = num_input(), num_input()
return x, y


print("Welcome to Simple Calc")

# declaration of variables
num_of_calc_counter = 0
index_of_calc = 1
calculations =

while True:

print("Choose from the following options:")
print(" 1. Add")
print(" 2. Subtract")
print(" 3. Multiply")
print(" 4. Divide")
print(" 5. Sales Tax Calculator")
print(" 6. Recent Calculations")
print(" 0. Quit")

usrChoice = num_input('Enter your choice: ')

'''
Menu workflow
options 1-4 take in two numbers and perform the specified calculation and
then add the result to a master list that the user can reference later.
lastly, the workflow increments the num_of_calc variable by 1 for recent
calc logic

option 5 is a simple tax calculator that needs work or option to enter
or find tax rate

option 6 returns a list of all the calculations perform by the user
'''
if usrChoice is 1:
numbers = get_two_val()
result = add(*numbers)
print(numbers[0], "plus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 2:
numbers = get_two_val()
result = sub(*numbers)
print(numbers[0], "minus", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 3:
numbers = get_two_val()
result = mul(*numbers)
print(numbers[0], "times", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 4:
numbers = get_two_val()
result = div(*numbers)
print(numbers[0], "divided by", numbers[1], "equals", result)
calculations.extend([result])
num_of_calc_counter += 1

elif usrChoice is 5:
tax_rate = .0875
price = float(input("What is the price?: "))
total_tax = tax_rate * price
final_amount = total_tax + price
print('Tax rate: ', tax_rate, '%')
print('Sales tax: $', total_tax)
print('_____________________________')
print('Final amount: $', final_amount)
#
elif usrChoice is 6:
if len(calculations) is 0:
print('There are no calculations')
elif num_of_calc_counter == 0:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif index_of_calc == num_of_calc_counter:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif num_of_calc_counter > index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter -= 1
elif num_of_calc_counter < index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1

elif usrChoice is 0:
break






python beginner






share|improve this question









New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 8 mins ago









Jamal

30.3k11116226




30.3k11116226






New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 6 hours ago









awebber

61




61




New contributor




awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






awebber is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












  • Sales tax calculations are excluded from the history? Why?
    – 200_success
    6 hours ago






  • 1




    I disagree with that close vote - this seems on-topic to me. The OP describes it as being functional.
    – Reinderien
    6 hours ago


















  • Sales tax calculations are excluded from the history? Why?
    – 200_success
    6 hours ago






  • 1




    I disagree with that close vote - this seems on-topic to me. The OP describes it as being functional.
    – Reinderien
    6 hours ago
















Sales tax calculations are excluded from the history? Why?
– 200_success
6 hours ago




Sales tax calculations are excluded from the history? Why?
– 200_success
6 hours ago




1




1




I disagree with that close vote - this seems on-topic to me. The OP describes it as being functional.
– Reinderien
6 hours ago




I disagree with that close vote - this seems on-topic to me. The OP describes it as being functional.
– Reinderien
6 hours ago










1 Answer
1






active

oldest

votes


















0














Use the operator package



This series of functions:



def add(x, y):
return x + y


def sub(x, y):
return x - y


def mul(x, y):
return x * y


can go away entirely. (You can include div too if you rework the way that exceptions are handled). Instead, use the operator package.



Early return



This:



def num_input(prompt='Enter a number: '):
while True:
try:
print(prompt, end='')
x = int(input())
break
except ValueError:
print('You must input a number. Try again.')
return x


doesn't need a break. Replace the break with a return and delete the return outside of the loop.



Write a main method



...to pull your code out of global scope.



Use more loops



This:



print(" 1. Add")
print(" 2. Subtract")
print(" 3. Multiply")
print(" 4. Divide")
print(" 5. Sales Tax Calculator")
print(" 6. Recent Calculations")
print(" 0. Quit")


can be rewritten as a tuple:



menu_choices = (
('Add', do_add),
('Subtract', do_subtract),
# ...
)


The index of the outer tuple is the user input, the first element of the inner tuple is the menu item name, and the second element of the inner tuple is the name of a function you can call to execute the menu item feature. Then your input logic can be simplified to something like



print('Choose from the following options:')
print('n'.join('%2d. %s' % (i, name)
for i, (name, _) in enumerate(menu_choices)))
user_choice = num_input('Enter your choice:')
if 0 <= user_choice < len(menu_choices):
menu_choices[user_choice][1]()


Use append instead of extend



This:



calculations.extend([result])


should be



calculations.append(result)


Don't repeat yourself



These four blocks:



    elif num_of_calc_counter == 0:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif index_of_calc == num_of_calc_counter:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1
elif num_of_calc_counter > index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter -= 1
elif num_of_calc_counter < index_of_calc:
index_of_calc = 1
for i in calculations:
print(index_of_calc, i)
index_of_calc += 1
num_of_calc_counter += 1


do the exact same thing! So just replace them all with one else following your if len(calculations) == 0.



Also, that first if can be simplified to if not calculations.






share|improve this answer





















    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
    });
    });
    }, "mathjax-editing");

    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "196"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });






    awebber is a new contributor. Be nice, and check out our Code of Conduct.










    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210899%2fimplementing-a-history-of-user-action-for-a-calculator%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    Use the operator package



    This series of functions:



    def add(x, y):
    return x + y


    def sub(x, y):
    return x - y


    def mul(x, y):
    return x * y


    can go away entirely. (You can include div too if you rework the way that exceptions are handled). Instead, use the operator package.



    Early return



    This:



    def num_input(prompt='Enter a number: '):
    while True:
    try:
    print(prompt, end='')
    x = int(input())
    break
    except ValueError:
    print('You must input a number. Try again.')
    return x


    doesn't need a break. Replace the break with a return and delete the return outside of the loop.



    Write a main method



    ...to pull your code out of global scope.



    Use more loops



    This:



    print(" 1. Add")
    print(" 2. Subtract")
    print(" 3. Multiply")
    print(" 4. Divide")
    print(" 5. Sales Tax Calculator")
    print(" 6. Recent Calculations")
    print(" 0. Quit")


    can be rewritten as a tuple:



    menu_choices = (
    ('Add', do_add),
    ('Subtract', do_subtract),
    # ...
    )


    The index of the outer tuple is the user input, the first element of the inner tuple is the menu item name, and the second element of the inner tuple is the name of a function you can call to execute the menu item feature. Then your input logic can be simplified to something like



    print('Choose from the following options:')
    print('n'.join('%2d. %s' % (i, name)
    for i, (name, _) in enumerate(menu_choices)))
    user_choice = num_input('Enter your choice:')
    if 0 <= user_choice < len(menu_choices):
    menu_choices[user_choice][1]()


    Use append instead of extend



    This:



    calculations.extend([result])


    should be



    calculations.append(result)


    Don't repeat yourself



    These four blocks:



        elif num_of_calc_counter == 0:
    index_of_calc = 1
    for i in calculations:
    print(index_of_calc, i)
    index_of_calc += 1
    num_of_calc_counter += 1
    elif index_of_calc == num_of_calc_counter:
    index_of_calc = 1
    for i in calculations:
    print(index_of_calc, i)
    index_of_calc += 1
    num_of_calc_counter += 1
    elif num_of_calc_counter > index_of_calc:
    index_of_calc = 1
    for i in calculations:
    print(index_of_calc, i)
    index_of_calc += 1
    num_of_calc_counter -= 1
    elif num_of_calc_counter < index_of_calc:
    index_of_calc = 1
    for i in calculations:
    print(index_of_calc, i)
    index_of_calc += 1
    num_of_calc_counter += 1


    do the exact same thing! So just replace them all with one else following your if len(calculations) == 0.



    Also, that first if can be simplified to if not calculations.






    share|improve this answer


























      0














      Use the operator package



      This series of functions:



      def add(x, y):
      return x + y


      def sub(x, y):
      return x - y


      def mul(x, y):
      return x * y


      can go away entirely. (You can include div too if you rework the way that exceptions are handled). Instead, use the operator package.



      Early return



      This:



      def num_input(prompt='Enter a number: '):
      while True:
      try:
      print(prompt, end='')
      x = int(input())
      break
      except ValueError:
      print('You must input a number. Try again.')
      return x


      doesn't need a break. Replace the break with a return and delete the return outside of the loop.



      Write a main method



      ...to pull your code out of global scope.



      Use more loops



      This:



      print(" 1. Add")
      print(" 2. Subtract")
      print(" 3. Multiply")
      print(" 4. Divide")
      print(" 5. Sales Tax Calculator")
      print(" 6. Recent Calculations")
      print(" 0. Quit")


      can be rewritten as a tuple:



      menu_choices = (
      ('Add', do_add),
      ('Subtract', do_subtract),
      # ...
      )


      The index of the outer tuple is the user input, the first element of the inner tuple is the menu item name, and the second element of the inner tuple is the name of a function you can call to execute the menu item feature. Then your input logic can be simplified to something like



      print('Choose from the following options:')
      print('n'.join('%2d. %s' % (i, name)
      for i, (name, _) in enumerate(menu_choices)))
      user_choice = num_input('Enter your choice:')
      if 0 <= user_choice < len(menu_choices):
      menu_choices[user_choice][1]()


      Use append instead of extend



      This:



      calculations.extend([result])


      should be



      calculations.append(result)


      Don't repeat yourself



      These four blocks:



          elif num_of_calc_counter == 0:
      index_of_calc = 1
      for i in calculations:
      print(index_of_calc, i)
      index_of_calc += 1
      num_of_calc_counter += 1
      elif index_of_calc == num_of_calc_counter:
      index_of_calc = 1
      for i in calculations:
      print(index_of_calc, i)
      index_of_calc += 1
      num_of_calc_counter += 1
      elif num_of_calc_counter > index_of_calc:
      index_of_calc = 1
      for i in calculations:
      print(index_of_calc, i)
      index_of_calc += 1
      num_of_calc_counter -= 1
      elif num_of_calc_counter < index_of_calc:
      index_of_calc = 1
      for i in calculations:
      print(index_of_calc, i)
      index_of_calc += 1
      num_of_calc_counter += 1


      do the exact same thing! So just replace them all with one else following your if len(calculations) == 0.



      Also, that first if can be simplified to if not calculations.






      share|improve this answer
























        0












        0








        0






        Use the operator package



        This series of functions:



        def add(x, y):
        return x + y


        def sub(x, y):
        return x - y


        def mul(x, y):
        return x * y


        can go away entirely. (You can include div too if you rework the way that exceptions are handled). Instead, use the operator package.



        Early return



        This:



        def num_input(prompt='Enter a number: '):
        while True:
        try:
        print(prompt, end='')
        x = int(input())
        break
        except ValueError:
        print('You must input a number. Try again.')
        return x


        doesn't need a break. Replace the break with a return and delete the return outside of the loop.



        Write a main method



        ...to pull your code out of global scope.



        Use more loops



        This:



        print(" 1. Add")
        print(" 2. Subtract")
        print(" 3. Multiply")
        print(" 4. Divide")
        print(" 5. Sales Tax Calculator")
        print(" 6. Recent Calculations")
        print(" 0. Quit")


        can be rewritten as a tuple:



        menu_choices = (
        ('Add', do_add),
        ('Subtract', do_subtract),
        # ...
        )


        The index of the outer tuple is the user input, the first element of the inner tuple is the menu item name, and the second element of the inner tuple is the name of a function you can call to execute the menu item feature. Then your input logic can be simplified to something like



        print('Choose from the following options:')
        print('n'.join('%2d. %s' % (i, name)
        for i, (name, _) in enumerate(menu_choices)))
        user_choice = num_input('Enter your choice:')
        if 0 <= user_choice < len(menu_choices):
        menu_choices[user_choice][1]()


        Use append instead of extend



        This:



        calculations.extend([result])


        should be



        calculations.append(result)


        Don't repeat yourself



        These four blocks:



            elif num_of_calc_counter == 0:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter += 1
        elif index_of_calc == num_of_calc_counter:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter += 1
        elif num_of_calc_counter > index_of_calc:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter -= 1
        elif num_of_calc_counter < index_of_calc:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter += 1


        do the exact same thing! So just replace them all with one else following your if len(calculations) == 0.



        Also, that first if can be simplified to if not calculations.






        share|improve this answer












        Use the operator package



        This series of functions:



        def add(x, y):
        return x + y


        def sub(x, y):
        return x - y


        def mul(x, y):
        return x * y


        can go away entirely. (You can include div too if you rework the way that exceptions are handled). Instead, use the operator package.



        Early return



        This:



        def num_input(prompt='Enter a number: '):
        while True:
        try:
        print(prompt, end='')
        x = int(input())
        break
        except ValueError:
        print('You must input a number. Try again.')
        return x


        doesn't need a break. Replace the break with a return and delete the return outside of the loop.



        Write a main method



        ...to pull your code out of global scope.



        Use more loops



        This:



        print(" 1. Add")
        print(" 2. Subtract")
        print(" 3. Multiply")
        print(" 4. Divide")
        print(" 5. Sales Tax Calculator")
        print(" 6. Recent Calculations")
        print(" 0. Quit")


        can be rewritten as a tuple:



        menu_choices = (
        ('Add', do_add),
        ('Subtract', do_subtract),
        # ...
        )


        The index of the outer tuple is the user input, the first element of the inner tuple is the menu item name, and the second element of the inner tuple is the name of a function you can call to execute the menu item feature. Then your input logic can be simplified to something like



        print('Choose from the following options:')
        print('n'.join('%2d. %s' % (i, name)
        for i, (name, _) in enumerate(menu_choices)))
        user_choice = num_input('Enter your choice:')
        if 0 <= user_choice < len(menu_choices):
        menu_choices[user_choice][1]()


        Use append instead of extend



        This:



        calculations.extend([result])


        should be



        calculations.append(result)


        Don't repeat yourself



        These four blocks:



            elif num_of_calc_counter == 0:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter += 1
        elif index_of_calc == num_of_calc_counter:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter += 1
        elif num_of_calc_counter > index_of_calc:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter -= 1
        elif num_of_calc_counter < index_of_calc:
        index_of_calc = 1
        for i in calculations:
        print(index_of_calc, i)
        index_of_calc += 1
        num_of_calc_counter += 1


        do the exact same thing! So just replace them all with one else following your if len(calculations) == 0.



        Also, that first if can be simplified to if not calculations.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 5 hours ago









        Reinderien

        3,733721




        3,733721






















            awebber is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            awebber is a new contributor. Be nice, and check out our Code of Conduct.













            awebber is a new contributor. Be nice, and check out our Code of Conduct.












            awebber is a new contributor. Be nice, and check out our Code of Conduct.
















            Thanks for contributing an answer to Code Review Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210899%2fimplementing-a-history-of-user-action-for-a-calculator%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Costa Masnaga

            Fotorealismo

            Sidney Franklin