diff --git a/07_sequences_00_lecture.ipynb b/07_sequences_00_lecture.ipynb
index e3887a4..fc97607 100644
--- a/07_sequences_00_lecture.ipynb
+++ b/07_sequences_00_lecture.ipynb
@@ -1,5 +1,53 @@
{
"cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "source": [
+ "A **video presentation** of the contents in this chapter is shown below. A playlist with *all* chapters as videos is linked [here](https://www.youtube.com/playlist?list=PL-2JV1G3J10lQ2xokyQowcRJI5jjNfW7f)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAUDBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChALCAgOCggIDRYNDhERExMTCAsWGBYSGBASExIBBQUFCAcIDwkJDxgVERUWFxcYExMYGBgVFRgWFRYWGBcVGxIaEhMXFRoYGBISFRcVFRUVFRUVFRUVGBUSFxIVFf/AABEIAWgB4AMBIgACEQEDEQH/xAAdAAEAAgIDAQEAAAAAAAAAAAAABgcFCAIDBAEJ/8QAURAAAQQBAgMBCQgRAgUEAgMAAQACAwQRBRIGEyExBxQYIjJBVZTVCBUXUVJhk9QjMzVCU1RxcnN0dYGSsbKz05G0FiQ2YrU0gqGiY3YlQ0X/xAAcAQEAAgMBAQEAAAAAAAAAAAAAAgQBAwUHBgj/xAA9EQABAwIDBQUGBAYBBQEAAAABAAIRAyEEEjEFQVFhcRMVU4GRBiIyocHwFjRysRQ1QlLR4fEjM0NigpL/2gAMAwEAAhEDEQA/ANMkREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREWzPgVcVfj/D/AK1qPs5PAq4q/H+H/WtR9nIi1mRbM+BVxV+P8P8ArWo+zk8Crir8f4f9a1H2ciLWZFsz4FXFX4/w/wCtaj7OTwKuKvx/h/1rUfZyItZkWzPgVcVfj/D/AK1qPs5PAq4q/H+H/WtR9nIi1mRbM+BVxV+P8P8ArWo+zk8Crir8f4f9a1H2ciLWZFsz4FXFX4/w/wCtaj7OTwKuKvx/h/1rUfZyItZkWzPgVcVfj/D/AK1qPs5PAq4q/H+H/WtR9nIi1mRbM+BVxV+P8P8ArWo+zk8Crir8f4f9a1H2ciLWZFsz4FXFX4/w/wCtaj7OTwKuKvx/h/1rUfZyItZkWzPgVcVfj/D/AK1qPs5PAq4q/H+H/WtR9nIi1mRbM+BVxV+P8P8ArWo+zk8Crir8f4f9a1H2ciLWZFsz4FXF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hodQ0EBkkco21dQ8qJ4e0HOodmWhZBgrB0X6DItAPDV4q9H8P+q6j7RTw1eKvR/D/quo+0VhZW/6LQDw1eKvR/D/AKrqPtFPDV4q9H8P+q6j7RRFv+i0A8NXir0fw/6rqPtFPDV4q9H8P+q6j7RRFv8AotAPDV4q9H8P+q6j7RTw1eKvR/D/AKrqPtFEW/6LQDw1eKvR/D/quo+0U8NXir0fw/6rqPtFEW/6LQDw1eKvR/D/AKrqPtFPDV4q9H8P+q6j7RRFv+i0A8NXir0fw/6rqPtFPDV4q9H8P+q6j7RRFv8AotAPDV4q9H8P+q6j7RTw1eKvR/D/AKrqPtFEW/6LQDw1eKvR/D/quo+0U8NXir0fw/6rqPtFEW/6LQDw1eKvR/D/AKrqPtFPDV4q9H8P+q6j7RRFv+i0A8NXir0fw/6rqPtFPDV4q9H8P+q6j7RRFv8AotAPDV4q9H8P+q6j7RTw1eKvR/D/AKrqPtFEW/6LQDw1eKvR/D/quo+0U8NXir0fw/6rqPtFEW/682q/aJ/0Mn9DloT4avFXo/h/1XUfaK4WPdo8UvY9hoaBh7XNOKuo5w4EHGdR7eqItaURERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/2Q==\n",
+ "text/html": [
+ "\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from IPython.display import YouTubeVideo\n",
+ "YouTubeVideo(\"nx2sCDoeC3I\", width=\"60%\")"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {
@@ -23,7 +71,7 @@
"\n",
"The `str` type is a bit of a corner case in this regard. While one could argue that a longer `str` object, for example, `\"text\"`, is composed of individual characters, this is *not* the case in memory as the literal `\"text\"` only creates *one* object (i.e., one \"bag\" of $0$s and $1$s modeling all characters).\n",
"\n",
- "This chapter, [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_lecture.ipynb), and [Chapter 9](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_arrays_00_lecture.ipynb) introduce various \"complex\" data types. While some are mutable and others are not, they all share that they are primarily used to \"manage,\" or structure, the memory in a program. Unsurprisingly, computer scientists refer to the ideas and theories behind these data types as **[data structures](https://en.wikipedia.org/wiki/Data_structure)**.\n",
+ "This chapter, [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mfr_00_lecture.ipynb), and [Chapter 9](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_mappings_00_lecture.ipynb) introduce various \"complex\" data types. While some are mutable and others are not, they all share that they are primarily used to \"manage,\" or structure, the memory in a program. Unsurprisingly, computer scientists refer to the ideas and theories behind these data types as **[data structures](https://en.wikipedia.org/wiki/Data_structure)**.\n",
"\n",
"In this chapter, we focus on data types that model all kinds of sequential data. Examples of such data are [spreadsheets](https://en.wikipedia.org/wiki/Spreadsheet) or [matrices](https://en.wikipedia.org/wiki/Matrix_%28mathematics%29)/[vectors](https://en.wikipedia.org/wiki/Vector_%28mathematics_and_physics%29). Such formats share the property that they are composed of smaller units that come in a sequence of, for example, rows/columns/cells or elements/entries."
]
@@ -47,16 +95,16 @@
}
},
"source": [
- "[Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_lecture.ipynb#A-\"String\"-of-Characters) already describes the *sequence* properties of `str` objects. Here, we take a step back and study these properties on their own before looking at bigger ideas.\n",
+ "[Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_lecture.ipynb#A-\"String\"-of-Characters) already describes the **sequence** properties of `str` objects. In this section, we take a step back and study these properties one by one.\n",
"\n",
- "The [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html) defines a variety of **abstract base classes** (ABCs). We saw ABCs already in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_lecture.ipynb#The-Numerical-Tower), where we use the ones from the [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) to classify Python's numeric data types according to mathematical ideas. Now, we take the ABCs from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module to classify the data types in this chapter and [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_lecture.ipynb) according to their behavior in various contexts.\n",
+ "The [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html) defines a variety of **abstract base classes** (ABCs). We saw ABCs already in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_lecture.ipynb#The-Numerical-Tower), where we use the ones from the [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) to classify Python's numeric data types according to mathematical ideas. Now, we take the ABCs from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module to classify the data types in this chapter according to their behavior in various contexts.\n",
"\n",
"As an illustration, consider `numbers` and `text` below, two objects of *different* types."
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -65,7 +113,7 @@
"outputs": [],
"source": [
"numbers = [7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]\n",
- "text = \"Lorem ipsum dolor sit amet, ...\""
+ "text = \"Lorem ipsum dolor sit amet.\""
]
},
{
@@ -81,7 +129,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 3,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -103,10 +151,10 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 4,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -114,7 +162,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "L o r e m i p s u m d o l o r s i t a m e t , . . . "
+ "L o r e m i p s u m d o l o r s i t a m e t . "
]
}
],
@@ -138,7 +186,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 5,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -151,7 +199,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 6,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -164,7 +212,7 @@
"collections.abc.Iterable"
]
},
- "execution_count": 5,
+ "execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@@ -181,14 +229,14 @@
}
},
"source": [
- "As in the context of *goose typing* in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_lecture.ipynb#Goose-Typing), we can use ABCs with the built-in [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) function to check if an object supports a behavior.\n",
+ "As seen in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_lecture.ipynb#Goose-Typing), we can use ABCs with the built-in [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) function to check if an object supports a behavior.\n",
"\n",
"So, let's \"ask\" Python if it can loop over `numbers` or `text`."
]
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 7,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -201,7 +249,7 @@
"True"
]
},
- "execution_count": 6,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@@ -212,10 +260,10 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 8,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -225,7 +273,7 @@
"True"
]
},
- "execution_count": 7,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
@@ -247,10 +295,10 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 9,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -260,7 +308,7 @@
"False"
]
},
- "execution_count": 8,
+ "execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
@@ -282,7 +330,7 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 10,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -296,7 +344,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mdigit\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;36m999\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdigit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mdigit\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;36m999\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdigit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: 'int' object is not iterable"
]
}
@@ -324,7 +372,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 11,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -337,48 +385,13 @@
"False"
]
},
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "0 in numbers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "\"l\" in text"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "Alternatively, we could also check if `numbers` and `text` are `Container` types with [isinstance()](https://docs.python.org/3/library/functions.html#isinstance)."
+ "0 in numbers"
]
},
{
@@ -402,7 +415,18 @@
}
],
"source": [
- "isinstance(numbers, abc.Container)"
+ "\"l\" in text"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "source": [
+ "Alternatively, we could also check if `numbers` and `text` are `Container` types with [isinstance()](https://docs.python.org/3/library/functions.html#isinstance)."
]
},
{
@@ -410,7 +434,7 @@
"execution_count": 13,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -425,6 +449,30 @@
"output_type": "execute_result"
}
],
+ "source": [
+ "isinstance(numbers, abc.Container)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"isinstance(text, abc.Container)"
]
@@ -442,10 +490,10 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 15,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -455,7 +503,7 @@
"False"
]
},
- "execution_count": 14,
+ "execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
@@ -466,7 +514,7 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 16,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -480,7 +528,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m9\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;36m999\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m9\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;36m999\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: argument of type 'int' is not iterable"
]
}
@@ -502,7 +550,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 17,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -515,37 +563,13 @@
"12"
]
},
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "len(numbers)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "31"
- ]
- },
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "len(text)"
+ "len(numbers)"
]
},
{
@@ -560,7 +584,7 @@
{
"data": {
"text/plain": [
- "True"
+ "27"
]
},
"execution_count": 18,
@@ -569,7 +593,7 @@
}
],
"source": [
- "isinstance(numbers, abc.Sized)"
+ "len(text)"
]
},
{
@@ -577,7 +601,7 @@
"execution_count": 19,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -592,6 +616,30 @@
"output_type": "execute_result"
}
],
+ "source": [
+ "isinstance(numbers, abc.Sized)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"isinstance(text, abc.Sized)"
]
@@ -609,10 +657,10 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": 21,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -622,7 +670,7 @@
"False"
]
},
- "execution_count": 20,
+ "execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
@@ -633,7 +681,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 22,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -647,7 +695,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m999\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m999\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: object of type 'int' has no len()"
]
}
@@ -673,7 +721,7 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": 23,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -686,7 +734,7 @@
"True"
]
},
- "execution_count": 22,
+ "execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
@@ -697,10 +745,10 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": 24,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -710,7 +758,7 @@
"True"
]
},
- "execution_count": 23,
+ "execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
@@ -734,7 +782,7 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": 25,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -756,10 +804,10 @@
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": 26,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -767,7 +815,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- ". . . , t e m a t i s r o l o d m u s p i m e r o L "
+ ". t e m a t i s r o l o d m u s p i m e r o L "
]
}
],
@@ -778,7 +826,7 @@
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": 27,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -791,7 +839,7 @@
"True"
]
},
- "execution_count": 26,
+ "execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
@@ -802,10 +850,10 @@
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": 28,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -815,7 +863,7 @@
"True"
]
},
- "execution_count": 27,
+ "execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
@@ -837,7 +885,7 @@
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": 29,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -850,7 +898,7 @@
"True"
]
},
- "execution_count": 28,
+ "execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
@@ -861,10 +909,10 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": 30,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -874,7 +922,7 @@
"True"
]
},
- "execution_count": 29,
+ "execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
@@ -895,7 +943,7 @@
"\n",
"In Python-related documentations, the terms collection and sequence are heavily used, and the data science practitioner should always think of them in terms of the three or four behaviors they exhibit.\n",
"\n",
- "Data types that are collections but not sequences are covered in Chapter 8."
+ "Data types that are collections but not sequences are covered in [Chapter 9](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_mappings_00_lecture.ipynb)."
]
},
{
@@ -922,7 +970,7 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 31,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -935,10 +983,10 @@
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": 32,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
@@ -959,7 +1007,7 @@
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": 33,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -983,10 +1031,10 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 34,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -996,7 +1044,7 @@
"[[], 10, 20.0, 'Thirty', [40, 50]]"
]
},
- "execution_count": 33,
+ "execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
@@ -1018,20 +1066,20 @@
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 35,
"metadata": {
"slideshow": {
- "slide_type": "slide"
+ "slide_type": "skip"
}
},
"outputs": [
{
"data": {
"text/plain": [
- "140417317434464"
+ "139941444092304"
]
},
- "execution_count": 34,
+ "execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
@@ -1042,10 +1090,10 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 36,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -1055,7 +1103,7 @@
"list"
]
},
- "execution_count": 35,
+ "execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
@@ -1072,14 +1120,14 @@
}
},
"source": [
- "Alternatively, we use the [list()](https://docs.python.org/3/library/functions.html#func-list) built-in to create a `list` object out of an iterable we pass to it as the argument.\n",
+ "Alternatively, we use the built-in [list()](https://docs.python.org/3/library/functions.html#func-list) constructor to create a `list` object out of any (finite) *iterable* we pass to it as the argument.\n",
"\n",
"For example, we can wrap the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in with [list()](https://docs.python.org/3/library/functions.html#func-list): As described in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_lecture.ipynb#Containers-vs.-Iterables), `range` objects, like `range(1, 13)` below, are iterable and generate `int` objects \"on the fly\" (i.e., one by one). The [list()](https://docs.python.org/3/library/functions.html#func-list) around it acts like a `for`-loop and **materializes** twelve `int` objects in memory that then become the elements of the newly created `list` object. [PythonTutor](http://www.pythontutor.com/visualize.html#code=r%20%3D%20range%281,%2013%29%0Al%20%3D%20list%28range%281,%2013%29%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) shows this difference visually."
]
},
{
"cell_type": "code",
- "execution_count": 36,
+ "execution_count": 37,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -1092,37 +1140,13 @@
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]"
]
},
- "execution_count": 36,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "list(range(1, 13))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "isinstance(range(1, 13), abc.Iterable)"
+ "list(range(1, 13))"
]
},
{
@@ -1233,7 +1257,7 @@
" - supports being looped over\n",
" - works with the `for` or `while` statements\n",
"- `Reversible`:\n",
- " - the elements come in a *predictable* order that we may traverse in a forward or backward fashion\n",
+ " - the elements come in a *predictable* order that we may loop over in a forward or backward fashion\n",
" - works with the [reversed()](https://docs.python.org/3/library/functions.html#reversed) built-in\n",
"- `Sized`:\n",
" - the number of elements is finite *and* known in advance\n",
@@ -1291,7 +1315,7 @@
"execution_count": 41,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "slide"
}
},
"outputs": [
@@ -1299,17 +1323,17 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[] \t140417315676720 \t\n",
- "10 \t94860849595456 \t\n",
- "20.0 \t140417316476784 \t\n",
- "Thirty \t140417315739568 \t\n",
- "[40, 50] \t140417315720800 \t\n"
+ "[] 139941463482272 \n",
+ "10 94715524076608 \n",
+ "20.0 139941444613712 \n",
+ "Thirty 139941444470960 \n",
+ "[40, 50] 139941444068128 \n"
]
}
],
"source": [
"for element in nested:\n",
- " print(element, id(element), type(element), sep=\" \\t\")"
+ " print(str(element).ljust(10), str(id(element)).ljust(18), type(element))"
]
},
{
@@ -1317,7 +1341,7 @@
"execution_count": 42,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "slide"
}
},
"outputs": [
@@ -1409,7 +1433,7 @@
"execution_count": 45,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -1464,7 +1488,7 @@
{
"data": {
"text/plain": [
- "10"
+ "[]"
]
},
"execution_count": 46,
@@ -1473,7 +1497,7 @@
}
],
"source": [
- "nested[1]"
+ "nested[0]"
]
},
{
@@ -1492,7 +1516,7 @@
"execution_count": 47,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -1552,7 +1576,7 @@
"execution_count": 49,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -1635,7 +1659,7 @@
"execution_count": 51,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -1888,7 +1912,7 @@
"execution_count": 61,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -1949,7 +1973,7 @@
"execution_count": 63,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -1986,7 +2010,7 @@
"execution_count": 64,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -2017,7 +2041,7 @@
{
"data": {
"text/plain": [
- "140417315676720"
+ "139941463482272"
]
},
"execution_count": 65,
@@ -2041,7 +2065,7 @@
{
"data": {
"text/plain": [
- "140417315676720"
+ "139941463482272"
]
},
"execution_count": 66,
@@ -2053,30 +2077,6 @@
"id(nested_copy[0])"
]
},
- {
- "cell_type": "code",
- "execution_count": 67,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "140417315676720"
- ]
- },
- "execution_count": 67,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "id(empty)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -2096,7 +2096,7 @@
},
{
"cell_type": "code",
- "execution_count": 68,
+ "execution_count": 67,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -2109,7 +2109,7 @@
},
{
"cell_type": "code",
- "execution_count": 69,
+ "execution_count": 68,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -2122,7 +2122,7 @@
},
{
"cell_type": "code",
- "execution_count": 70,
+ "execution_count": 69,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -2135,7 +2135,7 @@
"True"
]
},
- "execution_count": 70,
+ "execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
@@ -2157,7 +2157,7 @@
},
{
"cell_type": "code",
- "execution_count": 71,
+ "execution_count": 70,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -2170,7 +2170,7 @@
"False"
]
},
- "execution_count": 71,
+ "execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
@@ -2179,6 +2179,30 @@
"nested[0] is nested_deep_copy[0]"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "139941463482272"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "id(nested[0])"
+ ]
+ },
{
"cell_type": "code",
"execution_count": 72,
@@ -2191,7 +2215,7 @@
{
"data": {
"text/plain": [
- "140417315676720"
+ "139941444435792"
]
},
"execution_count": 72,
@@ -2199,30 +2223,6 @@
"output_type": "execute_result"
}
],
- "source": [
- "id(nested[0])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 73,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "140417376809600"
- ]
- },
- "execution_count": 73,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
"source": [
"id(nested_deep_copy[0])"
]
@@ -2262,7 +2262,7 @@
},
{
"cell_type": "code",
- "execution_count": 74,
+ "execution_count": 73,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -2275,10 +2275,10 @@
},
{
"cell_type": "code",
- "execution_count": 75,
+ "execution_count": 74,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2288,7 +2288,7 @@
"[0, 10, 20.0, 'Thirty', [40, 50]]"
]
},
- "execution_count": 75,
+ "execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
@@ -2310,7 +2310,7 @@
},
{
"cell_type": "code",
- "execution_count": 76,
+ "execution_count": 75,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -2318,15 +2318,15 @@
},
"outputs": [],
"source": [
- "nested[:4] = [100, 100, 100] # assign three elements where there were four before"
+ "nested[:4] = [100, 100, 100]"
]
},
{
"cell_type": "code",
- "execution_count": 77,
+ "execution_count": 76,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2336,7 +2336,7 @@
"[100, 100, 100, [40, 50]]"
]
},
- "execution_count": 77,
+ "execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
@@ -2347,10 +2347,10 @@
},
{
"cell_type": "code",
- "execution_count": 78,
+ "execution_count": 77,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2360,7 +2360,7 @@
"4"
]
},
- "execution_count": 78,
+ "execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
@@ -2382,7 +2382,7 @@
},
{
"cell_type": "code",
- "execution_count": 79,
+ "execution_count": 78,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -2392,10 +2392,10 @@
{
"data": {
"text/plain": [
- "140417317434464"
+ "139941444092304"
]
},
- "execution_count": 79,
+ "execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
@@ -2417,7 +2417,7 @@
},
{
"cell_type": "code",
- "execution_count": 80,
+ "execution_count": 79,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -2430,7 +2430,7 @@
"[[], 10, 20.0, 'Thirty', [40, 50]]"
]
},
- "execution_count": 80,
+ "execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
@@ -2452,10 +2452,10 @@
},
{
"cell_type": "code",
- "execution_count": 81,
+ "execution_count": 80,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
@@ -2465,10 +2465,10 @@
},
{
"cell_type": "code",
- "execution_count": 82,
+ "execution_count": 81,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2478,7 +2478,7 @@
"[[], 10, 20.0, 'Thirty', [1, 2, 3]]"
]
},
- "execution_count": 82,
+ "execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
@@ -2500,7 +2500,7 @@
},
{
"cell_type": "code",
- "execution_count": 83,
+ "execution_count": 82,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -2513,7 +2513,7 @@
"[100, 100, 100, [1, 2, 3]]"
]
},
- "execution_count": 83,
+ "execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
@@ -2537,7 +2537,7 @@
},
{
"cell_type": "code",
- "execution_count": 84,
+ "execution_count": 83,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -2550,10 +2550,10 @@
},
{
"cell_type": "code",
- "execution_count": 85,
+ "execution_count": 84,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2563,7 +2563,7 @@
"[100, 100, 100]"
]
},
- "execution_count": 85,
+ "execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
@@ -2585,7 +2585,7 @@
},
{
"cell_type": "code",
- "execution_count": 86,
+ "execution_count": 85,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -2598,10 +2598,10 @@
},
{
"cell_type": "code",
- "execution_count": 87,
+ "execution_count": 86,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2611,7 +2611,7 @@
"[]"
]
},
- "execution_count": 87,
+ "execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
@@ -2628,33 +2628,7 @@
}
},
"source": [
- "Mutability for sequences is formalized by the `MutableSequence` ABC in the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module.\n",
- "\n",
- "So, we can als \"ask\" Python if `nested` is mutable."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 88,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 88,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "isinstance(nested, abc.MutableSequence)"
+ "Mutability for sequences is formalized by the `MutableSequence` ABC in the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module."
]
},
{
@@ -2685,7 +2659,7 @@
},
{
"cell_type": "code",
- "execution_count": 89,
+ "execution_count": 87,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -2709,7 +2683,7 @@
},
{
"cell_type": "code",
- "execution_count": 90,
+ "execution_count": 88,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -2722,10 +2696,10 @@
},
{
"cell_type": "code",
- "execution_count": 91,
+ "execution_count": 89,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2735,7 +2709,7 @@
"['Carl', 'Peter', 'Eckardt']"
]
},
- "execution_count": 91,
+ "execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
@@ -2757,10 +2731,10 @@
},
{
"cell_type": "code",
- "execution_count": 92,
+ "execution_count": 90,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "slide"
}
},
"outputs": [],
@@ -2770,10 +2744,10 @@
},
{
"cell_type": "code",
- "execution_count": 93,
+ "execution_count": 91,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2783,7 +2757,7 @@
"['Carl', 'Peter', 'Eckardt', 'Karl', 'Oliver']"
]
},
- "execution_count": 93,
+ "execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
@@ -2805,10 +2779,10 @@
},
{
"cell_type": "code",
- "execution_count": 94,
+ "execution_count": 92,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "slide"
}
},
"outputs": [],
@@ -2816,12 +2790,82 @@
"names.insert(1, \"Berthold\")"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 93,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['Carl', 'Berthold', 'Peter', 'Eckardt', 'Karl', 'Oliver']"
+ ]
+ },
+ "execution_count": 93,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "source": [
+ "`list` objects may be sorted *in place* with the [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) method. That is different from the built-in [sorted()](https://docs.python.org/3/library/functions.html#sorted) function that takes any *finite* and *iterable* object and returns a *new* `list` object with the iterable's elements sorted!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['Berthold', 'Carl', 'Eckardt', 'Karl', 'Oliver', 'Peter']"
+ ]
+ },
+ "execution_count": 94,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sorted(names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "source": [
+ "As the previous code cell created a *new* `list` object, `names` is still unsorted."
+ ]
+ },
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2840,76 +2884,6 @@
"names"
]
},
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "`list` objects may be sorted *in place* with the [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) method. That is different from the built-in [sorted()](https://docs.python.org/3/library/functions.html#sorted) function that takes any *finite* and *iterable* object and returns a *new* `list` object with the iterable's elements sorted!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 96,
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['Berthold', 'Carl', 'Eckardt', 'Karl', 'Oliver', 'Peter']"
- ]
- },
- "execution_count": 96,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sorted(names)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "As the previous code cell created a *new* `list` object, `names` is still unsorted."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 97,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['Carl', 'Berthold', 'Peter', 'Eckardt', 'Karl', 'Oliver']"
- ]
- },
- "execution_count": 97,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "names"
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -2923,7 +2897,7 @@
},
{
"cell_type": "code",
- "execution_count": 98,
+ "execution_count": 96,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -2936,10 +2910,10 @@
},
{
"cell_type": "code",
- "execution_count": 99,
+ "execution_count": 97,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2949,7 +2923,7 @@
"['Berthold', 'Carl', 'Eckardt', 'Karl', 'Oliver', 'Peter']"
]
},
- "execution_count": 99,
+ "execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
@@ -2971,7 +2945,7 @@
},
{
"cell_type": "code",
- "execution_count": 100,
+ "execution_count": 98,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -2984,10 +2958,10 @@
},
{
"cell_type": "code",
- "execution_count": 101,
+ "execution_count": 99,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -2997,7 +2971,7 @@
"['Peter', 'Oliver', 'Karl', 'Eckardt', 'Carl', 'Berthold']"
]
},
- "execution_count": 101,
+ "execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
@@ -3025,7 +2999,7 @@
},
{
"cell_type": "code",
- "execution_count": 102,
+ "execution_count": 100,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -3051,10 +3025,10 @@
},
{
"cell_type": "code",
- "execution_count": 103,
+ "execution_count": 101,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3064,7 +3038,7 @@
"['Karl', 'Carl', 'Peter', 'Oliver', 'Eckardt', 'Berthold']"
]
},
- "execution_count": 103,
+ "execution_count": 101,
"metadata": {},
"output_type": "execute_result"
}
@@ -3086,10 +3060,10 @@
},
{
"cell_type": "code",
- "execution_count": 104,
+ "execution_count": 102,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "slide"
}
},
"outputs": [],
@@ -3099,10 +3073,10 @@
},
{
"cell_type": "code",
- "execution_count": 105,
+ "execution_count": 103,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3112,7 +3086,7 @@
"['Berthold', 'Eckardt', 'Oliver', 'Peter', 'Carl', 'Karl']"
]
},
- "execution_count": 105,
+ "execution_count": 103,
"metadata": {},
"output_type": "execute_result"
}
@@ -3134,7 +3108,7 @@
},
{
"cell_type": "code",
- "execution_count": 106,
+ "execution_count": 104,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -3147,10 +3121,10 @@
},
{
"cell_type": "code",
- "execution_count": 107,
+ "execution_count": 105,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3160,7 +3134,7 @@
"'Karl'"
]
},
- "execution_count": 107,
+ "execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
@@ -3171,10 +3145,10 @@
},
{
"cell_type": "code",
- "execution_count": 108,
+ "execution_count": 106,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3184,7 +3158,7 @@
"['Berthold', 'Eckardt', 'Oliver', 'Peter', 'Carl']"
]
},
- "execution_count": 108,
+ "execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
@@ -3208,7 +3182,7 @@
},
{
"cell_type": "code",
- "execution_count": 109,
+ "execution_count": 107,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -3221,10 +3195,10 @@
},
{
"cell_type": "code",
- "execution_count": 110,
+ "execution_count": 108,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3234,7 +3208,7 @@
"'Eckardt'"
]
},
- "execution_count": 110,
+ "execution_count": 108,
"metadata": {},
"output_type": "execute_result"
}
@@ -3245,10 +3219,10 @@
},
{
"cell_type": "code",
- "execution_count": 111,
+ "execution_count": 109,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3258,7 +3232,7 @@
"['Berthold', 'Oliver', 'Peter', 'Carl']"
]
},
- "execution_count": 111,
+ "execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
@@ -3280,7 +3254,7 @@
},
{
"cell_type": "code",
- "execution_count": 112,
+ "execution_count": 110,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -3293,10 +3267,10 @@
},
{
"cell_type": "code",
- "execution_count": 113,
+ "execution_count": 111,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3306,7 +3280,7 @@
"['Berthold', 'Oliver', 'Carl']"
]
},
- "execution_count": 113,
+ "execution_count": 111,
"metadata": {},
"output_type": "execute_result"
}
@@ -3328,7 +3302,7 @@
},
{
"cell_type": "code",
- "execution_count": 114,
+ "execution_count": 112,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -3342,7 +3316,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnames\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Peter\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnames\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Peter\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mValueError\u001b[0m: list.remove(x): x not in list"
]
}
@@ -3364,7 +3338,7 @@
},
{
"cell_type": "code",
- "execution_count": 115,
+ "execution_count": 113,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -3377,7 +3351,7 @@
"['Berthold', 'Oliver', 'Carl']"
]
},
- "execution_count": 115,
+ "execution_count": 113,
"metadata": {},
"output_type": "execute_result"
}
@@ -3388,10 +3362,10 @@
},
{
"cell_type": "code",
- "execution_count": 116,
+ "execution_count": 114,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3401,7 +3375,7 @@
"1"
]
},
- "execution_count": 116,
+ "execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
@@ -3412,10 +3386,10 @@
},
{
"cell_type": "code",
- "execution_count": 117,
+ "execution_count": 115,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3426,7 +3400,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnames\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Karl\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnames\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Karl\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mValueError\u001b[0m: 'Karl' is not in list"
]
}
@@ -3448,7 +3422,7 @@
},
{
"cell_type": "code",
- "execution_count": 118,
+ "execution_count": 116,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -3461,7 +3435,7 @@
"1"
]
},
- "execution_count": 118,
+ "execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
@@ -3472,7 +3446,7 @@
},
{
"cell_type": "code",
- "execution_count": 119,
+ "execution_count": 117,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -3485,7 +3459,7 @@
"0"
]
},
- "execution_count": 119,
+ "execution_count": 117,
"metadata": {},
"output_type": "execute_result"
}
@@ -3509,10 +3483,10 @@
},
{
"cell_type": "code",
- "execution_count": 120,
+ "execution_count": 118,
"metadata": {
"slideshow": {
- "slide_type": "slide"
+ "slide_type": "skip"
}
},
"outputs": [],
@@ -3522,10 +3496,10 @@
},
{
"cell_type": "code",
- "execution_count": 121,
+ "execution_count": 119,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -3535,7 +3509,7 @@
"['Berthold', 'Oliver', 'Carl']"
]
},
- "execution_count": 121,
+ "execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
@@ -3557,10 +3531,10 @@
},
{
"cell_type": "code",
- "execution_count": 122,
+ "execution_count": 120,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [],
@@ -3570,10 +3544,10 @@
},
{
"cell_type": "code",
- "execution_count": 123,
+ "execution_count": 121,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -3583,7 +3557,7 @@
"[]"
]
},
- "execution_count": 123,
+ "execution_count": 121,
"metadata": {},
"output_type": "execute_result"
}
@@ -3629,7 +3603,7 @@
},
{
"cell_type": "code",
- "execution_count": 124,
+ "execution_count": 122,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -3642,7 +3616,7 @@
"['Berthold', 'Oliver', 'Carl']"
]
},
- "execution_count": 124,
+ "execution_count": 122,
"metadata": {},
"output_type": "execute_result"
}
@@ -3653,23 +3627,10 @@
},
{
"cell_type": "code",
- "execution_count": 125,
+ "execution_count": 123,
"metadata": {
"slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [],
- "source": [
- "more_names = [\"Diedrich\", \"Yves\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 126,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3679,21 +3640,21 @@
"['Berthold', 'Oliver', 'Carl', 'Diedrich', 'Yves']"
]
},
- "execution_count": 126,
+ "execution_count": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "names + more_names"
+ "names + [\"Diedrich\", \"Yves\"]"
]
},
{
"cell_type": "code",
- "execution_count": 127,
+ "execution_count": 124,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3703,7 +3664,7 @@
"['Berthold', 'Oliver', 'Carl', 'Berthold', 'Oliver', 'Carl']"
]
},
- "execution_count": 127,
+ "execution_count": 124,
"metadata": {},
"output_type": "execute_result"
}
@@ -3712,30 +3673,6 @@
"2 * names"
]
},
- {
- "cell_type": "code",
- "execution_count": 128,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['Diedrich', 'Yves', 'Diedrich', 'Yves', 'Diedrich', 'Yves']"
- ]
- },
- "execution_count": 128,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "more_names * 3"
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -3751,7 +3688,7 @@
},
{
"cell_type": "code",
- "execution_count": 129,
+ "execution_count": 125,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -3764,7 +3701,7 @@
"['Achim', 'Berthold', 'Oliver', 'Carl', 'Xavier']"
]
},
- "execution_count": 129,
+ "execution_count": 125,
"metadata": {},
"output_type": "execute_result"
}
@@ -3786,7 +3723,7 @@
},
{
"cell_type": "code",
- "execution_count": 130,
+ "execution_count": 126,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -3799,7 +3736,7 @@
"['Achim', 'Berthold', 'Oliver', 'Carl', 'Xavier']"
]
},
- "execution_count": 130,
+ "execution_count": 126,
"metadata": {},
"output_type": "execute_result"
}
@@ -3834,7 +3771,7 @@
},
{
"cell_type": "code",
- "execution_count": 131,
+ "execution_count": 127,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -3847,7 +3784,7 @@
"['Berthold', 'Oliver', 'Carl']"
]
},
- "execution_count": 131,
+ "execution_count": 127,
"metadata": {},
"output_type": "execute_result"
}
@@ -3858,55 +3795,7 @@
},
{
"cell_type": "code",
- "execution_count": 132,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 132,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "names == [\"Berthold\", \"Oliver\", \"Carl\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 133,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 133,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "names != [\"Berthold\", \"Oliver\", \"Karl\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 134,
+ "execution_count": 128,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -3919,21 +3808,21 @@
"True"
]
},
- "execution_count": 134,
+ "execution_count": 128,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "names < [\"Berthold\", \"Oliver\", \"Karl\"]"
+ "names == [\"Berthold\", \"Oliver\", \"Carl\"]"
]
},
{
"cell_type": "code",
- "execution_count": 135,
+ "execution_count": 129,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3943,13 +3832,37 @@
"True"
]
},
- "execution_count": 135,
+ "execution_count": 129,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "[\"Achim\", \"Oliver\", \"Carl\"] < names"
+ "names != [\"Berthold\", \"Oliver\", \"Karl\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 130,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 130,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names < [\"Berthold\", \"Oliver\", \"Karl\"]"
]
},
{
@@ -3960,15 +3873,15 @@
}
},
"source": [
- "If two `list` objects have a different number of elements and all overlapping elements compare equal, the shorter `list` object is considered \"smaller.\" That rule is a common cause for *semantic* errors in a program."
+ "If two `list` objects have a different number of elements and all overlapping elements compare equal, the shorter `list` object is considered \"smaller.\""
]
},
{
"cell_type": "code",
- "execution_count": 136,
+ "execution_count": 131,
"metadata": {
"slideshow": {
- "slide_type": "skip"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -3978,37 +3891,13 @@
"True"
]
},
- "execution_count": 136,
+ "execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "[\"Berthold\", \"Oliver\"] < names"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 137,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 137,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "names < [\"Berthold\", \"Oliver\", \"Carl\", \"Xavier\"]"
+ "[\"Berthold\", \"Oliver\"] < names < [\"Berthold\", \"Oliver\", \"Carl\", \"Xavier\"]"
]
},
{
@@ -4037,7 +3926,7 @@
},
{
"cell_type": "code",
- "execution_count": 138,
+ "execution_count": 132,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -4050,10 +3939,10 @@
},
{
"cell_type": "code",
- "execution_count": 139,
+ "execution_count": 133,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
@@ -4074,12 +3963,12 @@
"source": [
"While this function is being executed, two variables, namely `letters` in the global scope and `arg` inside the function's local scope, reference the *same* `list` object in memory. Furthermore, the passed in `arg` is also the return value.\n",
"\n",
- "So, after the function call, `letters_with_xyz` and `letters` are **aliases** as well, referencing the *same* object."
+ "So, after the function call, `letters_with_xyz` and `letters` are **aliases** as well, referencing the *same* object. We can also visualize that with [PythonTutor](http://www.pythontutor.com/visualize.html#code=letters%20%3D%20%5B%22a%22,%20%22b%22,%20%22c%22%5D%0A%0Adef%20add_xyz%28arg%29%3A%0A%20%20%20%20arg.extend%28%5B%22x%22,%20%22y%22,%20%22z%22%5D%29%0A%20%20%20%20return%20arg%0A%0Aletters_with_xyz%20%3D%20add_xyz%28letters%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false)."
]
},
{
"cell_type": "code",
- "execution_count": 140,
+ "execution_count": 134,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -4092,10 +3981,10 @@
},
{
"cell_type": "code",
- "execution_count": 141,
+ "execution_count": 135,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4105,7 +3994,7 @@
"['a', 'b', 'c', 'x', 'y', 'z']"
]
},
- "execution_count": 141,
+ "execution_count": 135,
"metadata": {},
"output_type": "execute_result"
}
@@ -4116,10 +4005,10 @@
},
{
"cell_type": "code",
- "execution_count": 142,
+ "execution_count": 136,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4129,7 +4018,7 @@
"['a', 'b', 'c', 'x', 'y', 'z']"
]
},
- "execution_count": 142,
+ "execution_count": 136,
"metadata": {},
"output_type": "execute_result"
}
@@ -4148,14 +4037,14 @@
"source": [
"A better practice is to first create a copy of `arg` within the function that is then modified and returned. If we are sure that `arg` contains immutable elements only, we get away with a shallow copy. The downside of this approach is the higher amount of memory necessary.\n",
"\n",
- "The revised `add_xyz()` function below is more natural to reason about as it does *not* modify the passed in `arg` internally. This approach is following the **[functional programming](https://en.wikipedia.org/wiki/Functional_programming)** paradigm that is going through a \"renaissance\" currently. Two essential characteristics of functional programming are that a function *never* changes its inputs and *always* returns the same output given the same inputs.\n",
+ "The revised `add_xyz()` function below is more natural to reason about as it does *not* modify the passed in `arg` internally. [PythonTutor](http://www.pythontutor.com/visualize.html#code=letters%20%3D%20%5B%22a%22,%20%22b%22,%20%22c%22%5D%0A%0Adef%20add_xyz%28arg%29%3A%0A%20%20%20%20new_arg%20%3D%20arg%5B%3A%5D%0A%20%20%20%20new_arg.extend%28%5B%22x%22,%20%22y%22,%20%22z%22%5D%29%0A%20%20%20%20return%20new_arg%0A%0Aletters_with_xyz%20%3D%20add_xyz%28letters%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) shows that as well. This approach is following the **[functional programming](https://en.wikipedia.org/wiki/Functional_programming)** paradigm that is going through a \"renaissance\" currently. Two essential characteristics of functional programming are that a function *never* changes its inputs and *always* returns the same output given the same inputs.\n",
"\n",
"For a beginner, it is probably better to stick to this idea and not change any arguments as the original `add_xyz()` above. However, functions that modify and return the argument passed in are an important aspect of object-oriented programming, as explained in Chapter 10."
]
},
{
"cell_type": "code",
- "execution_count": 143,
+ "execution_count": 137,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -4168,24 +4057,24 @@
},
{
"cell_type": "code",
- "execution_count": 144,
+ "execution_count": 138,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
"source": [
"def add_xyz(arg):\n",
" \"\"\"Create a new list from an existing one.\"\"\"\n",
- " new_arg = arg[:] # a shallow copy is good enough here\n",
+ " new_arg = arg[:]\n",
" new_arg.extend([\"x\", \"y\", \"z\"])\n",
" return new_arg"
]
},
{
"cell_type": "code",
- "execution_count": 145,
+ "execution_count": 139,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -4198,11 +4087,11 @@
},
{
"cell_type": "code",
- "execution_count": 146,
+ "execution_count": 140,
"metadata": {
"scrolled": true,
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4212,7 +4101,7 @@
"['a', 'b', 'c', 'x', 'y', 'z']"
]
},
- "execution_count": 146,
+ "execution_count": 140,
"metadata": {},
"output_type": "execute_result"
}
@@ -4223,10 +4112,10 @@
},
{
"cell_type": "code",
- "execution_count": 147,
+ "execution_count": 141,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4236,7 +4125,7 @@
"['a', 'b', 'c']"
]
},
- "execution_count": 147,
+ "execution_count": 141,
"metadata": {},
"output_type": "execute_result"
}
@@ -4253,12 +4142,12 @@
}
},
"source": [
- "If we want to modify the argument passed in, it is best to return `None` and not `arg`, as does the final version of `add_xyz()` below. Then, the user of our function cannot accidentally create two aliases to the same object. That is also why the list methods above all return `None`."
+ "If we want to modify the argument passed in, it is best to return `None` and not `arg`, as does the final version of `add_xyz()` below. Then, the user of our function cannot accidentally create two aliases to the same object. That is also why the list methods above all return `None`. [PythonTutor](http://www.pythontutor.com/visualize.html#code=letters%20%3D%20%5B%22a%22,%20%22b%22,%20%22c%22%5D%0A%0Adef%20add_xyz%28arg%29%3A%0A%20%20%20%20arg.extend%28%5B%22x%22,%20%22y%22,%20%22z%22%5D%29%0A%20%20%20%20return%0A%0Aadd_xyz%28letters%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) shows how there is only *one* reference to `letters` after the function call."
]
},
{
"cell_type": "code",
- "execution_count": 148,
+ "execution_count": 142,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -4271,10 +4160,10 @@
},
{
"cell_type": "code",
- "execution_count": 149,
+ "execution_count": 143,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
@@ -4282,12 +4171,12 @@
"def add_xyz(arg):\n",
" \"\"\"Append letters to a list.\"\"\"\n",
" arg.extend([\"x\", \"y\", \"z\"])\n",
- " return # = None"
+ " return # None"
]
},
{
"cell_type": "code",
- "execution_count": 150,
+ "execution_count": 144,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -4300,10 +4189,10 @@
},
{
"cell_type": "code",
- "execution_count": 151,
+ "execution_count": 145,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4313,7 +4202,7 @@
"['a', 'b', 'c', 'x', 'y', 'z']"
]
},
- "execution_count": 151,
+ "execution_count": 145,
"metadata": {},
"output_type": "execute_result"
}
@@ -4335,7 +4224,7 @@
},
{
"cell_type": "code",
- "execution_count": 152,
+ "execution_count": 146,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -4348,7 +4237,7 @@
},
{
"cell_type": "code",
- "execution_count": 153,
+ "execution_count": 147,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -4361,7 +4250,7 @@
"['a', 'b', 'c', 'x', 'y', 'z', 'x', 'y', 'z']"
]
},
- "execution_count": 153,
+ "execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
@@ -4405,7 +4294,7 @@
},
{
"cell_type": "code",
- "execution_count": 154,
+ "execution_count": 148,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -4418,10 +4307,10 @@
},
{
"cell_type": "code",
- "execution_count": 155,
+ "execution_count": 149,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4431,7 +4320,7 @@
"(7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4)"
]
},
- "execution_count": 155,
+ "execution_count": 149,
"metadata": {},
"output_type": "execute_result"
}
@@ -4453,10 +4342,10 @@
},
{
"cell_type": "code",
- "execution_count": 156,
+ "execution_count": 150,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [],
@@ -4466,10 +4355,10 @@
},
{
"cell_type": "code",
- "execution_count": 157,
+ "execution_count": 151,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -4479,7 +4368,7 @@
"(7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4)"
]
},
- "execution_count": 157,
+ "execution_count": 151,
"metadata": {},
"output_type": "execute_result"
}
@@ -4499,6 +4388,150 @@
"As before, `numbers` is an object on its own."
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 152,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "139941463332656"
+ ]
+ },
+ "execution_count": 152,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "id(numbers)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 153,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tuple"
+ ]
+ },
+ "execution_count": 153,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(numbers)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "source": [
+ "While we could use empty parentheses `()` to create an empty `tuple` object ..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 154,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "empty_tuple = ()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 155,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "()"
+ ]
+ },
+ "execution_count": 155,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "empty_tuple"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 156,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tuple"
+ ]
+ },
+ "execution_count": 156,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(empty_tuple)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "source": [
+ "... we must use a *trailing comma* to create a `tuple` object holding one element. If we forget the comma, the parentheses are interpreted as the grouping operator and effectively useless!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 157,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "one_tuple = (1,) # we could ommit the parentheses but not the comma"
+ ]
+ },
{
"cell_type": "code",
"execution_count": 158,
@@ -4511,7 +4544,7 @@
{
"data": {
"text/plain": [
- "140417315626832"
+ "(1,)"
]
},
"execution_count": 158,
@@ -4520,7 +4553,7 @@
}
],
"source": [
- "id(numbers)"
+ "one_tuple"
]
},
{
@@ -4544,18 +4577,7 @@
}
],
"source": [
- "type(numbers)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "While we could use empty parentheses `()` to create an empty `tuple` object ..."
+ "type(one_tuple)"
]
},
{
@@ -4568,7 +4590,7 @@
},
"outputs": [],
"source": [
- "empty_tuple = ()"
+ "no_tuple = (1)"
]
},
{
@@ -4583,7 +4605,7 @@
{
"data": {
"text/plain": [
- "()"
+ "1"
]
},
"execution_count": 161,
@@ -4592,7 +4614,7 @@
}
],
"source": [
- "empty_tuple"
+ "no_tuple"
]
},
{
@@ -4603,139 +4625,6 @@
"slide_type": "skip"
}
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "tuple"
- ]
- },
- "execution_count": 162,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "type(empty_tuple)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "... we must use a *trailing comma* to create a `tuple` object holding one element. If we forget the comma, the parentheses are interpreted as the grouping operator and effectively useless!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 163,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "one_tuple = (1,) # we could ommit the parentheses but not the comma"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 164,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(1,)"
- ]
- },
- "execution_count": 164,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "one_tuple"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 165,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "tuple"
- ]
- },
- "execution_count": 165,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "type(one_tuple)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 166,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "no_tuple = (1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 167,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1"
- ]
- },
- "execution_count": 167,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "no_tuple"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 168,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
"outputs": [
{
"data": {
@@ -4743,7 +4632,7 @@
"int"
]
},
- "execution_count": 168,
+ "execution_count": 162,
"metadata": {},
"output_type": "execute_result"
}
@@ -4765,10 +4654,10 @@
},
{
"cell_type": "code",
- "execution_count": 169,
+ "execution_count": 163,
"metadata": {
"slideshow": {
- "slide_type": "skip"
+ "slide_type": "slide"
}
},
"outputs": [
@@ -4778,7 +4667,7 @@
"(1,)"
]
},
- "execution_count": 169,
+ "execution_count": 163,
"metadata": {},
"output_type": "execute_result"
}
@@ -4789,7 +4678,7 @@
},
{
"cell_type": "code",
- "execution_count": 170,
+ "execution_count": 164,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -4802,7 +4691,7 @@
"('i', 't', 'e', 'r', 'a', 'b', 'l', 'e')"
]
},
- "execution_count": 170,
+ "execution_count": 164,
"metadata": {},
"output_type": "execute_result"
}
@@ -4832,47 +4721,12 @@
"source": [
"Most operations involving `tuple` objects work in the same way as with `list` objects. The main difference is that `tuple` objects are *immutable*. So, if our program does not depend on mutability, we may and should use `tuple` and not `list` objects to model sequential data. That way, we avoid the pitfalls seen above.\n",
"\n",
- "`tuple` objects are *sequences* exhibiting the familiar *four* behaviors."
+ "`tuple` objects are *sequences* exhibiting the familiar *four* behaviors. So, `numbers` holds a *finite* number of elements ..."
]
},
{
"cell_type": "code",
- "execution_count": 171,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 171,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "isinstance(numbers, abc.Sequence)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- " So, `numbers` holds a *finite* number of elements ..."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 172,
+ "execution_count": 165,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -4885,7 +4739,7 @@
"12"
]
},
- "execution_count": 172,
+ "execution_count": 165,
"metadata": {},
"output_type": "execute_result"
}
@@ -4907,7 +4761,7 @@
},
{
"cell_type": "code",
- "execution_count": 173,
+ "execution_count": 166,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -4929,10 +4783,10 @@
},
{
"cell_type": "code",
- "execution_count": 174,
+ "execution_count": 167,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -4962,7 +4816,7 @@
},
{
"cell_type": "code",
- "execution_count": 175,
+ "execution_count": 168,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -4975,7 +4829,7 @@
"False"
]
},
- "execution_count": 175,
+ "execution_count": 168,
"metadata": {},
"output_type": "execute_result"
}
@@ -4986,31 +4840,7 @@
},
{
"cell_type": "code",
- "execution_count": 176,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 176,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "1 in numbers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 177,
+ "execution_count": 169,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5023,7 +4853,31 @@
"True"
]
},
- "execution_count": 177,
+ "execution_count": 169,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "1 in numbers"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 170,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
@@ -5045,7 +4899,7 @@
},
{
"cell_type": "code",
- "execution_count": 178,
+ "execution_count": 171,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -5058,7 +4912,7 @@
"7"
]
},
- "execution_count": 178,
+ "execution_count": 171,
"metadata": {},
"output_type": "execute_result"
}
@@ -5069,10 +4923,10 @@
},
{
"cell_type": "code",
- "execution_count": 179,
+ "execution_count": 172,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -5082,7 +4936,7 @@
"4"
]
},
- "execution_count": 179,
+ "execution_count": 172,
"metadata": {},
"output_type": "execute_result"
}
@@ -5093,10 +4947,10 @@
},
{
"cell_type": "code",
- "execution_count": 180,
+ "execution_count": 173,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5106,7 +4960,7 @@
"(2, 6, 9, 10, 1, 4)"
]
},
- "execution_count": 180,
+ "execution_count": 173,
"metadata": {},
"output_type": "execute_result"
}
@@ -5128,10 +4982,10 @@
},
{
"cell_type": "code",
- "execution_count": 181,
+ "execution_count": 174,
"metadata": {
"slideshow": {
- "slide_type": "slide"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5142,7 +4996,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnumbers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m99\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnumbers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m99\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
]
}
@@ -5159,49 +5013,12 @@
}
},
"source": [
- "We can verify the immutability with the `MutableSequence` ABC from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module: [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) returns `False`. So, a data type that is a `Sequence` may be mutable or not. If it is a `MutableSequence`, it is mutable. If it is *not* a `MutableSequence`, it is *immutable*. There is *no* `ImmutableSequence` ABC."
+ "The `+` and `*` operators work with `tuple` objects as well: They always create *new* `tuple` objects."
]
},
{
"cell_type": "code",
- "execution_count": 182,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "False"
- ]
- },
- "execution_count": 182,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "isinstance(numbers, abc.MutableSequence)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "The `+` and `*` operators work with `tuple` objects as well. However, we should *not* do that as the whole point of immutability is to *not* mutate an object.\n",
- "\n",
- "So, instead of writing something like below, we should use a `list` object and call its `append()` method."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 183,
+ "execution_count": 175,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5214,7 +5031,7 @@
"(7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4, 99)"
]
},
- "execution_count": 183,
+ "execution_count": 175,
"metadata": {},
"output_type": "execute_result"
}
@@ -5225,7 +5042,7 @@
},
{
"cell_type": "code",
- "execution_count": 184,
+ "execution_count": 176,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5238,7 +5055,7 @@
"(7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4, 7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4)"
]
},
- "execution_count": 184,
+ "execution_count": 176,
"metadata": {},
"output_type": "execute_result"
}
@@ -5260,7 +5077,7 @@
},
{
"cell_type": "code",
- "execution_count": 185,
+ "execution_count": 177,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5273,7 +5090,7 @@
"0"
]
},
- "execution_count": 185,
+ "execution_count": 177,
"metadata": {},
"output_type": "execute_result"
}
@@ -5284,7 +5101,7 @@
},
{
"cell_type": "code",
- "execution_count": 186,
+ "execution_count": 178,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5297,7 +5114,7 @@
"10"
]
},
- "execution_count": 186,
+ "execution_count": 178,
"metadata": {},
"output_type": "execute_result"
}
@@ -5319,7 +5136,7 @@
},
{
"cell_type": "code",
- "execution_count": 187,
+ "execution_count": 179,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5332,7 +5149,7 @@
"(7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4)"
]
},
- "execution_count": 187,
+ "execution_count": 179,
"metadata": {},
"output_type": "execute_result"
}
@@ -5343,7 +5160,7 @@
},
{
"cell_type": "code",
- "execution_count": 188,
+ "execution_count": 180,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5356,7 +5173,7 @@
"True"
]
},
- "execution_count": 188,
+ "execution_count": 180,
"metadata": {},
"output_type": "execute_result"
}
@@ -5367,7 +5184,7 @@
},
{
"cell_type": "code",
- "execution_count": 189,
+ "execution_count": 181,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5380,7 +5197,7 @@
"True"
]
},
- "execution_count": 189,
+ "execution_count": 181,
"metadata": {},
"output_type": "execute_result"
}
@@ -5391,7 +5208,7 @@
},
{
"cell_type": "code",
- "execution_count": 190,
+ "execution_count": 182,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5404,7 +5221,7 @@
"True"
]
},
- "execution_count": 190,
+ "execution_count": 182,
"metadata": {},
"output_type": "execute_result"
}
@@ -5413,30 +5230,6 @@
"numbers < (99, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4)"
]
},
- {
- "cell_type": "code",
- "execution_count": 191,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 191,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "(0, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4) < numbers"
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -5445,17 +5238,17 @@
}
},
"source": [
- "While `tuple` objects are immutable, this only relates to the references they hold. If a `tuple` object contains mutable objects, the entire nested structure is *not* immutable as a whole.\n",
+ "While `tuple` objects are immutable, this only relates to the references they hold. If a `tuple` object contains references to mutable objects, the entire nested structure is *not* immutable as a whole!\n",
"\n",
"Consider the following stylized example `not_immutable`: It contains *three* elements, `1`, `[2, ..., 11]`, and `12`, and the elements of the nested `list` object may be changed. While it is not practical to mix data types in a `tuple` object that is used as an \"immutable list,\" we want to make the point that the mere usage of the `tuple` type does *not* guarantee a nested object to be immutable as a whole."
]
},
{
"cell_type": "code",
- "execution_count": 192,
+ "execution_count": 183,
"metadata": {
"slideshow": {
- "slide_type": "slide"
+ "slide_type": "skip"
}
},
"outputs": [],
@@ -5465,10 +5258,10 @@
},
{
"cell_type": "code",
- "execution_count": 193,
+ "execution_count": 184,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -5478,7 +5271,7 @@
"(1, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 12)"
]
},
- "execution_count": 193,
+ "execution_count": 184,
"metadata": {},
"output_type": "execute_result"
}
@@ -5489,10 +5282,10 @@
},
{
"cell_type": "code",
- "execution_count": 194,
+ "execution_count": 185,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [],
@@ -5502,10 +5295,10 @@
},
{
"cell_type": "code",
- "execution_count": 195,
+ "execution_count": 186,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -5515,7 +5308,7 @@
"(1, [99, 99, 99], 12)"
]
},
- "execution_count": 195,
+ "execution_count": 186,
"metadata": {},
"output_type": "execute_result"
}
@@ -5550,7 +5343,7 @@
},
{
"cell_type": "code",
- "execution_count": 196,
+ "execution_count": 187,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -5563,7 +5356,7 @@
},
{
"cell_type": "code",
- "execution_count": 197,
+ "execution_count": 188,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -5576,7 +5369,7 @@
"7"
]
},
- "execution_count": 197,
+ "execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
@@ -5587,10 +5380,10 @@
},
{
"cell_type": "code",
- "execution_count": 198,
+ "execution_count": 189,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5600,7 +5393,7 @@
"11"
]
},
- "execution_count": 198,
+ "execution_count": 189,
"metadata": {},
"output_type": "execute_result"
}
@@ -5611,10 +5404,10 @@
},
{
"cell_type": "code",
- "execution_count": 199,
+ "execution_count": 190,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5624,7 +5417,7 @@
"8"
]
},
- "execution_count": 199,
+ "execution_count": 190,
"metadata": {},
"output_type": "execute_result"
}
@@ -5646,7 +5439,7 @@
},
{
"cell_type": "code",
- "execution_count": 200,
+ "execution_count": 191,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5660,7 +5453,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mn1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn9\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn11\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mn1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn9\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn11\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mValueError\u001b[0m: too many values to unpack (expected 11)"
]
}
@@ -5671,7 +5464,7 @@
},
{
"cell_type": "code",
- "execution_count": 201,
+ "execution_count": 192,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5685,7 +5478,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mn1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn9\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn11\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn12\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn13\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mn1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn9\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn11\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn12\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn13\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mValueError\u001b[0m: not enough values to unpack (expected 13, got 12)"
]
}
@@ -5709,7 +5502,7 @@
},
{
"cell_type": "code",
- "execution_count": 202,
+ "execution_count": 193,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -5722,10 +5515,10 @@
},
{
"cell_type": "code",
- "execution_count": 203,
+ "execution_count": 194,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5735,7 +5528,7 @@
"7"
]
},
- "execution_count": 203,
+ "execution_count": 194,
"metadata": {},
"output_type": "execute_result"
}
@@ -5746,10 +5539,10 @@
},
{
"cell_type": "code",
- "execution_count": 204,
+ "execution_count": 195,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5759,21 +5552,21 @@
"[11, 8, 5, 3, 12, 2, 6, 9, 10, 1]"
]
},
- "execution_count": 204,
+ "execution_count": 195,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "middle"
+ "middle # always a list!"
]
},
{
"cell_type": "code",
- "execution_count": 205,
+ "execution_count": 196,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -5783,79 +5576,7 @@
"4"
]
},
- "execution_count": 205,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "last"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "If we do not need the `middle` elements, we go with the underscore `_` convention and \"throw\" them away."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 206,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "first, *_, last = numbers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 207,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "7"
- ]
- },
- "execution_count": 207,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "first"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 208,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "4"
- ]
- },
- "execution_count": 208,
+ "execution_count": 196,
"metadata": {},
"output_type": "execute_result"
}
@@ -5879,10 +5600,10 @@
},
{
"cell_type": "code",
- "execution_count": 209,
+ "execution_count": 197,
"metadata": {
"slideshow": {
- "slide_type": "slide"
+ "slide_type": "skip"
}
},
"outputs": [],
@@ -5892,10 +5613,10 @@
},
{
"cell_type": "code",
- "execution_count": 210,
+ "execution_count": 198,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -5927,10 +5648,10 @@
},
{
"cell_type": "code",
- "execution_count": 211,
+ "execution_count": 199,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -5957,12 +5678,12 @@
}
},
"source": [
- "Unpacking also works for nested objects. Below, we wrap [zip()](https://docs.python.org/3/library/functions.html#zip) with the [enumerate()](https://docs.python.org/3/library/functions.html#enumerate) built-in to have an index variable `i` inside the `for`-loop. In each iteration, a `tuple` object consisting of `i` and another `tuple` object is created. The inner one then holds the `name` and `position`."
+ "Unpacking also works for nested objects. Below, we wrap [zip()](https://docs.python.org/3/library/functions.html#zip) with the [enumerate()](https://docs.python.org/3/library/functions.html#enumerate) built-in to have an index variable `number` inside the `for`-loop. In each iteration, a `tuple` object consisting of `number` and another `tuple` object is created. The inner one then holds the `name` and `position`."
]
},
{
"cell_type": "code",
- "execution_count": 212,
+ "execution_count": 200,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -5973,15 +5694,15 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "0 -> Berthold is a goalkeeper\n",
- "1 -> Oliver is a defender\n",
- "2 -> Carl is a midfielder\n"
+ "Berthold (jersey #1) is a goalkeeper\n",
+ "Oliver (jersey #2) is a defender\n",
+ "Carl (jersey #3) is a midfielder\n"
]
}
],
"source": [
- "for i, (name, position) in enumerate(zip(names, positions)):\n",
- " print(i, \"->\", name, \"is a\", position)"
+ "for number, (name, position) in enumerate(zip(names, positions), start=1):\n",
+ " print(f\"{name} (jersey #{number}) is a {position}\")"
]
},
{
@@ -6010,7 +5731,7 @@
},
{
"cell_type": "code",
- "execution_count": 213,
+ "execution_count": 201,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6035,7 +5756,7 @@
},
{
"cell_type": "code",
- "execution_count": 214,
+ "execution_count": 202,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -6045,31 +5766,57 @@
"source": [
"temp = a\n",
"a = b\n",
- "b = temp"
+ "b = temp\n",
+ "\n",
+ "del temp"
]
},
{
"cell_type": "code",
- "execution_count": 215,
+ "execution_count": 203,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
- "(1, 0)"
+ "1"
]
},
- "execution_count": 215,
+ "execution_count": 203,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "a, b"
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 204,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 204,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b"
]
},
{
@@ -6085,7 +5832,7 @@
},
{
"cell_type": "code",
- "execution_count": 216,
+ "execution_count": 205,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6093,16 +5840,15 @@
},
"outputs": [],
"source": [
- "a = 0\n",
- "b = 1"
+ "a, b = 0, 1"
]
},
{
"cell_type": "code",
- "execution_count": 217,
+ "execution_count": 206,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
@@ -6112,10 +5858,10 @@
},
{
"cell_type": "code",
- "execution_count": 218,
+ "execution_count": 207,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6125,7 +5871,7 @@
"(1, 0)"
]
},
- "execution_count": 218,
+ "execution_count": 207,
"metadata": {},
"output_type": "execute_result"
}
@@ -6138,11 +5884,11 @@
"cell_type": "markdown",
"metadata": {
"slideshow": {
- "slide_type": "skip"
+ "slide_type": "slide"
}
},
"source": [
- "#### Example: [Fibonacci Numbers](https://en.wikipedia.org/wiki/Fibonacci_number) (revisited)"
+ "##### Example: [Fibonacci Numbers](https://en.wikipedia.org/wiki/Fibonacci_number) (revisited)"
]
},
{
@@ -6153,28 +5899,15 @@
}
},
"source": [
- "Unpacking allows us to rewrite the iterative `fibonacci()` function from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_lecture.ipynb#\"Hard-at-first-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29) in a concise way, now also supporting *goose typing* with the [numbers](https://docs.python.org/3/library/numbers.html) module from the [standard library](https://docs.python.org/3/library/index.html)."
+ "Unpacking allows us to rewrite the iterative `fibonacci()` function from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_lecture.ipynb#\"Hard-at-first-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29) in a concise way."
]
},
{
"cell_type": "code",
- "execution_count": 219,
+ "execution_count": 208,
"metadata": {
"slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "import numbers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 220,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
+ "slide_type": "slide"
}
},
"outputs": [],
@@ -6187,21 +5920,7 @@
"\n",
" Returns:\n",
" ith_fibonacci (int)\n",
- "\n",
- " Raises:\n",
- " TypeError: if i is not an integer or not integer-like\n",
- " ValueError: if i is not positive\n",
" \"\"\"\n",
- " if not isinstance(i, numbers.Integral):\n",
- " if isinstance(i, numbers.Real):\n",
- " if i != int(i):\n",
- " raise TypeError(\"i is not an integer-like value; it has decimals\")\n",
- " i = int(i)\n",
- " else:\n",
- " raise TypeError(\"i must be an integer\")\n",
- " if i < 0:\n",
- " raise ValueError(\"i must be non-negative\")\n",
- "\n",
" a, b = 0, 1\n",
"\n",
" for _ in range(i - 1):\n",
@@ -6212,10 +5931,10 @@
},
{
"cell_type": "code",
- "execution_count": 221,
+ "execution_count": 209,
"metadata": {
"slideshow": {
- "slide_type": "skip"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6225,7 +5944,7 @@
"144"
]
},
- "execution_count": 221,
+ "execution_count": 209,
"metadata": {},
"output_type": "execute_result"
}
@@ -6234,67 +5953,6 @@
"fibonacci(12)"
]
},
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "Because of the *goose typing*, we may pass `float` objects to `fibonacci()` as long as they contain no decimals."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 222,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "144"
- ]
- },
- "execution_count": 222,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "fibonacci(12.0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 223,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "ename": "TypeError",
- "evalue": "i is not an integer-like value; it has decimals",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfibonacci\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12.3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;32m\u001b[0m in \u001b[0;36mfibonacci\u001b[0;34m(i)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"i is not an integer-like value; it has decimals\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mTypeError\u001b[0m: i is not an integer-like value; it has decimals"
- ]
- }
- ],
- "source": [
- "fibonacci(12.3)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -6323,7 +5981,7 @@
},
{
"cell_type": "code",
- "execution_count": 224,
+ "execution_count": 210,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6356,10 +6014,10 @@
},
{
"cell_type": "code",
- "execution_count": 225,
+ "execution_count": 211,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6369,7 +6027,7 @@
"42"
]
},
- "execution_count": 225,
+ "execution_count": 211,
"metadata": {},
"output_type": "execute_result"
}
@@ -6391,10 +6049,10 @@
},
{
"cell_type": "code",
- "execution_count": 226,
+ "execution_count": 212,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6404,7 +6062,7 @@
"100"
]
},
- "execution_count": 226,
+ "execution_count": 212,
"metadata": {},
"output_type": "execute_result"
}
@@ -6426,10 +6084,10 @@
},
{
"cell_type": "code",
- "execution_count": 227,
+ "execution_count": 213,
"metadata": {
"slideshow": {
- "slide_type": "slide"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -6440,8 +6098,8 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mproduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;32m\u001b[0m in \u001b[0;36mproduct\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mproduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\"\"\"Multiply all arguments.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mproduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36mproduct\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mproduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\"\"\"Multiply all arguments.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mIndexError\u001b[0m: tuple index out of range"
]
}
@@ -6463,7 +6121,7 @@
},
{
"cell_type": "code",
- "execution_count": 228,
+ "execution_count": 214,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6476,10 +6134,10 @@
},
{
"cell_type": "code",
- "execution_count": 229,
+ "execution_count": 215,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6489,13 +6147,13 @@
"[2, 5, 10]"
]
},
- "execution_count": 229,
+ "execution_count": 215,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "product(one_hundred)"
+ "product(one_hundred) # a semantic error!"
]
},
{
@@ -6511,7 +6169,7 @@
},
{
"cell_type": "code",
- "execution_count": 230,
+ "execution_count": 216,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -6524,7 +6182,7 @@
"100"
]
},
- "execution_count": 230,
+ "execution_count": 216,
"metadata": {},
"output_type": "execute_result"
}
@@ -6546,7 +6204,7 @@
},
{
"cell_type": "code",
- "execution_count": 231,
+ "execution_count": 217,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -6559,7 +6217,7 @@
"100"
]
},
- "execution_count": 231,
+ "execution_count": 217,
"metadata": {},
"output_type": "execute_result"
}
@@ -6578,14 +6236,12 @@
"source": [
"In the \"*Packing & Unpacking with Functions*\" [exercise](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_02_exercises.ipynb#Packing-&-Unpacking-with-Functions) at the end of this chapter, we look at `product()` in more detail.\n",
"\n",
- "While we needed to unpack `one_hundred` above to avoid the semantic error, unpacking an argument in a function call may also be a convenience in general.\n",
- "\n",
- "For example, to print the elements of `one_hundred` in one line, we need to use a `for` statement, until now. With unpacking, we get away *without* a loop."
+ "While we needed to unpack `one_hundred` above to avoid the semantic error, unpacking an argument in a function call may also be a convenience in general. For example, to print the elements of `one_hundred` in one line, we need to use a `for` statement, until now. With unpacking, we get away *without* a loop."
]
},
{
"cell_type": "code",
- "execution_count": 232,
+ "execution_count": 218,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -6606,7 +6262,7 @@
},
{
"cell_type": "code",
- "execution_count": 233,
+ "execution_count": 219,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -6628,7 +6284,7 @@
},
{
"cell_type": "code",
- "execution_count": 234,
+ "execution_count": 220,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -6677,7 +6333,7 @@
},
{
"cell_type": "code",
- "execution_count": 235,
+ "execution_count": 221,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6703,10 +6359,10 @@
},
{
"cell_type": "code",
- "execution_count": 236,
+ "execution_count": 222,
"metadata": {
"slideshow": {
- "slide_type": "fragment"
+ "slide_type": "slide"
}
},
"outputs": [],
@@ -6727,10 +6383,10 @@
},
{
"cell_type": "code",
- "execution_count": 237,
+ "execution_count": 223,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [],
@@ -6746,12 +6402,12 @@
}
},
"source": [
- "The `Point` object is a so-called **class**. That is what it means if an object is of type `type`. It can be used as a **factory** to create *new* `tuple`-like objects of type `Point`."
+ "The `Point` object is a so-called **class**. That is what it means if an object is of type `type`. It can be used as a **factory** to create *new* `tuple`-like objects of type `Point`. In a way, [namedtuple()](https://docs.python.org/3/library/collections.html#collections.namedtuple) gives us a way to create our own custom **constructors**."
]
},
{
"cell_type": "code",
- "execution_count": 238,
+ "execution_count": 224,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -6761,24 +6417,24 @@
{
"data": {
"text/plain": [
- "140416708056240"
+ "94715539542800"
]
},
- "execution_count": 238,
+ "execution_count": 224,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "id(Point) # classes are objects as well"
+ "id(Point)"
]
},
{
"cell_type": "code",
- "execution_count": 239,
+ "execution_count": 225,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6788,7 +6444,7 @@
"type"
]
},
- "execution_count": 239,
+ "execution_count": 225,
"metadata": {},
"output_type": "execute_result"
}
@@ -6810,10 +6466,10 @@
},
{
"cell_type": "code",
- "execution_count": 240,
+ "execution_count": 226,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6823,7 +6479,7 @@
"__main__.Point"
]
},
- "execution_count": 240,
+ "execution_count": 226,
"metadata": {},
"output_type": "execute_result"
}
@@ -6845,7 +6501,7 @@
},
{
"cell_type": "code",
- "execution_count": 241,
+ "execution_count": 227,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6869,10 +6525,10 @@
},
{
"cell_type": "code",
- "execution_count": 242,
+ "execution_count": 228,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6882,7 +6538,7 @@
"Point(x=4, y=2)"
]
},
- "execution_count": 242,
+ "execution_count": 228,
"metadata": {},
"output_type": "execute_result"
}
@@ -6904,7 +6560,7 @@
},
{
"cell_type": "code",
- "execution_count": 243,
+ "execution_count": 229,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -6914,10 +6570,10 @@
{
"data": {
"text/plain": [
- "140417315422528"
+ "139941443365056"
]
},
- "execution_count": 243,
+ "execution_count": 229,
"metadata": {},
"output_type": "execute_result"
}
@@ -6928,10 +6584,10 @@
},
{
"cell_type": "code",
- "execution_count": 244,
+ "execution_count": 230,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -6941,7 +6597,7 @@
"__main__.Point"
]
},
- "execution_count": 244,
+ "execution_count": 230,
"metadata": {},
"output_type": "execute_result"
}
@@ -6963,7 +6619,7 @@
},
{
"cell_type": "code",
- "execution_count": 245,
+ "execution_count": 231,
"metadata": {
"slideshow": {
"slide_type": "slide"
@@ -6976,7 +6632,7 @@
"4"
]
},
- "execution_count": 245,
+ "execution_count": 231,
"metadata": {},
"output_type": "execute_result"
}
@@ -6987,10 +6643,10 @@
},
{
"cell_type": "code",
- "execution_count": 246,
+ "execution_count": 232,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -7000,7 +6656,7 @@
"2"
]
},
- "execution_count": 246,
+ "execution_count": 232,
"metadata": {},
"output_type": "execute_result"
}
@@ -7022,7 +6678,7 @@
},
{
"cell_type": "code",
- "execution_count": 247,
+ "execution_count": 233,
"metadata": {
"slideshow": {
"slide_type": "skip"
@@ -7036,7 +6692,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcurrent_position\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcurrent_position\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m: 'Point' object has no attribute 'z'"
]
}
@@ -7055,41 +6711,17 @@
"source": [
"`current_position` continues to work like a `tuple` object! That is why we can use `namedtuple` as a replacement for `tuple`. The underlying implementations exhibit the *same* computational efficiencies and memory usages.\n",
"\n",
- "For example, we can index into or loop over `current_position` as it is still a sequence."
+ "For example, we can index into or loop over `current_position` as it is still a sequence with the familiar four properties."
]
},
{
"cell_type": "code",
- "execution_count": 248,
+ "execution_count": 234,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 248,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "isinstance(current_position, abc.Sequence)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 249,
- "metadata": {
- "slideshow": {
- "slide_type": "fragment"
- }
- },
"outputs": [
{
"data": {
@@ -7097,7 +6729,7 @@
"4"
]
},
- "execution_count": 249,
+ "execution_count": 234,
"metadata": {},
"output_type": "execute_result"
}
@@ -7108,10 +6740,10 @@
},
{
"cell_type": "code",
- "execution_count": 250,
+ "execution_count": 235,
"metadata": {
"slideshow": {
- "slide_type": "-"
+ "slide_type": "skip"
}
},
"outputs": [
@@ -7121,7 +6753,7 @@
"2"
]
},
- "execution_count": 250,
+ "execution_count": 235,
"metadata": {},
"output_type": "execute_result"
}
@@ -7132,7 +6764,7 @@
},
{
"cell_type": "code",
- "execution_count": 251,
+ "execution_count": 236,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -7155,10 +6787,10 @@
},
{
"cell_type": "code",
- "execution_count": 252,
+ "execution_count": 237,
"metadata": {
"slideshow": {
- "slide_type": "skip"
+ "slide_type": "fragment"
}
},
"outputs": [
@@ -7176,17 +6808,6 @@
" print(number)"
]
},
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "## The Map-Filter-Reduce Paradigm"
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -7195,216 +6816,12 @@
}
},
"source": [
- "Whenever we process sequential data, most tasks can be classified into one of the three categories **map**, **filter**, or **reduce**. This paradigm has caught attention in recent years as it enables **[parallel computing](https://en.wikipedia.org/wiki/Parallel_computing)**, and this gets important when dealing with big amounts of data.\n",
- "\n",
- "Let's look at a simple example."
+ "Because of that it has \"length.\""
]
},
{
"cell_type": "code",
- "execution_count": 253,
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "outputs": [],
- "source": [
- "numbers = [7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "### Mapping"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "**Mapping** refers to the idea of applying a transformation to every element in a sequence.\n",
- "\n",
- "For example, let's square each element in `numbers` and add `1` to it. In essence, we apply the transformation $y := x^2 + 1$ expressed as the `transform()` function below."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 254,
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "outputs": [],
- "source": [
- "def transform(element):\n",
- " \"\"\"Map elements to their squares plus 1.\"\"\"\n",
- " return (element ** 2) + 1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "With the syntax we know so far, we revert to a `for`-loop that iteratively appends the transformed elements to the initially empty `transformed_numbers` list."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 255,
- "metadata": {
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "transformed_numbers = []\n",
- "\n",
- "for old in numbers:\n",
- " new = transform(old)\n",
- " transformed_numbers.append(new)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 256,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[50, 122, 65, 26, 10, 145, 5, 37, 82, 101, 2, 17]"
- ]
- },
- "execution_count": 256,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "transformed_numbers"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "As this kind of data processing is so common, Python provides the [map()](https://docs.python.org/3/library/functions.html#map) built-in. In its simplest usage form, it takes two arguments: A transformation function that takes one positional argument and an iterable.\n",
- "\n",
- "We call [map()](https://docs.python.org/3/library/functions.html#map) with the `transform()` function and the `numbers` list as the arguments and store the result in the variable `transformer` to inspect it."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 257,
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "outputs": [],
- "source": [
- "transformer = map(transform, numbers)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "We might expect to get back a materialized sequence (i.e., all elements exist in memory), and a `list` object would feel the most natural because of the type of the `numbers` argument. However, `transformer` is an object of type `map`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 258,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "