Building programs with Python
Making choices
Learning Objectives
- Write conditional statements including
if
,elif
, andelse
branches. - Evaluate expressions containing
and
andor
. - Use conditionals to conditionally process input data.
So what if we want to do something that’s dependent on whether a given condition is true? In this lesson, we’ll learn how to write code that runs only when certain conditions are true.
Conditionals
We can ask Python to take different actions, depending on a condition, with an if statement (you’ll need to type this in - don’t copy and paste this code directly, it won’t work):
num = 37
if num > 100:
print("greater")
else:
print("not greater")
print("done")
not greater
done
The second line of this code uses the keyword if
to tell Python that we want to make a choice. If the test that follows it is true, the body of the if
(i.e., the lines indented underneath it) are executed. If the test is false, the body of the else
is executed instead. Only one or the other is ever executed:
Conditional statements don’t have to necessarily include an else
. If there isn’t one, Python simply does nothing if the test is false (you’ll need to type this in - don’t copy and paste this code directly, it won’t work):
num = 53
print("before conditional...")
if num > 100:
print("53 is greater than 100")
print("...after conditional")
before conditional...
...after conditional
We can also chain several tests together using elif
, which is short for “else if” as shown in the example code chunk below:
num = -3
if num > 0:
print("Sign of a number:",num,"is:",1)
elif num == 0:
print("Sign of a number",num,"is:",0)
else:
print("Sign of a number",num, "is:",-1)
sign of a number -3 is: -1
The keyword elif
is short for else if
, and is useful to avoid excessive indentation. An if ... elif ... elif ...
sequence is a substitute for the switch
or case
statements found in other languages.
One important thing to notice in the code above is that we use a double equals sign ==
to test for equality rather than a single equals sign because the latter is used to mean assignment. This convention was inherited from C, and while many other programming languages work the same way, it does take a bit of getting used to…
We can also combine tests using and
and or
. and
is only true if both parts are true:
if (1 > 0) and (-1 > 0):
print("both parts are true")
else:
print("one part is not true")
one part is not true
while or
is true if either part is true:
if (1 < 0) or ('left' < 'right'):
print("at least one test is true")
at least one test is true
In this case, “either” means “either or both”, not “either one or the other but not both”.
How many paths?
Which of the following would be printed if you were to run this code? Why did you pick this answer?
- A
- B
- C
- B and C
if 4 > 5:
print('A')
elif 4 <= 5:
print('B')
elif 4 < 5:
print('C')
Solution
C gets printed because the first two conditions,
4 > 5
and4 == 5
, are not true, but4 < 5
is true.
What Is Truth?
True
and False
are special words in Python called booleans
which represent true and false statements. However, they aren’t the only values in Python that are true and false. In fact, any value can be used in an if
or elif
. After reading and running the code below, explain what the rule is for which values are considered true and which are considered false.
if '':
print('empty string is true')
if 'word':
print('word is true')
if []:
print('empty list is true')
if [1, 2, 3]:
print('non-empty list is true')
if 0:
print('zero is true')
if 1:
print('one is true')
Another type of loop
We’ve seen how to write loops where perhaps we know how many times we want the loop to execute beforehand, e.g. printing out each character in a string. So we can use for loops to execute a fixed operation over a known number of steps.
But what if we want our loop to continue to execute until some other condition is true? Perhaps our code runs a simulation that generates a set of results each time through the loop, but we’re not sure when the results will be what we want, i.e. we don’t know how many times the loop needs to execute. For these types of cases, we can use a while
loop, which is similar to a for
loop but exits the loop when some condition is true.
Consider the following example:
from random import randint
number = 0
while number != 5:
number = randint(1, 10)
print(number)
We use Python’s ability to generate a random number here for clarity, but this could instead be calling a function that runs another step in our simulation and returns a result.
So in this case, our loop will continue to generate and print out random numbers between and 10 while the generated number is not equal to 5. When the random number generated is 5, the loop will exit.
while
loops are a more general case of loops which are often useful (you can even simulate a for
loop using a while
loop). But you should preferably use for
loops as opposed to while
loops where you can, since they are more specific and it’s more readable - it’s easier to figure out how many times the loop will execute.
Climate Analysis: adding a condition to avoid printing comments
We’re still getting our column header at the top of our output, and perhaps we don’t want that. We need to able to check whether the line begins with a ‘#’ (which denotes a comment line), and if so, avoid printing it out.
So let’s use an if
statement to do that (see climate_analysis-4.py
):
climate_data = open('../data/sc_climate_data_10.csv', 'r')
for line in climate_data:
data = line.split(',')
if data[0][0] == '#':
# don't want to process comment lines, which start with '#'
pass
else:
# print 4th column (max temperature)
print('Max temperature', data[3])
Max temperature 58.53
Max temperature 58.60
Max temperature 58.30
Max temperature 56.91
Max temperature 59.86
Max temperature 58.95
Max temperature 58.73
Max temperature 61.41
Max temperature 61.27
Max temperature 61.41