{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Exploratory Computing with Python\n",
"*Developed by Mark Bakker*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Notebook 3: `for` loops and `if/else` statements\n",
"As we will again be using `numpy` and `matplotlib`, we start by importing them"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The `for` loop\n",
"Loops are used to execute a command repeatedly. The syntax for a loop is as follows"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello world, the value of i is 0\n",
"Hello world, the value of i is 1\n",
"Hello world, the value of i is 2\n",
"Hello world, the value of i is 3\n",
"Hello world, the value of i is 4\n"
]
}
],
"source": [
"for i in [0, 1, 2, 3, 4]:\n",
" print('Hello world, the value of i is', i)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the code above, the variable `i` loops through the five values in the list `[0, 1, 2, 3, 4]`. The first time through, the value of `i` is equal to `0`, the second time through, its value is `1`, and so on till the last time when its value is `4`. Note the syntax of a `for` loop: At the end of the `for` statement you need to put a colon (`:`) and after that you need to indent. It doesn't matter how many spaces you indent, as long as you keep using the same number of spaces for the entire `for` loop. Jupyter Notebooks automatically indent 4 spaces, which is considered good Python style, so use that. You can have as many lines of code inside the `for` loop as you want. To end the `for` loop, simply stop indenting. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"x, xsquare 0 0\n",
"x, xsquare 1 1\n",
"x, xsquare 2 4\n",
"x, xsquare 3 9\n",
"We are done with the loop\n"
]
}
],
"source": [
"for x in [0, 1, 2, 3]: \n",
" xsquared = x ** 2\n",
" print('x, xsquare', x, xsquared)\n",
"print('We are done with the loop')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The list of values to loop through can be anything. It doesn't even have to be numbers. The `for` loop simply goes through all the values in the list one by one:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"the value of data is: 20\n",
"the value of data is: mark\n",
"the value of data is: 3.1622776601683795\n"
]
}
],
"source": [
"for data in [20, 'mark', np.sqrt(10)]:\n",
" print('the value of data is:', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is, of course, rather inconvenient to have to specify a list to loop through when the list is very long. For example, if you want to do something 100 times, you don't want to type a list of values from 0 up to 100. But Python has a convenient function for that called `range`. You can loop through a `range` just like you can loop through a list. To loop 10 times, starting with the value `0`:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"the value of i is: 0\n",
"the value of i is: 1\n",
"the value of i is: 2\n",
"the value of i is: 3\n",
"the value of i is: 4\n",
"the value of i is: 5\n",
"the value of i is: 6\n",
"the value of i is: 7\n",
"the value of i is: 8\n",
"the value of i is: 9\n"
]
}
],
"source": [
"for i in range(10):\n",
" print('the value of i is:', i)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A `range` can be converted to a list with the `list` function (but we will not use that option very often). You can call `range` with just one argument, in which case it will generate a range from 0 up to but not including the specified number. Note that `range(10)` produces 10 numbers from 0 up to and including 9. You can optionally give a starting value and a step, similar to the `np.arange` function."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a range with 10 values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
"a range from 10 till 20 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\n",
"a range from 10 till 20 with steps of 2: [10, 12, 14, 16, 18]\n"
]
}
],
"source": [
"print('a range with 10 values:', list(range(10)))\n",
"print('a range from 10 till 20', list(range(10, 20)))\n",
"print('a range from 10 till 20 with steps of 2:', list(range(10, 20, 2)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A loop can be used to fill an array. Let's compute $y=\\cos(x)$ where $x$ is an array that varies from 0 to $2\\pi$ with 100 points. We already know, of course, that this can be done with the statement `y = np.cos(x)`. Sometimes this is not possible, however, and we need to fill an array with a loop. First we have to create the array `y` (for example filled with zeros using the `zeros_like` function) and then fill it with the correct values by looping through all values of `x`, so that the index goes from `0` to the length of the `x` array. The counter in the loop (the variable `i` in the code below) is used as the index of the array that is filled."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"