Introduction to Python Programming - Session 2 Catchup
This article was for Hacksoc Nottingham, while I was the 2015-2016 General Secretary.
Hey Hacksoc,
So whether you missed our session last week, or you just want to brush up on it again, we've got a catchup session here.
If this is the first post you're reading, I'd instead recommend following the first session's catchup.
Programming in Python
In the last session, we introduced you to some example programs and how to get some basic input from the user. We're going to build upon that in this session, and make incremental steps to build a more advanced basic calculator.
Letting the user specify operations
In the following program, we're going to expand the Basic Calculator we created last session.
number1 = raw_input("Please enter the first number: ")
number2 = raw_input("Please enter the second number: ")
operation = raw_input("Please enter operation 'plus' 'minus' 'divide' 'multiply': ")
number1 = float(number1)
number2 = float(number2)
operation = str(operation)
result = 0
if(operation == "minus"):
result = number1 - number2
if(operation == "plus"):
result = number1 + number2
if(operation == "divide"):
result = number1 / number2
if(operation == "multiply"):
result = number1 * number2
print number1, operation, number2, "equals", result
We've expanded from our previous example of a Basic Calculator, which allowed a user to print out the result of i.e. 1+2
or 4*10
. However, to change the operation
they want to work with, they would have to edit the file, then rerun the script, every time. I don't know about you, but I'd find this really annoying. To fix this, we're instead going to have it where the user is able to specify which operation they can use to work with.
However, we need to actually work out what the user's input is. To do this, we need to use if
statements, which are a way to perform certain bits of code if some condition is met. To use an if
statement, we pass in a value which can be True
or False
, such as whether something is equal to another "string" == "notstring"
or 7 == 10
. We will cover different comparisons in a later session.
As you see in the first if
statement, we are checking whether operation, which is a string provided by the user, is equal to "minus"
. If this is valid, we then execute the code result = number1 - number2
. The indent defines a block (block: a section of code which is grouped together) which is executed if and only if the string is "minus"
. We then repeat the check for each of the valid options, and execute the result.
We finally print out information to the user about the whole calculation, for instance:
Please enter the first number: 10
Please enter the second number: 20
Please enter operation 'plus' 'minus' 'divide' 'multiply': plus
10.0 plus 20.0 equals 30.0
One thing to note is that we put the result
variable up top so we can correctly set values to it. This is so we don't get issues when trying to refer to something nonexistent.
Handling errors
In the previous section, we created a calculator that can work out calculations given an operator provided by the user. However one thing that is not handled at all are the error cases. When programming, there will often be cases where your code will fail; be it your own code not being 100% correct, or just that the user has done something you haven't expected. In this case, we've been assuming the user will always send us the correct entry. However, what if they were to misspell? The following program allows us to warn the user when they've done something wrong.
number1 = raw_input("Please enter the first number: ")
number2 = raw_input("Please enter the second number: ")
operation = raw_input("Please enter operation 'plus' 'minus' 'divide' 'multiply': ")
number1 = float(number1)
number2 = float(number2)
operation = str(operation)
result = 0
if(operation == "minus"):
result = number1 - number2
elif(operation == "plus"):
result = number1 + number2
elif(operation == "divide"):
result = number1 / number2
elif(operation == "multiply"):
result = number1 * number2
else:
print "Woops, you didn't give me a valid operation ('plus' 'minus' 'divide' 'multiply')"
print number1, operation, number2, "equals", result
You will be able to see that that we've swapped out the if
for elif
. elif
is short for else if
, which means we will now only hit the check for operation == "plus"
if and only if the check for operation == "minus"
does not match true. To verify this, check out the If-Else section. We also take advantage of the else
, which is a way of saying "match anything else that isn't caught above", which is useful because we can't work out every different combination of input that someone can give us.
We will return an error if our user didn't give us anything valid, and print the result whether they gave us valid input or not.
Repeating until we get valid input
In the previous example, we made the program print out an error if we had invalid input. However, that's not very useful to a user, as it means they then need to re-run the application, and enter all their data again. Instead, we're going to keep asking the user to enter their data until we're sure that it's valid.
number1 = raw_input("Please enter the first number: ")
number2 = raw_input("Please enter the second number: ")
number1 = float(number1)
number2 = float(number2)
result = 0
isInvalidInput = True
while isInvalidInput:
operation = raw_input("Please enter operation 'plus' 'minus' 'divide' 'multiply': ")
operation = str(operation)
if(operation == "minus"):
isInvalidInput = False
result = number1 - number2
elif(operation == "plus"):
isInvalidInput = False
result = number1 + number2
elif(operation == "divide"):
isInvalidInput = False
result = number1 / number2
elif(operation == "multiply"):
isInvalidInput = False
result = number1 * number2
else:
print "Woops, you didn't give me a valid operation ('plus' 'minus' 'divide' 'multiply')"
##### end of loop
print number1, operation, number2, "equals", result
We do this by creating a new variable, isValidInput
, which is used in the while
loop. A while
loop will keep repeating the block it corresponds to until the value, isInvalidInput
in this example, does not resolve in False
. Once we have the input, we follow the same structure as the last program - checking whether our input returns the value input we expected. If it does, we set isInvalidInput
to False
- so we will then be able to break out of the while
loop - and also perform the calculation. We perform the calculation here so we don't have to repeat the if statements.
Note that the ####### end of loop
line is purely for visual context, and would generally be removed.
Running multiple calculations
However, what if we want to run multiple calculations? We'd have to keep running the program, which could be a bit annoying. Instead, let's keep running calculations until we're told to stop.
wantMoreCalculations = True
while wantMoreCalculations:
number1 = raw_input("Please enter the first number: ")
number2 = raw_input("Please enter the second number: ")
number1 = float(number1)
number2 = float(number2)
result = 0
isInvalidInput = True
while isInvalidInput:
operation = raw_input("Please enter operation 'plus' 'minus' 'divide' 'multiply': ")
operation = str(operation)
if(operation == "minus"):
isInvalidInput = False
result = number1 - number2
elif(operation == "plus"):
isInvalidInput = False
result = number1 + number2
elif(operation == "divide"):
isInvalidInput = False
result = number1 / number2
elif(operation == "multiply"):
isInvalidInput = False
result = number1 * number2
else:
print "Woops, you didn't give me a valid operation ('plus' 'minus' 'divide' 'multiply')"
#######
print number1, operation, number2, "equals", result
escape = raw_input("Do you want to escape? 'yes' 'no' ")
if(escape == "yes"):
doWantMoreCalculations = False
We contain the whole program inside a big while
loop that waits for the value wantMoreCalculations
to be set to False
by the user. The program exists as it does above, but instead of not doing anything after printing the result, we now ask the user if they want to leave, and if they enter "yes"
the program exits. If not, it will return to asking for the first number again.
We've only got a single if statement at the bottom of the program, instead of two - one for "yes"
and one for "no"
. Why?
If-Else Examples
Try the following examples with varying values of operation
to verify how the if
/elif
/else
statement works:
operation = "minus"
if(operation == "minus"):
print "Operation is minus"
else:
print "Operation is not minus or plus"
if(operation == "plus"):
print "Operation is plus"
elif(operation == "minus"):
print "Operation is minus"
else:
print "Operation is not plus or minus"
if(operation == "divide"):
print "Operation is divide"
else:
print "Operation is not divide or multiply"
if(operation == "multiply"):
print "Operation is multiply"
elif(operation == "divide"):
print "Operation is not multiply or divide"