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
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")
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 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)
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']