diff --git a/book/.DS_Store b/book/.DS_Store
index 92fabb4..09b04c5 100644
Binary files a/book/.DS_Store and b/book/.DS_Store differ
diff --git a/book/_toc.yml b/book/_toc.yml
index 0f6967c..ea6fe03 100644
--- a/book/_toc.yml
+++ b/book/_toc.yml
@@ -42,15 +42,15 @@ parts:
- file: exercise_notebooks/exercise_notebook_3_structures_loops.ipynb
# - file: exercise_notebooks/exercise_notebook_3_loops_debugging.ipynb
- # - file: notebook_4_debugging/PythonNotebook4_first_page.ipynb
- # sections:
- # - file: notebook_4_debugging/PythonNotebook4_debugging.ipynb
- # - file: exercise_notebooks/exercise_notebook_4_debugging.ipynb
+ - file: notebook_4_debugging/PythonNotebook4_first_page.ipynb
+ sections:
+ - file: notebook_4_debugging/PythonNotebook4_debugging.ipynb
+ - file: exercise_notebooks/exercise_notebook_4_debugging.ipynb
- # - file: notebook_5_figures/PythonNotebook5_first_page.ipynb
- # sections:
- # - file: notebook_5_figures/PythonNotebook5_matplotlib.ipynb
- # - file: exercise_notebooks/exercise_notebook_5_figures.ipynb
+ - file: notebook_5_figures/PythonNotebook5_first_page.ipynb
+ sections:
+ # - file: notebook_5_figures/PythonNotebook5_matplotlib.ipynb
+ - file: exercise_notebooks/exercise_notebook_5_figures.ipynb
# - file: notebook_6_numpy/PythonNotebook6_first_page.ipynb
# sections:
diff --git a/book/exercise_notebooks/exercise_notebook_3_structures_loops.zip b/book/exercise_notebooks/exercise_notebook_3_structures_loops.zip
index 842f169..81cb97a 100644
Binary files a/book/exercise_notebooks/exercise_notebook_3_structures_loops.zip and b/book/exercise_notebooks/exercise_notebook_3_structures_loops.zip differ
diff --git a/book/exercise_notebooks/exercise_notebook_4_debugging.ipynb b/book/exercise_notebooks/exercise_notebook_4_debugging.ipynb
index 7bec943..82510a4 100644
--- a/book/exercise_notebooks/exercise_notebook_4_debugging.ipynb
+++ b/book/exercise_notebooks/exercise_notebook_4_debugging.ipynb
@@ -42,7 +42,11 @@
"outputs": [],
"source": [
"def is_prime(n):\n",
- " return True # or False"
+ " \"\"\" \n",
+ " Check if a number is prime. The input argument n must be a positive integer.\n",
+ " The function returns True if n is prime, and False otherwise.\n",
+ " \"\"\"\n",
+ " ...\n"
]
},
{
@@ -54,7 +58,7 @@
"\n",
"Use your is_prime() function to create a list of all primes $< 1000$. What is the sum of all primes $< 1000$?\n",
"\n",
- "Hint: is there a nice way to calculate the sum of the elements in a list?\n",
+ "Hint: you will need a for loop to fill the list.\n",
"\n"
]
},
@@ -67,8 +71,8 @@
"prime_list = ...\n",
"prime_sum = ...\n",
"\n",
- "print(prime_list)\n",
- "print(prime_sum)"
+ "print(f'List of primes: {prime_list}\\n')\n",
+ "print(f'Sum of primes: {prime_sum}')"
]
},
{
@@ -81,7 +85,7 @@
}
},
"source": [
- "
\"AES\" without removing the variable that holds it. You'll need to fix 2 errors.\"EC&T\" without removing the variable that holds it. You'll need to fix 2 errors.n! = n * (n - 1) * (n - 2) * ... * 2 * 1. The function uses the fact that if n > 0, n! = n * (n - 1)!. This is an example of a _recursive_ function, a function that calls itself.\n",
"\n",
- "The code below calls the function \"factorial\" with the number 4 as input. The factorial of 4 is 4 * 3 * 2 * 1, which is 24, but the code below prints 262144. Find and fix the semantic error in this function."
+ "The code below calls the function factorial with the number 4 as input. The factorial of 4 is $4 \\cdot 3 \\cdot 2 \\cdot 1 = 24$, but the code below prints 262144. Find and fix the error in this function. What kind of error is this (syntax, runtime, semantic)?"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "262144"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"def factorial(x):\n",
" \"returns the factorial of x\"\n",
@@ -140,13 +133,6 @@
"\n",
"factorial(4)"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
@@ -165,7 +151,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.12.7"
+ "version": "3.13.2"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
diff --git a/book/exercise_notebooks/exercise_notebook_4_debugging.zip b/book/exercise_notebooks/exercise_notebook_4_debugging.zip
new file mode 100644
index 0000000..a269e98
Binary files /dev/null and b/book/exercise_notebooks/exercise_notebook_4_debugging.zip differ
diff --git a/book/exercise_notebooks/exercise_notebook_5_figures.ipynb b/book/exercise_notebooks/exercise_notebook_5_figures.ipynb
index 9652116..0b07c50 100644
--- a/book/exercise_notebooks/exercise_notebook_5_figures.ipynb
+++ b/book/exercise_notebooks/exercise_notebook_5_figures.ipynb
@@ -261,7 +261,7 @@
"**Label hint:** unfortunately there is no function `plot.zlabel()`.\n",
"Instead you have to use `ax.set_zlabel('...')`. You can use `ax.set_xlabel()` and `ax.set_ylabel()` too. Your script looks nicer if you handle all axes in the same way.\n",
" \n",
- "**Note:** the z-label doesn't necessary show up anyway, perhaps it's hidden behind the plot. If you could rotate the plot it might show up. For now let's choose our battles and not worry about this.\n",
+ "**Note:** the z-label doesn't necessarily show up anyway, perhaps it's hidden behind the plot. If you could rotate the plot it might show up. For now let's choose our battles and not worry about this.\n",
""
]
},
diff --git a/book/exercise_notebooks/exercise_notebook_5_figures.zip b/book/exercise_notebooks/exercise_notebook_5_figures.zip
index df6fdd3..506f0eb 100644
Binary files a/book/exercise_notebooks/exercise_notebook_5_figures.zip and b/book/exercise_notebooks/exercise_notebook_5_figures.zip differ
diff --git a/book/exercise_notebooks/exercise_notebook_6_numpy.ipynb b/book/exercise_notebooks/exercise_notebook_6_numpy.ipynb
index 12d7512..200cceb 100644
--- a/book/exercise_notebooks/exercise_notebook_6_numpy.ipynb
+++ b/book/exercise_notebooks/exercise_notebook_6_numpy.ipynb
@@ -184,7 +184,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.5"
+ "version": "3.10.0"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
diff --git a/book/notebook_3_structures_loops/PythonNotebook3_loops.ipynb b/book/notebook_3_structures_loops/PythonNotebook3_loops.ipynb
index b004e1a..b28bdfc 100644
--- a/book/notebook_3_structures_loops/PythonNotebook3_loops.ipynb
+++ b/book/notebook_3_structures_loops/PythonNotebook3_loops.ipynb
@@ -278,25 +278,57 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f = [-2, 4, 16, 40, 82, 148]\n"
+ ]
+ }
+ ],
"source": [
"x = [0, 1, 2, 3, 4, 5]\n",
"f = [x[0] ** 3 + 5*x[0] - 2, x[1] ** 3 + 5*x[1] - 2, x[2] ** 3 + 5*x[2] - 2, x[3] ** 3 + 5*x[3] - 2, x[4] ** 3 + 5*x[4] - 2, x[5] ** 3 + 5*x[5] - 2]\n",
"print(f'f = {f }')"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can see above, that a list was created by using the equation for every item in $x$. A more convenient way is to use a for loop, as shown below. This is especially important if you need to cycle over a large number of items/values.\n",
+ "\n",
+ "You can see that we first create an empty list $f$; in each cycle of the loop, we will then add a new item to $f$. In order to do so, we use .append (see Section 3.1)."
+ ]
+ },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "In this cycle we added f(0) = -2\n",
+ "In this cycle we added f(1) = 4\n",
+ "In this cycle we added f(2) = 16\n",
+ "In this cycle we added f(3) = 40\n",
+ "In this cycle we added f(4) = 82\n",
+ "In this cycle we added f(5) = 148\n",
+ "f(x) = [-2, 4, 16, 40, 82, 148]\n"
+ ]
+ }
+ ],
"source": [
"x = [0, 1, 2, 3, 4, 5]\n",
"f = []\n",
"for i in x:\n",
" f.append(x[i] ** 3 + 5*x[i] - 2)\n",
+ " print(f'In this cycle we added f({x[i]}) = {f[i]}')\n",
"print(f'f = {f }')"
]
},
@@ -651,7 +683,7 @@
}
},
"source": [
- "As you can see, with the help of the continue keyword we managed to skip some of the iterations. Also worth noting that $0$ is divisible by any number, for that reason the calculate_cool_function(i) at i = 0 didn't run."
+ "As you can see, with the help of the continue keyword we skipped the execution of calculate_cool_function(i)< for all even $i$. Also worth noting that $0$ is divisible by any number, for that reason the calculate_cool_function(i) at i = 0 didn't run."
]
},
{
@@ -705,6 +737,20 @@
"for i in range(3, 17, 2):\n",
" print(f'i is {i}')"
]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### After this Chapter you should be able to:\n",
+ "\n",
+ "- understand the differences between **`list`**, **`tuple`**, and **`dict`**\n",
+ "- slice lists and tuples\n",
+ "- use for loops\n",
+ "- use while loops\n",
+ "- use break and continue in loops\n",
+ "- understand range()"
+ ]
}
],
"metadata": {
diff --git a/book/notebook_4_debugging/PythonNotebook4_debugging.ipynb b/book/notebook_4_debugging/PythonNotebook4_debugging.ipynb
index b805833..02b56fe 100644
--- a/book/notebook_4_debugging/PythonNotebook4_debugging.ipynb
+++ b/book/notebook_4_debugging/PythonNotebook4_debugging.ipynb
@@ -296,20 +296,19 @@
"source": [
"#### After this Chapter you should be able to:\n",
"\n",
- "- understand the differences between **`list`**, **`tuple`**, and **`dict`**\n",
- "- slice lists and tuples\n",
- "- use for loops\n",
- "- use while loops\n",
- "- use break and continue in loops\n",
- "- understand range()\n",
"- know different types of errors\n",
"- have a plan when debugging your code"
]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "base",
"language": "python",
"name": "python3"
},
@@ -323,7 +322,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.0"
+ "version": "3.13.2"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
@@ -342,11 +341,6 @@
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
- },
- "vscode": {
- "interpreter": {
- "hash": "1fe2f2b718b1108b9c4176932db8a0ead471245140baaa21ea96a4066683e6b2"
- }
}
},
"nbformat": 4,
diff --git a/book/notebook_4_debugging/PythonNotebook4_first_page copy.ipynb b/book/notebook_4_debugging/PythonNotebook4_first_page.ipynb
similarity index 84%
rename from book/notebook_4_debugging/PythonNotebook4_first_page copy.ipynb
rename to book/notebook_4_debugging/PythonNotebook4_first_page.ipynb
index 9a24edb..2a22138 100644
--- a/book/notebook_4_debugging/PythonNotebook4_first_page copy.ipynb
+++ b/book/notebook_4_debugging/PythonNotebook4_first_page.ipynb
@@ -17,7 +17,7 @@
"# 4: Debugging\n",
"