Python For Beginners

Introduction to Control Flow

Control structures are fundamental constructs that enable a programmer to dictate the flow of control through a program
Enroll

Introduction to Control Structures

In programming, control structures are fundamental constructs that enable a programmer to dictate the flow of control through a program. These structures allow the execution of code blocks based on conditions, enable repetitive execution of a block of code, and manage the flow and decision-making processes within a program. Understanding control structures is crucial because they form the backbone of how programs make decisions, repeat tasks, and branch into different paths of execution.

Why Control Structures are Important

  1. Decision Making: Control structures allow programs to react differently under varying conditions, closely mimicking decision-making in the real world.
  2. Code Reusability: They help in executing the same piece of code multiple times without rewriting it, enhancing code reusability and efficiency.
  3. Program Flow Control: Control structures enable the management of the program's flow, allowing for complex programs that can handle multiple scenarios and perform varied tasks.
  4. Efficiency: They can significantly reduce the amount of code needed and increase the efficiency of programs by avoiding redundancy and enhancing logical flow.

Types of Control Structures in Python

Python, like many programming languages, provides several control structures that can be broadly categorized into:

  1. Conditional Statements: These are used for decision-making processes. Based on a condition, different actions can be taken. Python uses if, elif, and else statements for conditionals.
  2. Loops: Loops are used for executing a block of code repeatedly. Python provides two types of loops:
    • For Loops: Ideal for iterating over a sequence (like a list, tuple, dictionary, set, or string) and executing a block of code for each item in the sequence.
    • While Loops: Execute a block of code as long as a specified condition is true. They're useful when the number of iterations is not known before the loop starts.
  3. Branching: Within loops, Python uses control statements like break and continue to add flexibility by terminating the loop or skipping to the next iteration under certain conditions. Pass is another control statement used as a placeholder for future code.

Understanding and effectively utilizing these control structures is key to building efficient, readable, and powerful Python programs. In the following sections, we'll dive deeper into each type of control structure, providing examples and exercises to strengthen your understanding and application of these fundamental programming concepts.

Section 1: Conditional Statements

Conditional statements are the cornerstone of decision-making in programming. They allow a program to execute different blocks of code based on certain conditions. Python provides if, elif, and else for this purpose, enabling programs to react differently to various inputs or situations.

Theory: if, elif, and else Statements

  • if Statement: This is the most basic form of decision-making in programming. The if statement evaluates a condition—if the condition is True, the code block under it gets executed. If the condition is False, the code block is skipped.
  • elif (Else If) Statement: elif stands for "else if." It allows for multiple conditions to be checked in sequence. If the condition for an if statement is False, the program checks the conditions of subsequent elif blocks. This is useful for handling multiple potential cases.
  • else Statement: The else block is executed if none of the preceding if or elif conditions are True. It's like a catch-all for any case that wasn't specifically addressed by the earlier conditions.

Example: Choosing Activities Based on Weather

Consider a simple example where you recommend activities based on the weather condition:

weather = input("Enter the weather (sunny, rainy, snowy): ")

if weather == "sunny":
    print("Let's go for a hike!")
elif weather == "rainy":
    print("Let's read a book at home.")
elif weather == "snowy":
    print("Let's make a snowman!")
else:
    print("Hmm, not sure what we should do. Let's watch a movie!")


This script takes the weather condition as input and prints an activity recommendation. It demonstrates the use of if, elif, and else statements to handle different conditions.

Exercise: Recommend a Meal Based on Time of Day

Your task is to write a conditional statement that recommends what to eat based on the time of day. Assume the user inputs an integer representing the hour (24-hour format). Your program should follow these guidelines:

  • Breakfast (5:00 - 9:59): "It's time for breakfast! How about some eggs and toast?"
  • Lunch (10:00 - 13:59): "It's lunchtime! Maybe a salad or a sandwich?"
  • Dinner (17:00 - 21:59): "It's dinner time! How about some pasta or steak?"
  • Any other time: "Hmm, it's not a typical mealtime. Maybe some snacks or a piece of fruit?"

Hint: Use if, elif, and else statements to check the time and print the corresponding meal recommendation.

weather = input("Enter the weather (sunny, rainy, snowy): ")

if weather == "sunny":
    print("Let's go for a hike!")
elif weather == "rainy":
    print("Let's read a book at home.")
elif weather == "snowy":
    print("Let's make a snowman!")
else:
    print("Hmm, not sure what we should do. Let's watch a movie!")
weather = input("Enter the weather (sunny, rainy, snowy): ")
attendees_count = int(input("Enter the number of attendees: "))

if weather == "sunny":
    if attendees_count < 50:
        print("Weather is perfect for a small picnic in the park.")
    elif attendees_count <= 200:
        print("Weather is sunny! Ideal for an outdoor team-building event.")
    else:
        print("Sunny weather! How about a large outdoor concert?")
elif weather == "rainy":
    if attendees_count < 50:
        print("It's rainy. Consider a small indoor art workshop.")
    elif attendees_count <= 200:
        print("Rainy weather. Perfect for a medium-sized indoor gaming event.")
    else:
        print("It's rainy. How about booking a large indoor arena for a sports event?")
elif weather == "snowy":
    if attendees_count < 50:
        print("Snowy outside! A small group can go ice skating.")
    elif attendees_count <= 200:
        print("With this snow, a medium group can enjoy a day of skiing.")
    else:
        print("For such a large group, consider renting a lodge for a snowy retreat.")
else:
    print("The weather condition is not recognized. Please consider indoor activities.")

Section 2: Loops

Loops allow us to execute a block of code multiple times, which is particularly useful for iterating over items in a sequence (such as lists or strings), executing a block of code a certain number of times, or iterating until a condition is met. In Python, loops are implemented through for and while statements. Here, we'll focus on for loops.

Part 1: For Loops

Theory

A for loop in Python iterates over items in a sequence, which can be a list, a tuple, a dictionary, a set, or a string. Each iteration assigns the next element in the sequence to a variable, and the block of code within the loop is executed.

The general syntax of a for loop is:

for variable in sequence:
    # block of code to execute

for loops are versatile and can be used with various types of sequences. They're especially powerful in combination with the range() function, which generates a sequence of numbers, allowing the for loop to execute a block of code a specific number of times.

Example: Iterating Over a List and a String

Iterating Over a List

Let's start with a simple example where we have a list of numbers, and we want to print each number doubled.

numbers = [1, 2, 3, 4, 5]
for number in numbers:
    print(number * 2)


Iterating Over a String

Similarly, you can iterate over each character in a string:

greeting = "Hello"
for letter in greeting:
    print(letter)


In the first example, each element of the list numbers is accessed one by one through the loop and printed after being doubled. In the second example, each character of the string greeting is accessed in sequence and printed.

Exercise: Iterating Over a List to Perform Operations

Suppose you have a list of prices in dollars. Your task is to convert these prices into another currency by applying a conversion rate and then print the converted prices. Assume the conversion rate is 0.8 (for example, converting dollars to euros at a rate of 0.8 euros per dollar).

prices_in_dollars = [10, 20, 30, 40, 50]
conversion_rate = 0.8
# Your code here: create a for loop to iterate over the list and print each price converted to euros.

Certainly! Iterating over a dictionary in Python is an important skill, as it allows you to access both keys and values efficiently. Let's add an example to the for loops section that covers how to iterate over a dictionary.

Example: Iterating Over a Dictionary

Dictionaries in Python are key-value pairs. You can iterate over the keys, the values, or both keys and values together. Here are examples of each approach:

Iterating Over Keys

To iterate over just the keys of a dictionary:

capitals = {"USA": "Washington, D.C.", "France": "Paris", "Italy": "Rome"}
for country in capitals:
    print(country)


This will print the names of the countries. Note that when you iterate over a dictionary directly, you're iterating over its keys by default.

Iterating Over Values

To iterate over the values:

for capital in capitals.values():
    print(capital)

This will print the names of the capitals.

Iterating Over Keys and Values

To iterate over both keys and values, you can use the .items() method:

for country, capital in capitals.items():
    print(f"The capital of {country} is {capital}.")

This will print statements that include both the country and its capital, demonstrating how to access both keys and values when iterating over a dictionary.

Exercise: Dictionary Iteration

Given a dictionary of products and their prices, write a for loop that prints out each product and its price in a formatted string. Then, update the prices by applying a 10% discount and print the updated dictionary.

Initial dictionary:

products = {"Apple": 1.2, "Banana": 0.5, "Orange": 0.8}


Your task:

  1. Print each product and its price in the format: "Product: Price"
  2. Apply a 10% discount to each price.
  3. Print the updated dictionary with the new prices.

Part 2: While Loops

While loops are a fundamental control structure in Python that allows for repeated execution of a block of code as long as a condition remains true. They are particularly useful when the number of iterations needed is not known before the loop starts.

Theory

A while loop checks a condition before executing the block of code it contains. If the condition evaluates to True, the loop's body is executed. After the body executes, the condition is checked again, and if it remains True, the loop continues. This process repeats until the condition evaluates to False, at which point the loop terminates and the program moves on to the next block of code.

The basic syntax of a while loop is:

while condition:
    # block of code to execute

It's crucial to ensure that the condition eventually becomes False; otherwise, the loop will continue indefinitely, creating an infinite loop.

Example: A Simple while Loop

Let's look at a simple example that uses a while loop to count down from 5.

count = 5
while count > 0:
    print(count)
    count -= 1  # This is crucial to ensure the loop eventually ends
print("Blast off!")

This script starts with count set to 5 and decreases count by 1 in each iteration. When count becomes 0, the condition count > 0 evaluates to False, and the loop ends, printing "Blast off!".

Exercise: Writing a while Loop

For this exercise, you will write a while loop that calculates the sum of numbers from 1 to n, where n is an input from the user. Your task is to:

  1. Prompt the user to enter a positive integer n.
  2. Use a while loop to add all integers from 1 up to and including n.
  3. Print the final sum.

Hint: You'll need to initialize a variable to keep track of the sum and another to act as the counter for the current number to be added. Increment the counter in each iteration and add its value to the sum variable.

Here's a structure to get you started:

n = int(input("Enter a positive integer: "))
current_number = 1
total_sum = 0

# Your while loop goes here

print(f"The sum of numbers from 1 to {n} is {total_sum}.")


Section 3: Control Structures for Branching

In Python, control structures for branching, such as break, continue, and pass, provide additional mechanisms to influence the flow of loops beyond the basic iteration patterns. These statements can alter the course of a loop based on specific conditions, offering more control and flexibility in program logic.

Theory

  • break Statement: Used to exit a loop prematurely, regardless of the iteration condition. It is typically used in conditional statements within the loop to "break out" of the loop when a certain condition is met.
  • continue Statement: Unlike break, continue does not terminate the loop. Instead, it skips the rest of the code inside the loop for the current iteration and moves to the next iteration of the loop.
  • pass Statement: Acts as a placeholder and does nothing. It is used when a statement is syntactically required, but you do not want any command or code to execute. The pass statement can be used in loops, conditionals, functions, and more.

Example: Using break and continue

Using break

Consider a scenario where you're searching for a specific value in a list, and you want to stop the search once the value is found:

numbers = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
search_for = 6

for number in numbers:
    if number == search_for:
        print(f"Found {search_for}!")
        break  # Exit the loop
    print(f"Searching... {number}")


In this example, the loop terminates when the search value is found, thanks to the break statement.

Using continue

Imagine you're iterating through a list and want to print only the odd numbers, skipping the even ones:

numbers = range(1, 11)  # Creates a range from 1 to 10

for number in numbers:
    if number % 2 == 0:  # Check if the number is even
        continue  # Skip the rest of the loop and continue with the next iteration
    print(number)


Here, continue causes the loop to skip even numbers, printing only the odd ones.

Exercise: Modifying Loops with break or continue

Given a list of integers from 1 to 100, write two loops:

  1. Using break: Loop through the list and print each number until you reach a number that is divisible by 10, then exit the loop.
  2. Using continue: Loop through the same list and print only numbers that are not divisible by 3.
numbers = list(range(1, 101))

# Loop 1: Use 'break'
# Your code here

# Loop 2: Use 'continue'
# Your code here

Section 4: Nested Control Structures

Nested control structures involve placing one control structure inside another. This concept is crucial for tackling more complex problems that require multiple layers of decision-making and iteration. Python allows for nesting various control structures, such as if statements within for loops, while loops within if statements, and any other combination as needed.

Theory

Nesting is a powerful feature that enhances the flexibility and capability of control structures. It allows for more precise and detailed control of program flow. For instance, you can use a nested for loop to iterate over multi-dimensional data structures, like lists of lists (which can represent matrices or tables), or to perform complex calculations that require multiple levels of iteration.

Similarly, nesting if statements within loops enables more complex decision-making processes during iteration, allowing programs to react differently under a wide variety of conditions.

Example: Nested for Loops and Conditional Statements

Nested for Loops

Imagine you have a matrix (a list of lists) representing a 2D grid, and you want to print each value in the grid:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in matrix:
    for value in row:
        print(value, end=' ')
    print()  # Creates a new line after printing each row

This code snippet demonstrates a nested for loop where the outer loop iterates over each row, and the inner loop iterates over each value in the row.

Combining if Statements and Loops

Consider a situation where you want to print only the odd numbers from the same matrix:

for row in matrix:
    for value in row:
        if value % 2 != 0:  # Check if the number is odd
            print(value, end=' ')
    print()

This example shows how if statements can be nested within for loops to add a condition to the inner loop, printing only odd numbers from the matrix.

Exercise: Create a Nested Control Structure

Imagine you are working with data representing the monthly sales figures for different products over a quarter (three months). The data is structured as a list of lists, where each inner list contains the sales figures for a product across three months.

Your task is to:

  1. Calculate the average monthly sales for each product.
  2. Print the product number (index + 1) and its average sales, but only for products with an average sale above a certain threshold.

Here's the data structure and the threshold:

sales_data = [
    [150, 200, 250],
    [300, 300, 300],
    [100, 90, 80]
]
threshold = 250

# Your code here to calculate and print the product number and its average sales for those above the threshold

Section 5: Advanced Topics

As you become more comfortable with basic control structures in Python, you might find yourself seeking more elegant or efficient ways to write code for common patterns. Two powerful concepts that can add sophistication and flexibility to your programming are comprehensions and recursion. While not control structures in the traditional sense, they offer alternative ways to handle iteration and decision-making in your code.

Comprehensions as a Control Structure

Comprehensions in Python provide a concise way to create lists, dictionaries, sets, and even generators based on existing iterables. They can be viewed as a more readable and expressive alternative to using loops for creating collections.

List Comprehensions

List comprehensions allow for the creation of a new list by applying an expression to each item in an existing iterable.

Syntax with example

Syntax:

[new_item for item in iterable if condition]
Example:

# Creating a list of squares for even numbers from 1 to 10
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)


Dictionary Comprehensions

Similarly, dictionary comprehensions allow for the creation of dictionaries in a single, readable line.

Syntax:

{key_expression: value_expression for item in iterable if condition}


Example:

# Creating a dictionary of numbers and their squares
squares_dict = {x: x**2 for x in range(6)}
print(squares_dict

Recursion as a Form of Control Structure

Recursion involves a function calling itself, either directly or indirectly, allowing for the solution of problems by breaking them down into simpler, smaller problems. It's an alternative to iterative loops for certain kinds of tasks, especially those that naturally fit a divide-and-conquer approach.

Example:

Calculating factorial using recursion:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(5))

In this example, factorial calls itself with a decremented value of n until it reaches the base case (n == 0), at which point it returns 1 and unravels the recursive calls.

Exercise: Implement Comprehensions and Recursion

  1. Using Comprehensions: Given a list of words, use a list comprehension to create a new list containing only those words that are longer than 5 characters.
words = ["Python", "is", "awesome", "incredible", "exquisite", "short"]
# Your list comprehension here
  1. Using Recursion: Write a recursive function to calculate the nth number in the Fibonacci sequence. Recall that the Fibonacci sequence is a series of numbers where each number is the sum of the two preceding ones, starting from 0 and 1.
# Your recursive function here
def fibonacci(n):
    # Base cases and recursive call
Lesson Assignment
Challenge yourself with our lab assignment and put your skills to test.
# Python Program to find the area of triangle

a = 5
b = 6
c = 7

# Uncomment below to take inputs from the user
# a = float(input('Enter first side: '))
# b = float(input('Enter second side: '))
# c = float(input('Enter third side: '))

# calculate the semi-perimeter
s = (a + b + c) / 2

# calculate the area
area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
print('The area of the triangle is %0.2f' %area)
Sign up to get access to our code lab and run this code.
Sign up

Create Your Account Now!

Join our platform today and unlock access to expert- led courses, hands- on exercises, and a supportive learning community.
Sign Up