Foundations
Loops
Repeat Actions
You're grading 30 student exams. Instead of writing the same calculation 30 times, you use a loop: for each exam, calculate the percentage, record the grade. Same logic, applied to every item in your list.
Print each element
Visit every element in a list, one by one.
nums = [10, 20, 30, 40, 50]
print("nums=" + str(nums))
for i in range(len(nums)):
x = nums[i]
nums ← [10, 20, 30, 40, 50]
1nums→ [10, 20, 30, 40, 50] = [10, 20, 30, 40, 50]23print("nums=" + str(nums[10, 20, 30, 40, 50]))4for i in range(len(nums)):outputnums=[10, 20, 30, 40, 50]x ← 10
pass 1 of 53print("nums=" + str(nums))4for i0 in range(len(nums[10, 20, 30, 40, 50])):5 x→ 10 = nums[i]10All 5 passes — pass 1 is the card above pass inums[i]x1 0 10 10 2 1 20 20 3 2 30 30 4 3 40 40 5 4 50 50
The loop runs once for each element. i is the index: 0, 1, 2, 3, 4.
Sum of a list
Add up all the numbers in a list.
nums = [10, 20, 30, 40, 50]
print("nums=" + str(nums))
sum = 0
for i in range(len(nums)):
sum = sum + nums[i]
nums ← [10, 20, 30, 40, 50], sum ← 0
1nums→ [10, 20, 30, 40, 50] = [10, 20, 30, 40, 50]23print("nums=" + str(nums[10, 20, 30, 40, 50]))4sum→ 0 = 05#?accumulatoroutputnums=[10, 20, 30, 40, 50]sum ← 10
pass 1 of 55#?accumulator6for i0 in range(len(nums[10, 20, 30, 40, 50])):7 sum→ 10 = sum + nums[i]10All 5 passes — pass 1 is the card above pass inums[i]sum1 0 10 0 → 10 2 1 20 10 → 30 3 2 30 30 → 60 4 3 40 60 → 100 5 4 50 100 → 150
Start with total = 0, then add each element one by one. This pattern is called an accumulator.
See the Loop State
A loop is easier to trust when you can see the variable state after each pass. These diagrams use the exact nums = [10, 20, 30, 40, 50] sum example above.
Count how many elements match
How many numbers are greater than 50?
nums = [35, 72, 48, 91, 56, 23, 88]
print("nums=" + str(nums))
count = 0
for i in range(len(nums)):
if nums[i] > 50:
count = count + 1
nums ← [35, 72, 48, 91, 56, 23, 88], count ← 0
1nums→ [35, 72, 48, 91, 56, 23, 88] = [35, 72, 48, 91, 56, 23, 88]23print("nums=" + str(nums[35, 72, 48, 91, 56, 23, 88]))4count→ 0 = 05for i in range(len(nums)):outputnums=[35, 72, 48, 91, 56, 23, 88]for i in range(len(nums)):
pass 1 of 74count = 05for i0 in range(len(nums[35, 72, 48, 91, 56, 23, 88])):6 if nums[i] > 50:7 count = count + 1All 7 passes — pass 1 is the card above pass i1 0 2 1 3 2 4 3 5 4 6 5 7 6 count ← 1
pass 1 of 45for i in range(len(nums)):6 if nums[i]72 > 50:7 count→ 1 = count + 1All 4 passes — pass 1 is the card above pass nums[i]count1 72 0 → 1 2 91 1 → 2 3 56 2 → 3 4 88 3 → 4
Use a counter variable, increment it when condition is met.
Fibonacci with a loop
Generate Fibonacci numbers using a loop instead of writing each line.
n = 10
fib = [0] * n
fib[0] = 0
fib[1] = 1
for i in range(2, n):
fib[i] = fib[i - 1] + fib[i - 2]
print("fib=" + str(fib))
n = 5
fib = [0] * n
fib[0] = 0
fib[1] = 1
for i in range(2, n):
fib[i] = fib[i - 1] + fib[i - 2]
print("fib=" + str(fib))
n = 15
fib = [0] * n
fib[0] = 0
fib[1] = 1
for i in range(2, n):
fib[i] = fib[i - 1] + fib[i - 2]
print("fib=" + str(fib))
n ← 10, fib ← [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], fib[0] ← 0, fib[1] ← 1
1n→ 10 = 10 #@n=5, 152fib→ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] = [0] * n1034fib[0]→ 0 = 05fib[1]→ 1 = 1fib[i] ← 1
pass 1 of 87for i2 in range(2, n10):8 fib[i]→ 1 = fib[i - 1]1 + fib[i - 2]0All 8 passes — pass 1 is the card above pass ifib[i - 1]fib[i - 2]fib[i]1 2 1 0 1 2 3 1 1 2 3 4 2 1 3 4 5 3 2 5 5 6 5 3 8 6 7 8 5 13 7 8 13 8 21 8 9 21 13 34 print("fib=" + str(fib))
10print("fib=" + str(fib[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]))outputfib=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
n ← 5, fib ← [0, 0, 0, 0, 0], fib[0] ← 0, fib[1] ← 1
1n→ 5 = 52fib→ [0, 0, 0, 0, 0] = [0] * n534fib[0]→ 0 = 05fib[1]→ 1 = 1fib[i] ← 1
pass 1 of 37for i2 in range(2, n5):8 fib[i]→ 1 = fib[i - 1]1 + fib[i - 2]0All 3 passes — pass 1 is the card above pass ifib[i - 1]fib[i - 2]fib[i]1 2 1 0 1 2 3 1 1 2 3 4 2 1 3 print("fib=" + str(fib))
10print("fib=" + str(fib[0, 1, 1, 2, 3]))outputfib=[0, 1, 1, 2, 3]
n ← 15, fib ← [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], fib[0] ← 0
1n→ 15 = 152fib→ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] = [0] * n1534fib[0]→ 0 = 05fib[1]→ 1 = 1fib[i] ← 1
pass 1 of 137for i2 in range(2, n15):8 fib[i]→ 1 = fib[i - 1]1 + fib[i - 2]013 passes — pass 1 is the card above pass ifib[i - 1]fib[i - 2]fib[i]1 2 1 0 1 2 3 1 1 2 3 4 2 1 3 4 5 3 2 5 5 6 5 3 8 6 7 8 5 13 7 8 13 8 21 8 9 21 13 34 9 10 34 21 55 ⋯ 2 more passes ⋯ 12 13 144 89 233 13 14 233 144 377 print("fib=" + str(fib))
10print("fib=" + str(fib[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]))outputfib=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
The loop pattern: each element depends on the previous two. Loops let us express this once, then repeat it as many times as needed.