{
"cells": [
{
"cell_type": "markdown",
"id": "0489ff14-6a60-491a-9b41-811ed19b6de2",
"metadata": {},
"source": [
"This is the transcript of the lecture material from Friday, November 15, 2024. \n",
" \n",
"Let's start by building two collections that look like arrays in Fortran. Notice the difference in notation between a and b, however. \n",
"Collection a uses ()'s, while b uses []'s."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d174582b-3683-4c25-b9dd-c65702cc882e",
"metadata": {},
"outputs": [],
"source": [
"a = (2,3,4)\n",
"b = [2,3,4]"
]
},
{
"cell_type": "markdown",
"id": "0b0120f1-da4b-427a-b5d6-fefc0076e8fa",
"metadata": {},
"source": [
"Let's see what each one of these really is."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "44079e9d-a266-45dd-a6e3-14d3df154a44",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tuple"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(a)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ed0e6b6d-e050-4f70-a271-73186483f281",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"list"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(b)"
]
},
{
"cell_type": "markdown",
"id": "fdad07fd-bb46-4cac-9b36-649e63d43a3b",
"metadata": {},
"source": [
"Collection a is a tuple, while collection b is a list. What is the difference? Let's start by changing an element of list b."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1df59ba2-c810-4c94-b6ce-e9083a1a585f",
"metadata": {},
"outputs": [],
"source": [
"b[1] = 5"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4de2e0d2-af0f-404e-858e-a874e02b8928",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2, 5, 4]\n"
]
}
],
"source": [
"print(b)"
]
},
{
"cell_type": "markdown",
"id": "e65b154c-8e9b-44c5-9beb-0dceca35775c",
"metadata": {},
"source": [
"Ok. No problem. This worked. Notice that b[1] is the SECOND element of the list. Remember, python indexing starts with 0, not 1 like Fortran. \n",
"Great. Now let's try and change an element of tuple a."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "c32fd8b4-b4b3-4061-9c9d-b5cab439f288",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'tuple' object does not support item assignment",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43ma\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m5\u001b[39m\n",
"\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
]
}
],
"source": [
"a[1] = 5"
]
},
{
"cell_type": "markdown",
"id": "793305eb-da61-4c28-ad1e-52516019c46c",
"metadata": {},
"source": [
"We get an error. Why? The reason is that lists are mutable (able to be changed), and tuples are immutable (not able to be changed). \n",
"When we tried to change an element of the tuple, python threw an error. \n",
"Let's look at another list."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1067de57-2eb6-4322-a9c4-966306b906f7",
"metadata": {},
"outputs": [],
"source": [
"b = [91, 'Lions', 273.15]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "1b965e7a-f51c-40fd-8ae7-52a8f022e050",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"int"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(b[0])"
]
},
{
"cell_type": "markdown",
"id": "fb7d581a-bccc-4363-bcf3-6e460ab29d65",
"metadata": {},
"source": [
"In python, lists and tuples can contain elements of different types. Our new list b contains an integer, string, and float. \n",
"What happens with this line?"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "ae967cdf-a4a8-4571-8ab8-07ecc7486f45",
"metadata": {},
"outputs": [
{
"ename": "IndexError",
"evalue": "tuple index out of range",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43ma\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m]\u001b[49m)\n",
"\u001b[0;31mIndexError\u001b[0m: tuple index out of range"
]
}
],
"source": [
"print(a[3])"
]
},
{
"cell_type": "markdown",
"id": "0cf4db5b-a70d-464e-a46e-6cccaf055401",
"metadata": {},
"source": [
"We get an error because we are trying to reference and element that is outside of the defined range. \n",
"Tuple a contains three things (2,3,4), but you reference them through a[0], a[1], a[2]. The valid indices are 0, 1, and 2. Not 3.
\n",
"Let's look at another feature of python. Here is a new list."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "c8535f5b-1699-484a-87ad-5e3908516d1f",
"metadata": {},
"outputs": [],
"source": [
"a = ['Lions', 'Tigers', 'Bears']"
]
},
{
"cell_type": "markdown",
"id": "97fef4eb-af53-4130-9a9b-1b5c1d4451ec",
"metadata": {},
"source": [
"Now, let's set list b equal to a and verify that the command worked."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "c386c97c-924a-4ae8-8bfa-003afec65a3c",
"metadata": {},
"outputs": [],
"source": [
"b = a"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "011d3d8b-c2bf-42b1-82fb-f5d80527fb4a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Lions', 'Tigers', 'Bears'] ['Lions', 'Tigers', 'Bears']\n"
]
}
],
"source": [
"print(a,b)"
]
},
{
"cell_type": "markdown",
"id": "f57d0db0-e2f7-48ed-ad05-876f2f4bcd9c",
"metadata": {},
"source": [
"Great. Everything looks good. Now, let's change the second element (index 1) of list a and print out our lists again."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "aab18003-d4d8-4d84-bfe1-2c0b6c61d47c",
"metadata": {},
"outputs": [],
"source": [
"a[1] = 'Bananas'"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "e56e4bbb-a246-49c7-9a96-73d34d3b2e09",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Lions', 'Bananas', 'Bears'] ['Lions', 'Bananas', 'Bears']\n"
]
}
],
"source": [
"print(a,b)"
]
},
{
"cell_type": "markdown",
"id": "bcba3fb0-1ee3-497e-930b-a0b40036e999",
"metadata": {},
"source": [
"What happened? Both list a and list b changed. This is because the statement b=a is what is called a \"soft copy.\" \n",
"This is often not desireable. What do we do? We make something called a \"hard copy.\""
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "ae9c1a94-992d-4d28-a823-8bfc85938f61",
"metadata": {},
"outputs": [],
"source": [
"c = a[:]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "4bc91c1e-eeca-421d-afa1-ab0a3d717be2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Lions', 'Bananas', 'Bears'] ['Lions', 'Bananas', 'Bears'] ['Lions', 'Bananas', 'Bears']\n"
]
}
],
"source": [
"print(a,b,c)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "a5057177-1304-4b98-998f-28ce37b94e71",
"metadata": {},
"outputs": [],
"source": [
"a[1] = 'Apples'"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "94751e9b-61ab-4032-a0e9-fa00761e3eff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Lions', 'Apples', 'Bears'] ['Lions', 'Apples', 'Bears'] ['Lions', 'Bananas', 'Bears']\n"
]
}
],
"source": [
"print(a,b,c)"
]
},
{
"cell_type": "markdown",
"id": "1669e228-741a-4d79-9855-5e416309b9b3",
"metadata": {},
"source": [
"c = a[:] is called a \"hard copy\" and notice when we change list a again, b changed, but c didn't. \n",
"The reason is that list c is a \"hard copy\" of list a and list b is a \"soft copy\" of list a.
\n",
"Ok, let's move on to something else."
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "87d64ff5-81e7-4de5-b34a-c1e8b4861d22",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "9ed5efa0-a737-4988-8b88-b555f31c66da",
"metadata": {},
"source": [
"These two lines import two packages from the python libraries. \n",
"Notice the use of np and plt as aliases to the numpy and matplotlib packages."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "691b0a46-aae4-4e72-b02d-0da764da3c12",
"metadata": {},
"outputs": [],
"source": [
"x = np.linspace(-2,2,200)"
]
},
{
"cell_type": "markdown",
"id": "964685d0-b6ce-4a85-94bf-e2af98e5d1d3",
"metadata": {},
"source": [
"The line above creates a list of numbers from -2 to 2 with 200 equally spaced points. \n",
"Let's print the list to understand it bettter."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "8e3c9482-2832-470e-b1aa-bd1609b294c6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-2. -1.9798995 -1.95979899 -1.93969849 -1.91959799 -1.89949749\n",
" -1.87939698 -1.85929648 -1.83919598 -1.81909548 -1.79899497 -1.77889447\n",
" -1.75879397 -1.73869347 -1.71859296 -1.69849246 -1.67839196 -1.65829146\n",
" -1.63819095 -1.61809045 -1.59798995 -1.57788945 -1.55778894 -1.53768844\n",
" -1.51758794 -1.49748744 -1.47738693 -1.45728643 -1.43718593 -1.41708543\n",
" -1.39698492 -1.37688442 -1.35678392 -1.33668342 -1.31658291 -1.29648241\n",
" -1.27638191 -1.25628141 -1.2361809 -1.2160804 -1.1959799 -1.1758794\n",
" -1.15577889 -1.13567839 -1.11557789 -1.09547739 -1.07537688 -1.05527638\n",
" -1.03517588 -1.01507538 -0.99497487 -0.97487437 -0.95477387 -0.93467337\n",
" -0.91457286 -0.89447236 -0.87437186 -0.85427136 -0.83417085 -0.81407035\n",
" -0.79396985 -0.77386935 -0.75376884 -0.73366834 -0.71356784 -0.69346734\n",
" -0.67336683 -0.65326633 -0.63316583 -0.61306533 -0.59296482 -0.57286432\n",
" -0.55276382 -0.53266332 -0.51256281 -0.49246231 -0.47236181 -0.45226131\n",
" -0.4321608 -0.4120603 -0.3919598 -0.3718593 -0.35175879 -0.33165829\n",
" -0.31155779 -0.29145729 -0.27135678 -0.25125628 -0.23115578 -0.21105528\n",
" -0.19095477 -0.17085427 -0.15075377 -0.13065327 -0.11055276 -0.09045226\n",
" -0.07035176 -0.05025126 -0.03015075 -0.01005025 0.01005025 0.03015075\n",
" 0.05025126 0.07035176 0.09045226 0.11055276 0.13065327 0.15075377\n",
" 0.17085427 0.19095477 0.21105528 0.23115578 0.25125628 0.27135678\n",
" 0.29145729 0.31155779 0.33165829 0.35175879 0.3718593 0.3919598\n",
" 0.4120603 0.4321608 0.45226131 0.47236181 0.49246231 0.51256281\n",
" 0.53266332 0.55276382 0.57286432 0.59296482 0.61306533 0.63316583\n",
" 0.65326633 0.67336683 0.69346734 0.71356784 0.73366834 0.75376884\n",
" 0.77386935 0.79396985 0.81407035 0.83417085 0.85427136 0.87437186\n",
" 0.89447236 0.91457286 0.93467337 0.95477387 0.97487437 0.99497487\n",
" 1.01507538 1.03517588 1.05527638 1.07537688 1.09547739 1.11557789\n",
" 1.13567839 1.15577889 1.1758794 1.1959799 1.2160804 1.2361809\n",
" 1.25628141 1.27638191 1.29648241 1.31658291 1.33668342 1.35678392\n",
" 1.37688442 1.39698492 1.41708543 1.43718593 1.45728643 1.47738693\n",
" 1.49748744 1.51758794 1.53768844 1.55778894 1.57788945 1.59798995\n",
" 1.61809045 1.63819095 1.65829146 1.67839196 1.69849246 1.71859296\n",
" 1.73869347 1.75879397 1.77889447 1.79899497 1.81909548 1.83919598\n",
" 1.85929648 1.87939698 1.89949749 1.91959799 1.93969849 1.95979899\n",
" 1.9798995 2. ]\n"
]
}
],
"source": [
"print(x)"
]
},
{
"cell_type": "markdown",
"id": "2b32245f-d3ce-4029-aa80-b9c101ca6c5b",
"metadata": {},
"source": [
"Now that we have the list, let's do something cool with it like make a plot."
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "5a5854ba-8ab1-4eaa-bfa4-6edb90434b22",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, '$y = x^2$')"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x,x**2, color=\"red\")\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.title(\"$y = x^2$\", fontdict={'size':22})"
]
},
{
"cell_type": "markdown",
"id": "c8147ffc-a749-472c-b652-7613795e8b72",
"metadata": {},
"source": [
"The code in the box above creates a plot of x^2, labels the x and y axis, and gives the plot a title. \n",
"Feel free to play around with this. Change the plot color, the size of the title, etc."
]
},
{
"cell_type": "markdown",
"id": "8e51f62e-29f4-484f-9839-fbe271185667",
"metadata": {},
"source": [
"In the next cells, I create a new list and print the list for verification. \n",
"This should look familiar."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "cb300c17-e088-4812-9eaf-1836e15a4ba5",
"metadata": {},
"outputs": [],
"source": [
"mylist = [91, 13, 5, 19, 9]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "a6cb54d9-7833-4859-a69b-dd59e50086e0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[91, 13, 5, 19, 9]\n"
]
}
],
"source": [
"print(mylist)"
]
},
{
"cell_type": "markdown",
"id": "ccdd803a-f234-40d6-8306-1b6448d61162",
"metadata": {},
"source": [
"Examine the following code. This is an example of a loop structure in python."
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "5184e1f5-bd6e-4677-81c3-ab2e5ba8107d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"91\n",
"13\n",
"5\n",
"19\n",
"9\n"
]
}
],
"source": [
"for item in mylist:\n",
" print(item)\n"
]
},
{
"cell_type": "markdown",
"id": "e8ef6df0-d09e-4349-a70d-091463973288",
"metadata": {},
"source": [
"What this does is go through each element in the list mylist, place that element of the list into \n",
"the variable item and then prints the variable. Notice that each element in the list is printed separately.
\n",
"We can take this another step with the following code. Look it over and make sure you understand it."
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "dc657c43-10ad-49e8-8637-278d63e1cd9a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"91 8281 753571\n",
"13 169 2197\n",
"5 25 125\n",
"19 361 6859\n",
"9 81 729\n"
]
}
],
"source": [
"for item in mylist:\n",
" print(item, item**2, item**3)\n",
" # I could also do more here. It doesn't need to be just one line."
]
},
{
"cell_type": "markdown",
"id": "c5d78c47-0e8a-4eeb-8610-c6d7e47cc83a",
"metadata": {},
"source": [
"Also note the use of an inline comment in python using the hashtag."
]
},
{
"cell_type": "markdown",
"id": "692e8bdb-0291-413d-9b10-acf8ff5ea395",
"metadata": {},
"source": [
"The following code uses the range function to create a list and prints out the items of the list. \n",
"Notice it only goes from 1 to 10. "
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "ce27a047-0d8d-47b5-a52d-6ee9b9bbabd2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n",
"10\n"
]
}
],
"source": [
"for i in range(1,11):\n",
" print(i)"
]
},
{
"cell_type": "markdown",
"id": "9c9ddf24-57d3-4731-98bc-9546bf85f28b",
"metadata": {},
"source": [
"See if you understand the output from the following code."
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "df60ff19-3a80-4e8c-8a9e-fc0be07a73d8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"1\n"
]
}
],
"source": [
"for i in range(4,8,2):\n",
" print(1)"
]
},
{
"cell_type": "markdown",
"id": "f20b4faf-7da9-4c8b-8804-4713f6deafdd",
"metadata": {},
"source": [
"Ok, I fooled you a bit there, but you should still understand the output. \n",
"The code below is what you were expecting and the output."
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "65dfa7b2-f4d6-4adc-848f-c8409836c165",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4\n",
"6\n"
]
}
],
"source": [
"for i in range(4,8,2):\n",
" print(i)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:prod] *",
"language": "python",
"name": "conda-env-prod-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}