Loop
Loops are to expressions as multiplication is to addition. They help us
run the same code many times until a certain condition is not met. This
module shows how to use the for-loop and while-loop, and also shows how
continue and break give us precise control over a loop's lifecycle.
Note that for-else and while-else loops exist in Python, but they are not commonly used.
def main():
    # This is a `for` loop that iterates on values 0..4 and adds each
    # value to `total`. It leverages the `range` iterator. Providing
    # a single integer implies that the start point is 0, the end point
    # is 5 and the increment step is 1 (going forward one step)
    total = 0
    for i in range(5):
        total += i
    # The answer is...10!
    assert total == 10
    # This is a `for` loop that iterates on values 5..1 and multiplies each
    # value to `fact`. The `range` iterator is used here more precisely by
    # setting the start point at 5, the end point at 0 and the increment
    # step at -1 (going backward one step)
    fact = 1
    for i in range(5, 0, -1):
        fact *= i
    # The answer is...120!
    assert fact == 120
    # This is a simple `while` loop, similar to a `for` loop except that the
    # counter is declared outside of the loop and its state is explicitly
    # managed inside of the loop. The loop will continue until the counter
    # exceeds 8
    i = 0
    while i < 8:
        i += 2
    # The `while` loop terminated at this value
    assert i == 8
    # This is a `while` loop that stops with `break` and its counter is
    # multiplied in the loop, showing that we can do anything to the
    # counter. Like the previous `while` loop, this one continues until
    # the counter exceeds 8
    i = 1
    break_hit = False
    continue_hit = False
    other_hit = False
    while True:
        i *= 2
        if i >= 8:
            # The `break` statement stops the current `while` loop.
            # If this `while` loop was nested in another loop,
            # this statement would not stop the parent loop
            break_hit = True
            break
        if i == 2:
            # The `continue` statement returns to the start of the
            # current `while` loop
            continue_hit = True
            continue
        # This statement runs when the counter equals 4
        other_hit = True
    # The `while` loop terminated at this value
    assert i == 8
    # The `while` loop hit the `break` and `continue` blocks
    assert break_hit is True
    assert continue_hit is True
    assert other_hit is True
if __name__ == "__main__":
    main()