0

I've tried Simple Python Calculator with Maintaining past history with it. The word "None" is getting printed after each calculations. How to remove that "None" word from my code

Here is my code for python calculator!!

calculations = []
def record_history(args):
    calculations.append(args)

def history():
    if calculations == []:
        print("No past calculations to show")
    else:
        for i in calculations:
            print(i)
def add(a,b):
  return a+b
  
def subtract(a,b):
  return a-b
  
def multiply (a,b):
  return a *b

def divide(a,b):
  try:
    return a/b
  except Exception as e:
    print(e)

def power(a,b):
  return a**b
  
def remainder(a,b):
  return a % b
  
def select_op(choice):
  if choice == '#':
    return -1
  elif (choice == '$'):
    return 0
  elif (choice in ('+','-','*','/','^','%')):
    while (True):
      num1s = (input("Enter first number: "))
      print(num1s)
      if num1s.endswith('$'):
        return 0
      if num1s.endswith('#'):
        return -1
        
      try:
        num1 = float(num1s)
        break
      except:
        print("Not a valid number,please enter again")
        continue
    
    while (True):
      num2s = str(input("Enter second number: "))
      print(num2s)
      if num2s.endswith('$'):
        return 0
      if num2s.endswith('#'):
        return -1
      try:  
        num2 = float(num2s)
        break
      except:
        print("Not a valid number,please enter again")
        continue
    
    
    last_calculation = ""
    
    if choice == '+':
      result = add(num1, num2)
    elif choice == '-':
      result = subtract(num1, num2)
    elif choice == '*':
      result = multiply(num1, num2)
    elif choice == '/':
      result =  divide(num1, num2)
    elif choice == '^':
      result = power(num1, num2)
    elif choice == '%':
      result = remainder(num1, num2)
    else:
      print("Something Went Wrong")
      
    last_calculation =  "{0} {1} {2} = {3}".format(num1, choice, num2, result) 
    print((last_calculation ))
    print((record_history(last_calculation)))
    
  elif choice == "?":
      history()
        
  else:
      print("Unrecognized operation")
        
while True:
  print("Select operation.")
  print("1.Add      : + ")
  print("2.Subtract : - ")
  print("3.Multiply : * ")
  print("4.Divide   : / ")
  print("5.Power    : ^ ")
  print("6.Remainder: % ")
  print("7.Terminate: # ")
  print("8.Reset    : $ ")
  print("8.History  : ? ")
  
  # take input from the user
  choice = input("Enter choice(+,-,*,/,^,%,#,$,?): ")
  print(choice)
  if(select_op(choice) == -1):
    #program ends here
    print("Done. Terminating")
    exit()

The output is,

Select operation.
1.Add      : +
2.Subtract : -
3.Multiply : *
4.Divide   : /
5.Power    : ^
6.Remainder: %
7.Terminate: #
8.Reset    : $
8.History  : ?
Enter choice(+,-,*,/,^,%,#,$,?): ?
No past calculations to show
Select operation.
1.Add      : +
2.Subtract : -
3.Multiply : *
4.Divide   : /
5.Power    : ^
6.Remainder: %
7.Terminate: #
8.Reset    : $
8.History  : ?
Enter choice(+,-,*,/,^,%,#,$,?): -
Enter first number: 2
Enter second number: 3
2.0 - 3.0 = -1.0
None
Select operation.
1.Add      : +
2.Subtract : -
3.Multiply : *
4.Divide   : /
5.Power    : ^
6.Remainder: %
7.Terminate: #
8.Reset    : $
8.History  : ?
Enter choice(+,-,*,/,^,%,#,$,?): ?
2.0 - 3.0 = -1.0
Select operation.
1.Add      : +
2.Subtract : -
3.Multiply : *
4.Divide   : /
5.Power    : ^
6.Remainder: %
7.Terminate: #
8.Reset    : $
8.History  : ?
Enter choice(+,-,*,/,^,%,#,$,?): #
Done. Terminating

How to Remove the extra None ...

Tom Karzes
  • 22,815
  • 2
  • 22
  • 41
dharsh
  • 1
  • 2
  • Two techniques that can help here 1) [use a debugger](https://stackoverflow.com/q/4929251/761202) and step through the code 2) use a 'proxy' function (i.e. `my_print` instead of `print`) and in it test for the value that's unexpected and raise an exception - the stack trace would indicate how the unexpected value is being received/generated. Those are general suggestions, using [type hints](https://docs.python.org/3/library/typing.html) and [unit tests](https://docs.python.org/3/library/unittest.html) would also point out these kind of errors :). – AD7six Dec 16 '22 at 08:36

1 Answers1

1

The problem is here:

print((record_history(last_calculation)))

The functoin record_history doesn't return a value, so it implicitly returns None. Instead of trying to print the result of the call (i.e., None), just call it by replacing the above with:

record_history(last_calculation)
Tom Karzes
  • 22,815
  • 2
  • 22
  • 41