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
Cell In[2], line 3
fruits ← ["apple", "banana", "cherry"]
^
SyntaxError: invalid character '←' (U+2190)
# Example 1: Simple for loop
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
apple
banana
cherry
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
1
2
3
4
5
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)
1
2
3
4
name : aashray
age : 15
city : San Diego
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.
# Define the number of inputs you want to receive
num_inputs = int(input("Enter the number of inputs: "))
# Initialize an empty dictionary to store input values and their types
input_dict = {}
# Loop to get inputs and determine their types
for i in range(num_inputs):
user_input = input(f"Enter input {i+1}: ")
input_type = type(user_input).__name__ # Get the type of input
# Check if the input is a number and convert it if it is
if input_type in ['int', 'float']:
user_input = float(user_input)
# Update the dictionary with the input and its type
input_dict[f"input_{i+1}"] = user_input
# Print the dictionary with input values and their types
print("\nInput values and their types:")
for key, value in input_dict.items():
print(f"{key}: {value} ({type(value).__name__})")
# Code goes here
Input values and their types:
input_1: 1 (str)
input_2: 1 (str)
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
Index: 0
Element: 4
Index: 1
Element: 6
Index: 2
Element: 7
Index: 3
Element: 2
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")
1 is odd
2 is even
3 is odd
4 is even
5 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 = []
#Code goes here
x=2
for i in range(2):
user = int(input("Enter a number"))
if user % 3==0:
nums.append(user)
else:
print("not divisible by 3")
print("The only numbers divisible by 3 that you entered are:")
print(nums)
not divisible by 3
The only numbers divisible by 3 that you entered are:
[]
not divisible by 3
The only numbers divisible by 3 that you entered are:
[]
Try/Except
-
Using a
try
andexcept
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")
10.0
5.0
Type error
2.5
Division by zero
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 = [1, 2, "three", 4, 0, "five"]
# Code goes here
for item in numbers:
try:
result = 10 / item
print(result)
except ZeroDivisionError:
print("ZeroDivisionError")
except TypeError:
print("TypeError")
10.0
5.0
TypeError
2.5
ZeroDivisionError
TypeError
Continue and Break
Continue
statement skips the current iterationBreak
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)
1
2
4
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')
advik is cool
aashray is cool
advik and aashray love to code code code
akhil is cool
srijan is cool
akhil and srijan 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!
people = {}
# Code here
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)
Factorial of 5 is 120
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 = {}
#Code goes here
students = {
'Alice': 85,
'Bob': 92,
'Charlie': 78,
'David': 60,
'Eve': 45
}
highest_score = max(students.values())
passing_students = [name for name, score in students.items() if score >= 70]
print("\nStudent Grades:")
for name, grade in students.items():
print(f"{name}: {grade}")
print("\nHighest Score:", highest_score)
print("\nPassing Students:")
for name in passing_students:
print(name)
Student Grades:
Alice: 85
Bob: 92
Charlie: 78
David: 60
Eve: 45
Highest Score: 92
Passing Students:
Alice
Bob
Charlie
def get_student_data():
students = {}
while True:
student_name = input("Enter student name (or 'done' to finish): ")
if student_name.lower() == 'done':
break
try:
grade = int(input(f"Enter {student_name}'s grade: "))
students[student_name] = grade
except ValueError:
print("Invalid input. Please enter an integer grade.")
return students
def analyze_student_data(students):
if not students:
print("No student data provided.")
return None, []
# Find the highest score
highest_score = max(students.values())
# Identify students who passed (score >= 50)
passing_students = [name for name, score in students.items() if score >= 50]
return highest_score, passing_students
def main():
print("Enter student names and grades. Type 'done' when finished.")
student_data = get_student_data()
highest_score, passing_students = analyze_student_data(student_data)
print("\nStudent Grades:")
for name, grade in student_data.items():
print(f"{name}: {grade}")
if student_data:
print("\nHighest Score:", highest_score)
if passing_students:
print("\nPassing Students:")
for name in passing_students:
print(name)
else:
print("No students passed.")
if __name__ == "__main__":
main()
Enter student names and grades. Type 'done' when finished.
Student Grades:
Jacob: 90
Maisie: 32
Don: 34
John: 88
Greg: 67
Dre: 89
Wally: 99
Sergi: 76
Jeremy: 45
Son: 84
Gene: 50
S: 45
s: 67
a: 21
Highest Score: 99
Passing Students:
Jacob
John
Greg
Dre
Wally
Sergi
Son
Gene
s