Python Branching and Loops
Python Branching and Loops
Python
Jupyter Notebooks: This tutorial is a Jupyter notebook - a document made of cells. Each cell can contain
code written in Python or explanations in plain English. You can execute code cells and view the results,
e.g., numbers, messages, graphs, tables, les, etc., instantly within the notebook. Jupyter is a powerful
platform for experimentation and analysis. Don't be afraid to mess around with the code & break things -
you'll learn a lot by encountering and xing errors. You can use the "Kernel > Restart & Clear Output"
menu option to clear all outputs and start again from the top.
Branching with if, else and elif
One of the most powerful features of programming languages is branching: the ability to make decisions and
execute a different set of statements based on whether one or more conditions are true.
The if statement
In Python, branching is implemented using the if statement, which is written as follows:
if condition:
statement1
statement2
The condition can be a value, variable or expression. If the condition evaluates to True , then the statements
within the if block are executed. Notice the four spaces before statement1 , statement2 , etc. The spaces
inform Python that these statements are associated with the if statement above. This technique of structuring
code by adding spaces is called indentation.
Indentation: Python relies heavily on indentation (white space before a statement) to de ne code
structure. This makes Python code easy to read and understand. You can run into problems if you don't
use indentation properly. Indent your code by placing the cursor at the start of the line and pressing the
Tab key once to add 4 spaces. Pressing Tab again will indent the code further by 4 more spaces, and
press Shift+Tab will reduce the indentation by 4 spaces.
For example, let's write some code to check and print a message if a given number is even.
a_number = 34
if a_number % 2 == 0:
print("We're inside an if block")
print('The given number {} is even.'.format(a_number))
We use the modulus operator % to calculate the remainder from the division of a_number by 2 . Then, we use
the comparison operator == check if the remainder is 0 , which tells us whether the number is even, i.e., divisible
by 2.
Since 34 is divisible by 2 , the expression a_number % 2 == 0 evaluates to True , so the print statement
under the if statement is executed. Also, note that we are using the string format method to include the
number within the message.
another_number = 33
if another_number % 2 == 0:
print('The given number {} is even.'.format(another_number))
if condition:
statement1
statement2
else:
statement4
statement5
If condition evaluates to True , the statements in the if block are executed. If it evaluates to False , the
statements in the else block are executed.
a_number = 34
if a_number % 2 == 0:
print('The given number {} is even.'.format(a_number))
else:
print('The given number {} is odd.'.format(a_number))
another_number = 33
if another_number % 2 == 0:
print('The given number {} is even.'.format(another_number))
else:
print('The given number {} is odd.'.format(another_number))
Here's another example, which uses the in operator to check membership within a tuple.
a_candidate = "D'Artagnan"
if a_candidate in the_3_musketeers:
print("{} is a musketeer".format(a_candidate))
else:
print("{} is not a musketeer".format(a_candidate))
today = 'Wednesday'
if today == 'Sunday':
print("Today is the day of the sun.")
elif today == 'Monday':
print("Today is the day of the moon.")
elif today == 'Tuesday':
print("Today is the day of Tyr, the god of war.")
elif today == 'Wednesday':
print("Today is the day of Odin, the supreme diety.")
elif today == 'Thursday':
print("Today is the day of Thor, the god of thunder.")
elif today == 'Friday':
print("Today is the day of Frigga, the goddess of beauty.")
elif today == 'Saturday':
print("Today is the day of Saturn, the god of fun and feasting.")
In the above example, the rst 3 conditions evaluate to False , so none of the rst 3 messages are printed. The
fourth condition evaluates to True , so the corresponding message is printed. The remaining conditions are
skipped. Try changing the value of today above and re-executing the cells to print all the different messages.
To verify that the remaining conditions are skipped, let us try another example.
a_number = 15
if a_number % 2 == 0:
print('{} is divisible by 2'.format(a_number))
elif a_number % 3 == 0:
print('{} is divisible by 3'.format(a_number))
elif a_number % 5 == 0:
print('{} is divisible by 5'.format(a_number))
elif a_number % 7 == 0:
print('{} is divisible by 7'.format(a_number))
15 is divisible by 3
Note that the message 15 is divisible by 5 is not printed because the condition a_number % 5 == 0
isn't evaluated, since the previous condition a_number % 3 == 0 evaluates to True . This is the key difference
between using a chain of if , elif , elif ... statements vs. a chain of if statements, where each condition is
evaluated independently.
if a_number % 2 == 0:
print('{} is divisible by 2'.format(a_number))
if a_number % 3 == 0:
print('{} is divisible by 3'.format(a_number))
if a_number % 5 == 0:
print('{} is divisible by 5'.format(a_number))
if a_number % 7 == 0:
print('{} is divisible by 7'.format(a_number))
15 is divisible by 3
15 is divisible by 5
a_number = 49
if a_number % 2 == 0:
print('{} is divisible by 2'.format(a_number))
elif a_number % 3 == 0:
print('{} is divisible by 3'.format(a_number))
elif a_number % 5 == 0:
print('{} is divisible by 5'.format(a_number))
else:
print('All checks failed!')
print('{} is not divisible by 2, 3 or 5'.format(a_number))
Conditions can also be combined using the logical operators and , or and not . Logical operators are
explained in detail in the rst tutorial.
a_number = 12
if '':
print('The condition evaluted to True')
else:
print('The condition evaluted to False')
if 'Hello':
print('The condition evaluted to True')
else:
print('The condition evaluted to False')
if { 'a': 34 }:
print('The condition evaluted to True')
else:
print('The condition evaluted to False')
if None:
print('The condition evaluted to True')
else:
print('The condition evaluted to False')
a_number = 15
if a_number % 2 == 0:
print("{} is even".format(a_number))
if a_number % 3 == 0:
print("{} is also divisible by 3".format(a_number))
else:
print("{} is not divisible by 3".format(a_number))
else:
print("{} is odd".format(a_number))
if a_number % 5 == 0:
print("{} is also divisible by 5".format(a_number))
else:
print("{} is not divisible by 5".format(a_number))
15 is odd
15 is also divisible by 5
Notice how the print statements are indented by 8 spaces to indicate that they are part of the inner
if / else blocks.
Nested if , else statements are often confusing to read and prone to human error. It's good to avoid
nesting whenever possible, or limit the nesting to 1 or 2 levels.
a_number = 13
if a_number % 2 == 0:
parity = 'even'
else:
parity = 'odd'
Python provides a shorter syntax, which allows writing such conditions in a single line of code. It is known as a
conditional expression, sometimes also referred to as a ternary operator. It has the following syntax:
if condition:
x = true_value
else:
x = false_value
Statements: A statement is an instruction that can be executed. Every line of code we have written so
far is a statement e.g. assigning a variable, calling a function, conditional statements using if , else ,
and elif , loops using for and while etc.
Expressions: An expression is some code that evaluates to a value. Examples include values of different
data types, arithmetic expressions, conditions, variables, function calls, conditional expressions, etc.
Most expressions can be executed as statements, but not all statements are expressions. For example, the regular
if statement is not an expression since it does not evaluate to a value. It merely performs some branching in the
code. Similarly, loops and function de nitions are not expressions (we'll learn more about these in later sections).
As a rule of thumb, an expression is anything that can appear on the right side of the assignment operator = . You
can use this as a test for checking whether something is an expression or not. You'll get a syntax error if you try to
assign something that is not an expression.
# if statement
result = if a_number % 2 == 0:
'even'
else:
'odd'
# if expression
result = 'even' if a_number % 2 == 0 else 'odd'
a_number = 9
if a_number % 2 == 0:
elif a_number % 3 == 0:
print('{} is divisible by 3 but not divisible by 2')
import jovian
jovian.commit(project='python-branching-and-loops')
'https://jovian.ai/aakashns/python-branching-and-loops'
The rst time you run jovian.commit , you may be asked to provide an API Key to securely upload the notebook
to your Jovian account. You can get the API key from your Jovian pro le page after logging in / signing up.
jovian.commit uploads the notebook to your Jovian account, captures the Python environment, and creates a
shareable link for your notebook, as shown above. You can use this link to share your work and let anyone
(including you) run your notebooks and reproduce your work.
while condition:
statement(s)
Statements in the code block under while are executed repeatedly as long as the condition evaluates to
True . Generally, one of the statements under while makes some change to a variable that causes the
condition to evaluate to False after a certain number of iterations.
Let's try to calculate the factorial of 100 using a while loop. The factorial of a number n is the product
(multiplication) of all the numbers from 1 to n , i.e., 1*2*3*...*(n-2)*(n-1)*n .
result = 1
i = 1
We initialize two variables, result and, i . result will contain the nal outcome. And i is used to keep
track of the next number to be multiplied with result . Both are initialized to 1 (can you explain why?)
The condition i <= 100 holds true (since i is initially 1 ), so the while block is executed.
The result is updated to result * i , i is increased by 1 and it now has the value 2 .
At this point, the condition i <= 100 is evaluated again. Since it continues to hold true, result is again
updated to result * i , and i is increased to 3 .
This process is repeated till the condition becomes false, which happens when i holds the value 101 . Once
the condition evaluates to False , the execution of the loop ends, and the print statement below it is
executed.
Can you see why result contains the value of the factorial of 100 at the end? If not, try adding print
statements inside the while block to print result and i in each iteration.
Iteration is a powerful technique because it gives computers a massive advantage over human beings in
performing thousands or even millions of repetitive operations really fast. With just 4-5 lines of code, we
were able to multiply 100 numbers almost instantly. The same code can be used to multiply a thousand
numbers (just change the condition to i <= 1000 ) in a few seconds.
You can check how long a cell takes to execute by adding the magic command %%time at the top of a cell. Try
checking how long it takes to compute the factorial of 100 , 1000 , 10000 , 100000 , etc.
%%time
result = 1
i = 1
print(result)
4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442
CPU times: user 905 µs, sys: 362 µs, total: 1.27 ms
Wall time: 974 µs
Here's another example that uses two while loops to create an interesting pattern.
line = '*'
max_length = 10
*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*
Can you see how the above example works? As an exercise, try printing the following pattern using a while loop
(Hint: use string concatenation):
*
**
***
****
*****
******
*****
****
***
**
*
*
***
*****
*******
*********
***********
*********
*******
*****
***
*
Watch this playlist to learn how to create the above patterns: https://www.youtube.com/watch?v=2Icpbawb-
vw&list=PLyMom0n-MBrpVcMqVV9kbA-hq2ygir0uW
Infinite Loops
Suppose the condition in a while loop always holds true. In that case, Python repeatedly executes the code
within the loop forever, and the execution of the code never completes. This situation is called an in nite loop. It
generally indicates that you've made a mistake in your code. For example, you may have provided the wrong
condition or forgotten to update a variable within the loop, eventually falsifying the condition.
If your code is stuck in an in nite loop during execution, just press the "Stop" button on the toolbar (next to "Run")
or select "Kernel > Interrupt" from the menu bar. This will interrupt the execution of the code. The following two
cells both lead to in nite loops and need to be interrupted.
result = 1
i = 1
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
<ipython-input-41-5234d8c241fc> in <module>
5
6 while i <= 100:
----> 7 result = result * i
8 # forgot to increment i
KeyboardInterrupt:
# INFINITE LOOP - INTERRUPT THIS CELL
result = 1
i = 1
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
<ipython-input-42-c4abf72fce4d> in <module>
5
6 while i > 0 : # wrong condition
----> 7 result *= i
8 i += 1
KeyboardInterrupt:
i = 1
result = 1
print('i:', i)
print('result:', result)
As you can see above, the value of i at the end of execution is 42. This example also shows how you can use an
if statement within a while loop.
Sometimes you may not want to end the loop entirely, but simply skip the remaining statements in the loop and
continue to the next loop. You can do this using the continue statement.
i = 1
result = 1
while i < 20:
i += 1
if i % 2 == 0:
print('Skipping {}'.format(i))
continue
print('Multiplying with {}'.format(i))
result = result * i
print('i:', i)
print('result:', result)
Skipping 2
Multiplying with 3
Skipping 4
Multiplying with 5
Skipping 6
Multiplying with 7
Skipping 8
Multiplying with 9
Skipping 10
Multiplying with 11
Skipping 12
Multiplying with 13
Skipping 14
Multiplying with 15
Skipping 16
Multiplying with 17
Skipping 18
Multiplying with 19
Skipping 20
i: 20
result: 654729075
In the example above, the statement result = result * i inside the loop is skipped when i is even, as
indicated by the messages printed during execution.
Logging: The process of adding print statements at different points in the code (often within loops
and conditional statements) for inspecting the values of variables at various stages of execution is
called logging. As our programs get larger, they naturally become prone to human errors. Logging can
help in verifying the program is working as expected. In many cases, print statements are added
while writing & testing some code and are removed later.
jovian.commit()
[jovian] Attempting to save notebook..
[jovian] Updating notebook "aakashns/python-branching-and-loops" on https://jovian.ai/
[jovian] Uploading notebook..
[jovian] Capturing environment..
[jovian] Committed successfully! https://jovian.ai/aakashns/python-branching-and-loops
'https://jovian.ai/aakashns/python-branching-and-loops'
The statements within the loop are executed once for each element in sequence . Here's an example that prints
all the element of a list.
Monday
Tuesday
Wednesday
Thursday
Friday
Let's try using for loops with some other data types.
M
o
n
d
a
y
Note that while using a dictionary with a for loop, the iteration happens over the dictionary's keys. The key can
be used within the loop to access the value. You can also iterate directly over the values using the .values
method or over key-value pairs using the .items method.
John Doe
Male
32
True
Since a key-value pair is a tuple, we can also extract the key & value into separate variables.
range(a, b, step) - Creates a sequence of numbers from a to b-1 with increments of step
for i in range(7):
print(i)
0
1
2
3
4
5
6
3
4
5
6
7
8
9
3
7
11
Ranges are used for iterating over lists when you need to track the index of elements while iterating.
for i in range(len(a_list)):
print('The value at position {} is {}.'.format(i, a_list[i]))
The value at position 0 is Monday.
The value at position 1 is Tuesday.
The value at position 2 is Wednesday.
The value at position 3 is Thursday.
The value at position 4 is Friday.
Another way to achieve the same result is by using the enumerate function with a_list as an input, which
returns a tuple containing the index and the corresponding element.
,
break continue and pass statements
Similar to while loops, for loops also support the break and continue statements. break is used for
breaking out of the loop and continue is used for skipping ahead to the next iteration.
Today is Monday
Today is Tuesday
Today is Wednesday
I don't work beyond Wednesday!
Today is Monday
Today is Tuesday
I don't work on Wednesday!
Today is Thursday
Today is Friday
Like if statements, for loops cannot be empty, so you can use a pass statement if you don't want to execute
any statements inside the loop.
name : John
sex : Male
name : Jane
sex : Female
Monday apple
Monday banana
Monday guava
Tuesday apple
Tuesday banana
Tuesday guava
Wednesday apple
Wednesday banana
Wednesday guava
You are now ready to move on to the next tutorial: Writing Reusable Code Using Functions in Python
Let's save a snapshot of our notebook one nal time using jovian.commit .
jovian.commit()
8. What happens when the condition within the if statement evaluates to True? What happens if the condition
evaluates for false?
17. Write a program that uses if, elif, and else statements together.
20. What is the difference between a chain of if, elif, elif… statements and a chain of if, if, if… statements?
Give an example.
21. Can non-boolean conditions be used with if statements? Give some examples.
22. What are nested conditional statements? How are they useful?
23. Give an example of nested conditional statements.
24. Why is it advisable to avoid nested conditional statements?
26. What is the syntax of the shorthand if conditional expression? Give an example.
27. What is the difference between the shorthand if expression and the regular if statement?
28. What is a statement in Python?
37. What is the syntax of the white statement in Python? Give an example.
38. Write a program to compute the sum of the numbers 1 to 100 using a while loop.
39. Repeat the above program for numbers up to 1000, 10000, and 100000. How long does it take each loop to
complete?
46. Give an example of using the continue statement within a while loop.
57. How are the break, continue, and pass statements used in for loops? Give examples.
58. Can loops be nested within other loops? How is nesting useful?
59. Give an example of a for loop nested within another for loop.
60. Give an example of a while loop nested within another while loop.