Reflection

  • Iterations can be used to repeat repetitive tasks a certain number of times or until a condition is met.
  • Iterations is also useful for running certain parts of code that are laboring to rewrite everytime.
  • Syntax: for(range){code}

or

while(condition){code}

Introduction

In this lesson, we will explore the various ways to create loops in Python. Loops are essential for repetitive tasks and are a fundamental concept in programming. We will cover different types of loops, advanced loop techniques, and how to work with lists and dictionaries using loops.

For Loops

  • Used to iterate over a sequence (such as a list, tuple, string, or range)
  • Executes a block of code for each item in the sequence
# APCSP Pseudo-Code: Iterating Over a List of Fruits

fruits  ["apple", "banana", "cherry"]

FOR EACH fruit IN fruits:
    DISPLAY fruit
END FOR



# Example 1: Simple for loop
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

While Loops

  • Used to execute a block of code as long as a condition is true
# APCSP Pseudo-Code: Using a While Loop to Count and Display Numbers


i  1


WHILE i  5:
    DISPLAY i
    i  i + 1
END WHILE
# Example 2: Simple while loop
i = 1
while i <= 5:
    print(i)
    i += 1

Looping with Lists and Dictionaries

  • Used to iterate through the elements of lists and dictionaries
# APCSP Pseudo-Code: Loop Through a List

numbers  [1, 2, 3, 4]
FOR EACH num IN numbers:
    DISPLAY num
END FOR

# APCSP Pseudo-Code: Loop Through a Dictionary
person  {"name": "aashray", "age": 15, "city": "San Diego"}
FOR EACH key, value IN person:
    DISPLAY key, ":", value
END FOR

# Example 3: Loop through a list
numbers = [1, 2, 3, 4]
for num in numbers:
    print(num)

# Example 4: Loop through a dictionary
person = {"name": "aashray", "age": 15, "city": "San Diego"}
for key, value in person.items():
    print(key, ":", value)

Popcorn Hack 1

  • Use a loop to get X amount of inputs. Then use a loop to find the type of each value.

  • Extra Challenge: If an input is a number, make the corresponding value in the dictionary a number.


sample_dict = {}

# Code goes here
x = 5;
for i in range(x):
    sample = input("Enter value")
    print(type(sample))
    sample_dict[i] = sample;
    
print(sample_dict)

Looping with Index Variable

You can use the range function to create a loop with an index variable.

# APCSP Pseudo-Code: Loop Through a List Using Index

lst  [4, 6, 7, 2]
FOR i IN RANGE(LENGTH(lst)):
    DISPLAY "Index: " + STRING(i)
    DISPLAY "Element: " + STRING(GET_ELEMENT(lst, i))
END FOR
# Example 5: Loop with an index variable

lst = [4, 6, 7, 2]

for i in range(len(lst)): # Loop for the number of elements in the list
    print('Index: ' + str(i)) # Print the index
    print('Element: ' + str(lst[i])) # Print the element

Nested If Statements

You can nest conditional statements inside a for loop to execute different code based on conditions.

# APCSP Pseudo-Code: For Loop with Nested If Statements

numbers  [1, 2, 3, 4, 5]
FOR EACH num IN numbers:
    IF num MOD 2 EQUALS 0:
        DISPLAY num, "is even"
    ELSE:
        DISPLAY num, "is odd"
    END IF
END FOR

# Example 6: For loop with nested if statements
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        print(num, "is even")
    else:
        print(num, "is odd")

Popcorn Hack 2

  • Use the input() function to append a range of integers from a list

  • Use a nested if statement to only print numbers in the list that are evenly divisble by 3

nums = []
for i in range(4):
    num = int(input("Enter number: "))
    nums.append(num);
    
for i in nums:
    if(i % 3 == 0):
        print(i)
        
    
#Code goes here

Try/Except

  • Using a try and except block inside a loop can handle errors gracefully.

  • Very useful for production code, even in frontend webapps

    • Ex: Giving an error page instead of dumping critical information on the webpage
# APCSP Pseudo-Code: Handling Errors in a For Loop

numbers  [1, 2, "three", 4, 0, "five"]
FOR EACH item IN numbers:
    TRY:
        DISPLAY 10 / item
    CATCH ZeroDivisionError:
        DISPLAY "Division by zero"
    CATCH TypeError:
        DISPLAY "Type error"
    END TRY
END FOR

numbers = [1, 2, "three", 4, 0, "five"]

for item in numbers:
    try:
        print(10 / item)
    except ZeroDivisionError: #Type of error: Dividing by Zero
        print("Division by zero")
    except TypeError: #Type of error: Dividing by something that isn't a number
        print("Type error")

Popcorn Hack 3

  • Create a for loop that uses a try and except statement for an AttributeError
  • Use integers and a list to create scenarios where the loop will either print something expected or print an error message
  • CHALLENGE: Try using the math module for this error
numbers = []
for i in range(5):
    try:
        numbers.append("W");
    except AttributeError:
        

# Code goes here

Continue and Break

  • Continue statement skips the current iteration
  • Break statement exits the loop prematurely
# APCSP Pseudo-Code: For Loop with Continue and Break

numbers  [1, 2, 3, 4, 5]
FOR EACH num IN numbers:
 
    IF num EQUALS 3:
        CONTINUE
    IF num EQUALS 5:
        BREAK 
    DISPLAY num
END FOR

# Example 8: For loop with continue and break
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num == 3:
        continue  # Skip the number 3
    if num == 5:
        break  # Exit the loop when 5 is encountered
    print(num)

Nested For Loops

  • You can also put for loops within for loops
  • Allows for looping an exponential amount of times
# APCSP Pseudo-Code: Nested Loops for Group Names

groups  [["advik", "aashray"], ["akhil", "srijan"]]

FOR EACH pair IN groups:
    FOR EACH person IN pair:
        DISPLAY person + " is cool"
    END FOR
    DISPLAY pair[0] + " and " + pair[1] + " love to code code code"
END FOR

groups = [['advik', 'aashray'], ['akhil', 'srijan']]

for pair in groups:
    for person in pair:
        print(person + ' is cool')
    print(pair[0] + ' and ' + pair[1] + ' love to code code code')

(OPTIONAL) Popcorn Hack 4

  • Create a nested for loop that iterates over a dictionary that has:
    • A name for each key
    • A list for each value containing stuff like age, grade, etc.
  • Break/continue if certain conditions are met
  • Have fun! If you want to, relate it to a theme!
# value = [age, grade]
people = {"person1" : [13, 5],"person2" : [14, 6],"person3" : [11, 1]};
for i in people:
    if people[i][0] == 13:
        print("NO 13 YEARS OLD ALLOWED!");
        break;
    else:
        print(i + " IS ELIGIBLE")
        continue;

# Code here
NO 13 YEARS OLD ALLOWED!

Iteration via Recursion

  • A technique where a function calls itself
  • Can be used to recreate loops until a certain condition is met
# APCSP Pseudo-Code: Recursion for Factorial Calculation

FUNCTION factorial(n):
    IF n EQUALS 0:
        RETURN 1
    ELSE IF n LESS THAN 0:
        RETURN "undefined"
    ELSE IF TYPEOF(n) EQUALS "float":
        RETURN "not solvable without gamma function"
    ELSE:
        RETURN n TIMES factorial(n - 1)
    END IF
END FUNCTION

result  CALL factorial(5)
DISPLAY "Factorial of 5 is", result

# Example 9: Recursion for factorial calculation
def factorial(n):
    if n == 0: #Conditions to stop the recursion
        return 1 # 0! is 1
    elif n < 0:
        return "undefined" # Undefined for negative numbers 
    elif isinstance(n, float):
        return "not solvable without gamma function" # Only accept integers
    else:
        return n * factorial(n - 1) #Function calling itself

result = factorial(5)
print("Factorial of 5 is", result)

Homework

  • Add student names w/ grades to a dictionary until the user doesn’t want more students
    • Prompt for user input for all of these
  • Use a nested if/else statement in a for loop
    • Get the highest score in the dictionary
    • Add all students who passed into a new list (add student names, not their scores)
  • Bonus: Use a try/except for any scores that aren’t integers
students = {}
boolean = True;
while(boolean):
    name = input("Enter Student name: ");
    try:
        grade = int(input("Enter Student grade: "));
    except ValueError:
        print("INVALID INPUT");
        break;
    students[name] = grade;
    cont = input("Continue? (Y/N): ");
    if(cont == "N"):
        boolean = False;
max = students[list(students.keys())[0]];
for i in range(len(students)):
    if(students[list(students.keys())[0]] > max):
        max = students[list(students.keys())[0]];
print("MAX: " + str(max))

passedStudents = [];
for i in students:
    if(students[i] >= 70):
        passedStudents.append(i);

print("Passing is 70");
print("Passed students: ", end = "")
print(passedStudents)
#Code goes here
MAX: 2
Passed students: ['s2', 's3']