***** Loops ***** * ``if``/``else`` are great for having a block of code run when some condition is ``True`` * Sometimes we need a block to repeatedly run *while* some condition is ``True`` Reusing Variables ================= * Before we look at loops, consider the following code .. code-block:: python :linenos: a = 5 print(a) b = 6 print(a) a = a + b print(a) a = 3 a = a + 1 print(a) .. admonition:: Very Quick Activity What is the value of ``a`` at each print statement? In other words, ``a`` is printed out four times --- what values are printed out? * The point being emphasized is that there is nothing stopping us from reusing variables * Assign a value to some variable * Update/change the value stored in that variable * A very common pattern for incrementing the value of some variable in programming is as follows .. code-block:: python :linenos: a = a + 1 * The above example will add one to whatever value is stored in ``a`` and then store that new value back to ``a`` * For example * If ``a`` starts with the value ``5`` * Calculate ``a + 1``, which is ``6`` in this example * Store the newly calculated value of ``6`` in ``a`` * This and similar pattens are so common that many programming languages have shorthands for this .. code-block:: python :linenos: a += 1 # Effectively the same as a = a + 1 * The above example is effectively identical to the previous * It means, add ``1`` to ``a`` and put the newly calculated value back into ``a`` .. admonition:: Activity :class: activity Start with ``a = 5``. #. Figure out what ``a += 2`` does. #. See what happens when you use ``a *= 2``. #. Try other operators to see what works. While loops =========== * So far, if we need to run the same code multiple times, we repeat the code as many times as we need * For example, if I wanted to ``print("Hello, world!)`` five times, I need to write that print statement 5 times * The trouble with this is * It's annoying * It doesn't scale well * It's prone to errors * It will not work for some variable number of times * For example, what if I want to print ``n`` times where ``n`` is some parameter to a function * This is where the ``while`` statement comes in * It will repeat some code ``while`` some condition is ``True`` .. code-block:: python :linenos: counter = 0 while counter < 10: print(counter) counter += 1 * The above example will print out the numbers ``0`` -- ``9`` * We initialized a ``counter`` variable outside the loop * The ``while`` has a conditional expression that gets evaluated * If it is evaluated to ``True``, the indented code runs * ``print`` out the value of ``counter`` * Increment the value of ``counter`` * Repeat the loop until the condition is ``False`` .. admonition:: Activity :class: activity What would happen if ``counter += 1`` was not included in the loop? Try to answer based on what you know. Confirm what happens by trying to run the code. .. raw:: html Tracing Through A Function By Hand ---------------------------------- * Trace through the below code by hand for a few values of ``n`` * See if you can figure out what this function is doing .. code-block:: python :linenos: def trace_through_me_by_hand(n: int) -> int: result = 1 while n > 1: result = result * n n -= 1 return result * ``while`` loops can get complex quickly (if only there were comments) * When tracing through the code, don't try to do it all in your head * Create a table to keep track of the values * Below is an example with ``trace_through_me_by_hand(4)`` +------------------------+---------------+ | n | result | +========================+===============+ | 4 | 1 -> 4 | +------------------------+---------------+ | 3 | 4 -> 12 | +------------------------+---------------+ | 2 | 12 -> 24 | +------------------------+---------------+ | 1 | Stop | +------------------------+---------------+ .. admonition:: Activity :class: activity Write a function called ``int_sum(n)`` that takes a single integer ``n`` as a parameter and returns the sum of all the numbers between ``0`` and ``n`` inclusively (include ``n`` in the summation). When you finish writing the function, do not run it right away --- trace through the program by hand like with the ``trace_through_me_by_hand`` above. .. raw:: html .. admonition:: Activity :class: activity Create a new function called ``int_sum_print`` that is the same as ``int_sum``, however this function should ``print`` out the values of all the variables each time in the loop. Ideally this should be formatted similar to the table created with ``trace_through_me_by_hand``, but do not worry too much about how the ``print``\s format the output. Algorithm ========= * The above functions are all examples of *algorithms* * An algorithm is a description of steps one could take to solve a given problem * Driving directions and cookie recipes are algorithms * Although algorithms can be explained in a natural language like English, when programming we write our algorithms in code * Finding an algorithm to solve a problem is non-trivial * You can make a career out of coming up with algorithms * `There are certain open problems that, if you solve, will literally get you a million dollars and plenty of fame `_ .. admonition:: Activity :class: activity #. Write down (in English) an algorithm for calculating the sum of all the even numbers between ``0`` and ``n``. #. Convert the algorithm into a Python function ``sum_even_numbers(n: int) -> int``. #. Write some ``assert`` tests to verify correctness. For Next Class ============== * Read `Chapter 8 of the text `_